Skip to content

Commit

Permalink
[Shipping labels] Add Yosemite support for address validation (#14934)
Browse files Browse the repository at this point in the history
  • Loading branch information
rachelmcr authored Jan 22, 2025
2 parents 5ba348b + c2109b9 commit 9d932c6
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 1 deletion.
17 changes: 17 additions & 0 deletions Fakes/Fakes/Networking.generated.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2761,6 +2761,23 @@ extension Networking.WooShippingAccountSettings {
)
}
}
extension Networking.WooShippingAddress {
/// Returns a "ready to use" type filled with fake values.
///
public static func fake() -> Networking.WooShippingAddress {
.init(
company: .fake(),
name: .fake(),
phone: .fake(),
country: .fake(),
state: .fake(),
address1: .fake(),
address2: .fake(),
city: .fake(),
postcode: .fake()
)
}
}
extension Networking.WooShippingCarrierPredefinedOptions {
/// Returns a "ready to use" type filled with fake values.
///
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import Codegen

/// Represents an address for the WooCommerce Shipping extension.
///
public struct WooShippingAddress: Equatable {
public struct WooShippingAddress: Equatable, GeneratedFakeable {
/// The name of the company at the address.
public let company: String

Expand Down
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 9d932c6

Please sign in to comment.