@@ -92,6 +92,103 @@ class OrderStatusStoreTests: XCTestCase {
9292 orderStatusStore. onAction ( action)
9393 wait ( for: [ expectation] , timeout: Constants . expectationTimeout)
9494 }
95+
96+ /// Verifies that OrderStatusAction.retrieveOrderStatuses effectively persists any retrieved statuses.
97+ ///
98+ func testRetrieveOrderStatusesEffectivelyPersistsRetrievedOrderStatuses( ) {
99+ let expectation = self . expectation ( description: " Retrieving order statii shall persist order statii " )
100+ let orderStatusStore = OrderStatusStore ( dispatcher: dispatcher, storageManager: storageManager, network: network)
101+
102+ network. simulateResponse ( requestUrlSuffix: " reports/orders/totals " , filename: " report-orders " )
103+ let action = OrderStatusAction . retrieveOrderStatuses ( siteID: sampleSiteID) { ( statuses, error) in
104+ XCTAssertNil ( error)
105+
106+ XCTAssertEqual ( self . viewStorage. countObjects ( ofType: Storage . OrderStatus. self) , 9 )
107+ let storageOrderStatuses = self . viewStorage. loadOrderStatuses ( siteID: self . sampleSiteID)
108+ XCTAssertNotNil ( storageOrderStatuses)
109+ let readOnlyList = storageOrderStatuses? . map ( { $0. toReadOnly ( ) } )
110+ XCTAssertEqual ( readOnlyList? . sorted ( ) , self . sampleOrderStatuses ( ) . sorted ( ) )
111+
112+ expectation. fulfill ( )
113+ }
114+
115+ orderStatusStore. onAction ( action)
116+ wait ( for: [ expectation] , timeout: Constants . expectationTimeout)
117+ }
118+
119+ /// Verifies that `upsertStoredStatusesInBackground` does not produce duplicate entries.
120+ ///
121+ func testUpdateRetrieveOrderStatusesEffectivelyUpdatesPreexistantOrderStatuses( ) {
122+ let orderStatusStore = OrderStatusStore ( dispatcher: dispatcher, storageManager: storageManager, network: network)
123+ XCTAssertEqual ( self . viewStorage. countObjects ( ofType: Storage . OrderStatus. self) , 0 )
124+
125+ let group = DispatchGroup ( )
126+
127+ group. enter ( )
128+ orderStatusStore. upsertStatusesInBackground ( siteID: sampleSiteID, readOnlyOrderStatuses: sampleOrderStatuses ( ) ) {
129+ XCTAssertTrue ( Thread . isMainThread)
130+ group. leave ( )
131+ }
132+
133+ group. enter ( )
134+ orderStatusStore. upsertStatusesInBackground ( siteID: sampleSiteID, readOnlyOrderStatuses: sampleOrderStatusesMutated ( ) ) {
135+ XCTAssertTrue ( Thread . isMainThread)
136+ group. leave ( )
137+ }
138+
139+ let expectation = self . expectation ( description: " Update existing stored order statii " )
140+ group. notify ( queue: . main) {
141+ let originalStatuses = self . sampleOrderStatuses ( )
142+ let expectedStatuses = self . sampleOrderStatusesMutated ( )
143+ let storageStatuses = self . viewStorage. loadOrderStatuses ( siteID: self . sampleSiteID)
144+ let readOnlyList = storageStatuses? . map ( { $0. toReadOnly ( ) } )
145+
146+ XCTAssertNotEqual ( readOnlyList, originalStatuses)
147+ XCTAssertEqual ( readOnlyList? . sorted ( ) , expectedStatuses. sorted ( ) )
148+ XCTAssertEqual ( self . viewStorage. countObjects ( ofType: Storage . OrderStatus. self) , expectedStatuses. count)
149+
150+ expectation. fulfill ( )
151+ }
152+
153+ wait ( for: [ expectation] , timeout: Constants . expectationTimeout)
154+ }
155+
156+ /// Verifies that `upsertStoredStatusesInBackground` removes deleted entities.
157+ ///
158+ func testUpdateRetrieveShipmentTrackingListEffectivelyRemovesDeletedShipmentTrackingData( ) {
159+ let orderStatusStore = OrderStatusStore ( dispatcher: dispatcher, storageManager: storageManager, network: network)
160+ XCTAssertEqual ( self . viewStorage. countObjects ( ofType: Storage . OrderStatus. self) , 0 )
161+
162+ let group = DispatchGroup ( )
163+
164+ group. enter ( )
165+ orderStatusStore. upsertStatusesInBackground ( siteID: sampleSiteID, readOnlyOrderStatuses: sampleOrderStatuses ( ) ) {
166+ XCTAssertTrue ( Thread . isMainThread)
167+ group. leave ( )
168+ }
169+
170+ group. enter ( )
171+ orderStatusStore. upsertStatusesInBackground ( siteID: sampleSiteID, readOnlyOrderStatuses: sampleOrderStatusesDeleted ( ) ) {
172+ XCTAssertTrue ( Thread . isMainThread)
173+ group. leave ( )
174+ }
175+
176+ let expectation = self . expectation ( description: " Delete existing stored order statii " )
177+ group. notify ( queue: . main) {
178+ let originalStatuses = self . sampleOrderStatuses ( )
179+ let expectedStatuses = self . sampleOrderStatusesDeleted ( )
180+ let storageStatuses = self . viewStorage. loadOrderStatuses ( siteID: self . sampleSiteID)
181+ let readOnlyList = storageStatuses? . map ( { $0. toReadOnly ( ) } )
182+
183+ XCTAssertNotEqual ( readOnlyList, originalStatuses)
184+ XCTAssertEqual ( readOnlyList? . sorted ( ) , expectedStatuses. sorted ( ) )
185+ XCTAssertEqual ( self . viewStorage. countObjects ( ofType: Storage . OrderStatus. self) , expectedStatuses. count)
186+
187+ expectation. fulfill ( )
188+ }
189+
190+ wait ( for: [ expectation] , timeout: Constants . expectationTimeout)
191+ }
95192}
96193
97194
@@ -115,13 +212,23 @@ private extension OrderStatusStoreTests {
115212
116213 func sampleOrderStatusesMutated( ) -> [ Networking . OrderStatus ] {
117214 return [
118- OrderStatus ( name: " Pending payment " , siteID: sampleSiteID, slug: " pending " , total: 1123 ) ,
119- OrderStatus ( name: " Processing " , siteID: sampleSiteID, slug: " processing " , total: 14 ) ,
120- OrderStatus ( name: " On hold " , siteID: sampleSiteID, slug: " on-hold " , total: 15 ) ,
121- OrderStatus ( name: " Completed " , siteID: sampleSiteID, slug: " completed " , total: 16 ) ,
122- OrderStatus ( name: " Refunded " , siteID: sampleSiteID, slug: " refunded " , total: 18 ) ,
123- OrderStatus ( name: " Failed " , siteID: sampleSiteID, slug: " failed " , total: 19 ) ,
124- OrderStatus ( name: " Pre ordered " , siteID: sampleSiteID, slug: " pre-ordered " , total: 11 )
215+ OrderStatus ( name: " Pending payment " , siteID: sampleSiteID, slug: " pending " , total: 123 ) ,
216+ OrderStatus ( name: " Processing " , siteID: sampleSiteID, slug: " processing " , total: 4 ) ,
217+ OrderStatus ( name: " On hold " , siteID: sampleSiteID, slug: " on-hold " , total: 5 ) ,
218+ OrderStatus ( name: " Test Status " , siteID: sampleSiteID, slug: " test-status " , total: 234 ) ,
219+ OrderStatus ( name: " Cancelled " , siteID: sampleSiteID, slug: " cancelled " , total: 7 ) ,
220+ OrderStatus ( name: " Refunded " , siteID: sampleSiteID, slug: " refunded " , total: 8 ) ,
221+ OrderStatus ( name: " Failed " , siteID: sampleSiteID, slug: " failed " , total: 9 ) ,
222+ OrderStatus ( name: " CIA Investigation " , siteID: sampleSiteID, slug: " cia-investigation " , total: 10 ) ,
223+ OrderStatus ( name: " Pre ordered " , siteID: sampleSiteID, slug: " pre-ordered " , total: 1 )
224+ ]
225+ }
226+
227+ func sampleOrderStatusesDeleted( ) -> [ Networking . OrderStatus ] {
228+ return [
229+ OrderStatus ( name: " Pending payment " , siteID: sampleSiteID, slug: " pending " , total: 123 ) ,
230+ OrderStatus ( name: " Processing " , siteID: sampleSiteID, slug: " processing " , total: 4 ) ,
231+ OrderStatus ( name: " Pre ordered " , siteID: sampleSiteID, slug: " pre-ordered " , total: 1 )
125232 ]
126233 }
127234}
0 commit comments