Skip to content

Commit

Permalink
Add WooShipping action and store method to validate address
Browse files Browse the repository at this point in the history
  • Loading branch information
rachelmcr committed Jan 21, 2025
1 parent f7df657 commit c2109b9
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Yosemite/Yosemite/Actions/WooShippingAction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,10 @@ public enum WooShippingAction: Action {
///
case loadOriginAddresses(siteID: Int64,
completion: (Result<[WooShippingOriginAddress], Error>) -> Void)

/// Validate a shipping address.
///
case validateAddress(siteID: Int64,
address: ShippingLabelAddress,
completion: (Result<WooShippingAddressValidationSuccess, Error>) -> Void)
}
2 changes: 2 additions & 0 deletions Yosemite/Yosemite/Model/Model.swift
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,8 @@ public typealias TopEarnerStats = Networking.TopEarnerStats
public typealias TopEarnerStatsItem = Networking.TopEarnerStatsItem
public typealias User = Networking.User
public typealias WooAPIVersion = Networking.WooAPIVersion
public typealias WooShippingAddressValidationSuccess = Networking.WooShippingAddressValidationSuccess
public typealias WooShippingAddressValidationError = Networking.WooShippingAddressValidationError
public typealias WooShippingCustomPackage = Networking.WooShippingCustomPackage
public typealias WooShippingSavedPredefinedPackage = Networking.WooShippingSavedPredefinedPackage
public typealias WooShippingPredefinedOption = Networking.WooShippingPredefinedOption
Expand Down
8 changes: 8 additions & 0 deletions Yosemite/Yosemite/Stores/WooShippingStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ public final class WooShippingStore: Store {
printLabel(siteID: siteID, labelIDs: labelIDs, paperSize: paperSize, completion: completion)
case .loadOriginAddresses(let siteID, let completion):
loadOriginAddresses(siteID: siteID, completion: completion)
case let .validateAddress(siteID, address, completion):
validateAddress(siteID: siteID, address: address, completion: completion)
}
}
}
Expand Down Expand Up @@ -250,6 +252,12 @@ private extension WooShippingStore {
}
}
}

func validateAddress(siteID: Int64,
address: ShippingLabelAddress,
completion: @escaping (Result<WooShippingAddressValidationSuccess, Error>) -> Void) {
remote.addressValidation(siteID: siteID, address: address, completion: completion)
}
}

// MARK: - Storage
Expand Down
46 changes: 46 additions & 0 deletions Yosemite/YosemiteTests/Stores/WooShippingStoreTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -604,6 +604,52 @@ final class WooShippingStoreTests: XCTestCase {
// Then
XCTAssertEqual(error as? NetworkError, expectedError)
}

// MARK: `validateAddress`

func test_validateAddress_returns_WooShippingAddressValidationSuccess_on_success() throws {
// Given
let remote = MockWooShippingRemote()
let expectedResult = WooShippingAddressValidationSuccess(normalizedAddress: WooShippingAddress.fake(),
originalAddress: WooShippingAddress.fake(),
isTrivialNormalization: true)
remote.whenAddressValidation(siteID: sampleSiteID, thenReturn: .success(expectedResult))
let store = WooShippingStore(dispatcher: dispatcher, storageManager: storageManager, network: network, remote: remote)

// When
let result: Result<WooShippingAddressValidationSuccess, Error> = waitFor { promise in
let action = WooShippingAction.validateAddress(siteID: self.sampleSiteID,
address: ShippingLabelAddress.fake()) { result in
promise(result)
}
store.onAction(action)
}

// Then
let validationSuccess = try XCTUnwrap(result.get())
XCTAssertEqual(validationSuccess, expectedResult)
}

func test_validateAddress_returns_error_on_failure() throws {
// Given
let remote = MockWooShippingRemote()
let expectedError = WooShippingAddressValidationError(addressError: "House number not found", generalError: nil, nameError: nil)
remote.whenAddressValidation(siteID: sampleSiteID, thenReturn: .failure(expectedError))
let store = WooShippingStore(dispatcher: dispatcher, storageManager: storageManager, network: network, remote: remote)

// When
let result: Result<WooShippingAddressValidationSuccess, Error> = waitFor { promise in
let action = WooShippingAction.validateAddress(siteID: self.sampleSiteID,
address: ShippingLabelAddress.fake()) { result in
promise(result)
}
store.onAction(action)
}

// Then
let error = try XCTUnwrap(result.failure)
XCTAssertEqual(error as? WooShippingAddressValidationError, expectedError)
}
}

private extension WooShippingStoreTests {
Expand Down

0 comments on commit c2109b9

Please sign in to comment.