@@ -27,28 +27,38 @@ final class PaymentGatewayStoreTests: XCTestCase {
2727 return storageManager. viewStorage
2828 }
2929
30+ /// Convenience: returns the number of stored payment gateways
31+ ///
32+ private var storedPaymentGatewaysCount : Int {
33+ return viewStorage. countObjects ( ofType: StoragePaymentGateway . self)
34+ }
35+
3036 /// Dummy Site ID
3137 ///
3238 private let sampleSiteID : Int64 = 123
3339
40+ /// Store
41+ ///
42+ private var store : PaymentGatewayStore !
43+
3444 override func setUp( ) {
3545 super. setUp ( )
3646 dispatcher = Dispatcher ( )
3747 storageManager = MockStorageManager ( )
3848 network = MockNetwork ( useResponseQueue: true )
49+ store = PaymentGatewayStore ( dispatcher: dispatcher, storageManager: storageManager, network: network)
3950 }
4051
4152 func test_synchronize_gateways_correctly_persists_payment_gateways( ) throws {
4253 // Given
43- let store = PaymentGatewayStore ( dispatcher: dispatcher, storageManager: storageManager, network: network)
4454 network. simulateResponse ( requestUrlSuffix: " payment_gateways " , filename: " payment-gateway-list " )
4555
4656 // When
4757 let result : Result < Void , Error > = waitFor { promise in
4858 let action = PaymentGatewayAction . synchronizePaymentGateways ( siteID: self . sampleSiteID) { result in
4959 promise ( result)
5060 }
51- store. onAction ( action)
61+ self . store. onAction ( action)
5262 }
5363
5464 // Then
@@ -61,7 +71,6 @@ final class PaymentGatewayStoreTests: XCTestCase {
6171
6272 func test_synchronize_gateways_correctly_deletes_stale_payment_gateways( ) throws {
6373 // Given
64- let store = PaymentGatewayStore ( dispatcher: dispatcher, storageManager: storageManager, network: network)
6574 network. simulateResponse ( requestUrlSuffix: " payment_gateways " , filename: " payment-gateway-list " )
6675 network. simulateResponse ( requestUrlSuffix: " payment_gateways " , filename: " payment-gateway-list-half " )
6776
@@ -73,7 +82,7 @@ final class PaymentGatewayStoreTests: XCTestCase {
7382 let secondSync = PaymentGatewayAction . synchronizePaymentGateways ( siteID: self . sampleSiteID) { result in
7483 promise ( result)
7584 }
76- store. onAction ( secondSync)
85+ self . store. onAction ( secondSync)
7786 }
7887
7988 // Then
@@ -83,4 +92,73 @@ final class PaymentGatewayStoreTests: XCTestCase {
8392 XCTAssertNil ( viewStorage. loadPaymentGateway ( siteID: sampleSiteID, gatewayID: " paypal " ) )
8493 XCTAssertNil ( viewStorage. loadPaymentGateway ( siteID: sampleSiteID, gatewayID: " cod " ) )
8594 }
95+
96+ func test_updatePaymentGateway_returns_network_error_on_failure( ) {
97+ // Given
98+ let samplePaymentGatewayID = " cod "
99+ let samplePaymentGateway = PaymentGateway . fake ( ) . copy ( siteID: sampleSiteID,
100+ gatewayID: samplePaymentGatewayID,
101+ title: " Failing gateway " ,
102+ enabled: false )
103+ storePaymentGateway ( samplePaymentGateway, for: sampleSiteID)
104+ assertEqual ( 1 , storedPaymentGatewaysCount)
105+
106+ let expectedError = NetworkError . unacceptableStatusCode ( statusCode: 500 )
107+ network. simulateError ( requestUrlSuffix: " payment_gateways/ \( samplePaymentGatewayID) " , error: expectedError)
108+
109+ // When
110+ let updatedPaymentGateway = samplePaymentGateway. copy ( title: " Cash on delivery " )
111+ let result : Result < Networking . PaymentGateway , Error > = waitFor { promise in
112+ let action = PaymentGatewayAction . updatePaymentGateway ( updatedPaymentGateway) { result in
113+ promise ( result)
114+ }
115+ self . store. onAction ( action)
116+ }
117+
118+ // Then
119+ XCTAssertEqual ( result. failure as? NetworkError , expectedError)
120+ assertEqual ( 1 , storedPaymentGatewaysCount)
121+ assertEqual ( " Failing gateway " , viewStorage. loadPaymentGateway ( siteID: sampleSiteID, gatewayID: samplePaymentGatewayID) ? . title)
122+ }
123+
124+ func test_updatePaymentGateway_updates_stored_paymentGateway_upon_success( ) throws {
125+ // Given
126+ let samplePaymentGatewayID = " cod "
127+ let samplePaymentGateway = PaymentGateway . fake ( ) . copy ( siteID: sampleSiteID,
128+ gatewayID: samplePaymentGatewayID,
129+ title: " Old title " ,
130+ enabled: false )
131+
132+ storePaymentGateway ( samplePaymentGateway, for: sampleSiteID)
133+ assertEqual ( 1 , storedPaymentGatewaysCount)
134+
135+ network. simulateResponse ( requestUrlSuffix: " payment_gateways/ \( samplePaymentGatewayID) " , filename: " payment-gateway-cod " )
136+
137+ // When
138+ let updatedPaymentGateway = samplePaymentGateway. copy ( enabled: true )
139+ let result : Result < Networking . PaymentGateway , Error > = waitFor { promise in
140+ let action : PaymentGatewayAction
141+ action = . updatePaymentGateway( updatedPaymentGateway) { result in
142+ promise ( result)
143+ }
144+ self . store. onAction ( action)
145+ }
146+
147+ // Then
148+ XCTAssertTrue ( result. isSuccess)
149+
150+ let storedPaymentGateway = try XCTUnwrap ( viewStorage. loadPaymentGateway ( siteID: sampleSiteID, gatewayID: samplePaymentGatewayID) )
151+ assertEqual ( " Cash on delivery " , storedPaymentGateway. title)
152+ XCTAssertTrue ( storedPaymentGateway. enabled)
153+ }
154+ }
155+
156+ private extension PaymentGatewayStoreTests {
157+ @discardableResult
158+ func storePaymentGateway( _ paymentGateway: Networking . PaymentGateway , for siteID: Int64 ) -> Storage . PaymentGateway {
159+ let storedPaymentGateway = viewStorage. insertNewObject ( ofType: PaymentGateway . self)
160+ storedPaymentGateway. update ( with: paymentGateway)
161+ storedPaymentGateway. siteID = siteID
162+ return storedPaymentGateway
163+ }
86164}
0 commit comments