Skip to content

Commit f78d8a5

Browse files
committed
Added some persistence unit tests for OrderStatusStoreTests
1 parent f3c0093 commit f78d8a5

File tree

2 files changed

+117
-14
lines changed

2 files changed

+117
-14
lines changed

Yosemite/Yosemite/Stores/OrderStatusStore.swift

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,9 @@ private extension OrderStatusStore {
5252
return
5353
}
5454

55-
self?.upsertStoredStatusesInBackground(siteID: siteID,
56-
readOnlyOrderStatuses: orderStatuses,
57-
onCompletion: {
55+
self?.upsertStatusesInBackground(siteID: siteID, readOnlyOrderStatuses: orderStatuses) {
5856
onCompletion(orderStatuses, nil)
59-
})
57+
}
6058
}
6159
}
6260

@@ -80,9 +78,7 @@ extension OrderStatusStore {
8078
/// Updates (OR Inserts) the specified ReadOnly Order Status Entities
8179
/// *in a background thread*. onCompletion will be called on the main thread!
8280
///
83-
func upsertStoredStatusesInBackground(siteID: Int,
84-
readOnlyOrderStatuses: [Networking.OrderStatus],
85-
onCompletion: @escaping () -> Void) {
81+
func upsertStatusesInBackground(siteID: Int, readOnlyOrderStatuses: [Networking.OrderStatus], onCompletion: @escaping () -> Void) {
8682
let derivedStorage = sharedDerivedStorage
8783
derivedStorage.perform {
8884
for readOnlyItem in readOnlyOrderStatuses {

Yosemite/YosemiteTests/Stores/OrderStatusStoreTests.swift

Lines changed: 114 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)