diff --git a/Yosemite/Yosemite/Actions/WooShippingAction.swift b/Yosemite/Yosemite/Actions/WooShippingAction.swift index 6338c2859fe..5325aa37820 100644 --- a/Yosemite/Yosemite/Actions/WooShippingAction.swift +++ b/Yosemite/Yosemite/Actions/WooShippingAction.swift @@ -38,4 +38,11 @@ public enum WooShippingAction: Action { pollingDelay: TimeInterval = 1.0, pollingMaximumRetries: Int64 = 3, completion: (Result) -> Void) + + /// Generates a shipping label document for printing. + /// + case printLabel(siteID: Int64, + labelIDs: [Int64], + paperSize: ShippingLabelPaperSize, + completion: (Result) -> Void) } diff --git a/Yosemite/Yosemite/Stores/WooShippingStore.swift b/Yosemite/Yosemite/Stores/WooShippingStore.swift index f3f360a9788..695af2f4077 100644 --- a/Yosemite/Yosemite/Stores/WooShippingStore.swift +++ b/Yosemite/Yosemite/Stores/WooShippingStore.swift @@ -61,6 +61,8 @@ public final class WooShippingStore: Store { pollingDelay: pollingDelay, pollingMaximumRetries: pollingMaximumRetries, completion: completion) + case let .printLabel(siteID, labelIDs, paperSize, completion): + printLabel(siteID: siteID, labelIDs: labelIDs, paperSize: paperSize, completion: completion) } } } @@ -146,6 +148,13 @@ private extension WooShippingStore { } } } + + func printLabel(siteID: Int64, + labelIDs: [Int64], + paperSize: ShippingLabelPaperSize, + completion: @escaping (Result) -> Void) { + remote.printLabel(siteID: siteID, labelIDs: labelIDs, paperSize: paperSize, completion: completion) + } } // MARK: Helpers diff --git a/Yosemite/YosemiteTests/Stores/WooShippingStoreTests.swift b/Yosemite/YosemiteTests/Stores/WooShippingStoreTests.swift index c1f3aa4a6f6..80e1a3ede8f 100644 --- a/Yosemite/YosemiteTests/Stores/WooShippingStoreTests.swift +++ b/Yosemite/YosemiteTests/Stores/WooShippingStoreTests.swift @@ -346,6 +346,56 @@ final class WooShippingStoreTests: XCTestCase { XCTAssertTrue(remote.purchaseShippingLabelCalled) XCTAssertGreaterThan(remote.checkLabelStatusCallsCount, 1) } + + func test_printLabel_returns_print_data_on_success() throws { + // Given + let expectedPrintData = ShippingLabelPrintData.fake() + let remote = MockWooShippingRemote() + remote.whenPrintLabel(siteID: sampleSiteID, thenReturn: .success(expectedPrintData)) + let store = WooShippingStore(dispatcher: dispatcher, storageManager: storageManager, network: network, remote: remote) + + // When + let printData: ShippingLabelPrintData = waitFor { promise in + let action = WooShippingAction.printLabel(siteID: self.sampleSiteID, + labelIDs: [123], + paperSize: .letter) { result in + guard let printData = try? result.get() else { + XCTFail("Error printing shipping label: \(String(describing: result.failure))") + return + } + promise(printData) + } + store.onAction(action) + } + + // Then + XCTAssertEqual(printData, expectedPrintData) + } + + func test_printLabel_returns_error_on_failure() throws { + // Given + let expectedError = NetworkError.timeout() + let remote = MockWooShippingRemote() + remote.whenPrintLabel(siteID: sampleSiteID, thenReturn: .failure(expectedError)) + let store = WooShippingStore(dispatcher: dispatcher, storageManager: storageManager, network: network, remote: remote) + + // When + let error: Error = waitFor { promise in + let action = WooShippingAction.printLabel(siteID: self.sampleSiteID, + labelIDs: [123], + paperSize: .letter) { result in + guard let printData = result.failure else { + XCTFail("Unexpected result when printing shipping label: \(result)") + return + } + promise(printData) + } + store.onAction(action) + } + + // Then + XCTAssertEqual(error as? NetworkError, expectedError) + } } private extension WooShippingStoreTests {