Skip to content

Commit 5be9f8f

Browse files
committed
Rework CIAB eligibility checker and add tests
1 parent 4d97b8b commit 5be9f8f

File tree

6 files changed

+98
-15
lines changed

6 files changed

+98
-15
lines changed

Modules/Sources/Yosemite/Stores/OrderCardPresentPaymentEligibilityStore.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@ import protocol NetworkingCore.Network
55
/// Determines whether an order is eligible for card present payment or not
66
///
77
public final class OrderCardPresentPaymentEligibilityStore: Store {
8-
private let stores: () -> StoresManager
9-
private lazy var siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol = CIABEligibilityChecker(stores: stores())
8+
private let currentSite: () -> Site?
9+
private lazy var siteCIABEligibilityChecker: CIABEligibilityCheckerProtocol = CIABEligibilityChecker(
10+
currentSite: currentSite
11+
)
1012

1113
public init(
1214
dispatcher: Dispatcher,
1315
storageManager: StorageManagerType,
1416
network: Network,
15-
stores: @escaping () -> StoresManager
17+
currentSite: @escaping () -> Site?
1618
) {
17-
self.stores = stores
19+
self.currentSite = currentSite
1820
super.init(
1921
dispatcher: dispatcher,
2022
storageManager: storageManager,

Modules/Sources/Yosemite/Tools/CIAB/CIABEligibilityChecker.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
import Foundation
22

33
public final class CIABEligibilityChecker {
4-
public let stores: StoresManager
4+
public typealias ObtainSiteClosure = () -> Site?
55

6-
public init(stores: StoresManager) {
7-
self.stores = stores
6+
public let currentSite: ObtainSiteClosure
7+
8+
public init(currentSite: @escaping ObtainSiteClosure) {
9+
self.currentSite = currentSite
810
}
911
}
1012

1113
extension CIABEligibilityChecker: CIABEligibilityCheckerProtocol {
1214
public var isCurrentSiteCIAB: Bool {
13-
guard let currentSite = stores.sessionManager.defaultSite else {
15+
guard let currentSite = currentSite() else {
1416
return false
1517
}
1618
return isSiteCIAB(currentSite)

Modules/Tests/YosemiteTests/Stores/OrderCardPresentPaymentEligibilityStoreTests.swift

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,26 @@ final class OrderCardPresentPaymentEligibilityStoreTests: XCTestCase {
2727
///
2828
private var store: OrderCardPresentPaymentEligibilityStore!
2929

30+
private var currentSite: Site?
31+
3032
override func setUp() {
3133
super.setUp()
3234
dispatcher = Dispatcher()
3335
network = MockNetwork(useResponseQueue: true)
3436
storageManager = MockStorageManager()
35-
store = OrderCardPresentPaymentEligibilityStore(dispatcher: dispatcher, storageManager: storageManager, network: network)
37+
store = OrderCardPresentPaymentEligibilityStore(
38+
dispatcher: dispatcher,
39+
storageManager: storageManager,
40+
network: network,
41+
currentSite: { [weak self] in
42+
return self?.currentSite
43+
}
44+
)
45+
}
46+
47+
override func tearDown() {
48+
currentSite = nil
49+
super.tearDown()
3650
}
3751

3852
// Other behavioural tests are in Order_CardPresentPaymentTests
@@ -55,6 +69,14 @@ final class OrderCardPresentPaymentEligibilityStoreTests: XCTestCase {
5569
name: "Chocolate cake",
5670
productTypeKey: "simple")
5771

72+
let regularSite = Site.fake().copy(
73+
siteID: sampleSiteID,
74+
isGarden: false,
75+
gardenName: nil
76+
)
77+
self.currentSite = regularSite
78+
79+
storageManager.insertSampleSite(readOnlySite: regularSite)
5880
storageManager.insertSampleProduct(readOnlyProduct: nonSubscriptionProduct)
5981
storageManager.insertSampleOrder(readOnlyOrder: cppEligibleOrder)
6082

@@ -75,4 +97,54 @@ final class OrderCardPresentPaymentEligibilityStoreTests: XCTestCase {
7597
let eligibility = try XCTUnwrap(result.get())
7698
XCTAssertTrue(eligibility)
7799
}
100+
101+
func test_orderIsEligibleForCardPresentPayment_returns_failure_for_CIAB_sites() throws {
102+
// Given
103+
let orderItem = OrderItem.fake().copy(itemID: 1234,
104+
name: "Chocolate cake",
105+
productID: 678,
106+
quantity: 1.0)
107+
let cppEligibleOrder = Order.fake().copy(siteID: sampleSiteID,
108+
orderID: 111,
109+
status: .pending,
110+
currency: "USD",
111+
datePaid: nil,
112+
total: "5.00",
113+
paymentMethodID: "woocommerce_payments",
114+
items: [orderItem])
115+
let nonSubscriptionProduct = Product.fake().copy(siteID: sampleSiteID,
116+
productID: 678,
117+
name: "Chocolate cake",
118+
productTypeKey: "simple")
119+
120+
let ciabSite = Site.fake().copy(
121+
siteID: sampleSiteID,
122+
isGarden: true,
123+
gardenName: "commerce"
124+
)
125+
self.currentSite = ciabSite
126+
127+
storageManager.insertSampleSite(readOnlySite: ciabSite)
128+
storageManager.insertSampleProduct(readOnlyProduct: nonSubscriptionProduct)
129+
storageManager.insertSampleOrder(readOnlyOrder: cppEligibleOrder)
130+
131+
let configuration = CardPresentPaymentsConfiguration(country: .US)
132+
133+
// When
134+
let result = waitFor { promise in
135+
let action = OrderCardPresentPaymentEligibilityAction
136+
.orderIsEligibleForCardPresentPayment(orderID: 111,
137+
siteID: self.sampleSiteID,
138+
cardPresentPaymentsConfiguration: configuration) { result in
139+
promise(result)
140+
}
141+
self.store.onAction(action)
142+
}
143+
144+
// Then
145+
XCTAssertThrowsError(try result.get()) { error in
146+
XCTAssertEqual(error as? OrderCardPresentPaymentEligibilityStore.OrderIsEligibleForCardPresentPaymentError,
147+
.cardReaderPaymentOptionIsNotSupportedForCIABSites)
148+
}
149+
}
78150
}

WooCommerce/Classes/CIAB/CIABEligibilityChecker.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ import Yosemite
55

66
extension CIABEligibilityChecker {
77
convenience init() {
8-
self.init(stores: ServiceLocator.stores)
8+
self.init(
9+
currentSite: {
10+
return ServiceLocator.stores.sessionManager.defaultSite
11+
}
12+
)
913
}
1014
}

WooCommerce/Classes/Yosemite/AuthenticatedState.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class AuthenticatedState: StoresManagerState {
7575
MediaStore(dispatcher: dispatcher, storageManager: storageManager, network: network),
7676
NotificationStore(dispatcher: dispatcher, storageManager: storageManager, network: network),
7777
NotificationCountStore(dispatcher: dispatcher, storageManager: storageManager, fileStorage: PListFileStorage()),
78-
OrderCardPresentPaymentEligibilityStore(dispatcher: dispatcher, storageManager: storageManager, network: network, stores: { ServiceLocator.stores }),
78+
OrderCardPresentPaymentEligibilityStore(dispatcher: dispatcher, storageManager: storageManager, network: network, currentSite: { ServiceLocator.stores.sessionManager.defaultSite }),
7979
OrderNoteStore(dispatcher: dispatcher, storageManager: storageManager, network: network),
8080
OrderStore(dispatcher: dispatcher, storageManager: storageManager, network: network),
8181
OrderStatusStore(dispatcher: dispatcher, storageManager: storageManager, network: network),

WooCommerce/WooCommerceTests/ViewRelated/CIAB/CIABEligibilityCheckerTests.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,23 @@ import XCTest
33
@testable import Yosemite
44

55
class CIABEligibilityCheckerTests: XCTestCase {
6-
private var storesManager: MockStoresManager!
76
private var sessionManager: SessionManager!
87
private var checker: CIABEligibilityChecker!
98

109
override func setUp() {
1110
super.setUp()
1211
sessionManager = .makeForTesting()
13-
storesManager = MockStoresManager(sessionManager: sessionManager)
14-
checker = CIABEligibilityChecker(stores: storesManager)
12+
checker = CIABEligibilityChecker(
13+
currentSite: {
14+
return MockStoresManager(
15+
sessionManager: self.sessionManager
16+
).sessionManager.defaultSite
17+
}
18+
)
1519
}
1620

1721
override func tearDown() {
1822
checker = nil
19-
storesManager = nil
2023
sessionManager = nil
2124
super.tearDown()
2225
}

0 commit comments

Comments
 (0)