|
| 1 | +import Combine |
1 | 2 | import XCTest |
2 | 3 | @testable import Yosemite |
3 | 4 | @testable import Networking |
@@ -46,7 +47,7 @@ final class OrderStoreTests: XCTestCase { |
46 | 47 | /// |
47 | 48 | private let defaultSearchKeyword = "gooooooooogol" |
48 | 49 |
|
49 | | - |
| 50 | + private var subscriptions: Set<AnyCancellable> = [] |
50 | 51 |
|
51 | 52 | // MARK: - Overridden Methods |
52 | 53 |
|
@@ -1118,6 +1119,122 @@ final class OrderStoreTests: XCTestCase { |
1118 | 1119 | XCTAssertTrue(result.isFailure) |
1119 | 1120 | XCTAssertEqual(self.viewStorage.countObjects(ofType: Storage.Order.self), 0) |
1120 | 1121 | } |
| 1122 | + |
| 1123 | + // MARK: - `observeInsertedOrders` |
| 1124 | + |
| 1125 | + func test_observeInsertedOrders_emits_inserted_order() throws { |
| 1126 | + // Given |
| 1127 | + let store = OrderStore(dispatcher: dispatcher, storageManager: storageManager, network: network) |
| 1128 | + let siteID: Int64 = 6688 |
| 1129 | + |
| 1130 | + // Ensures the assertions take place after the Core Data notifications are sent. |
| 1131 | + var viewContextChanged = false |
| 1132 | + NotificationCenter.default |
| 1133 | + .publisher(for: .NSManagedObjectContextObjectsDidChange, object: viewStorage) |
| 1134 | + .sink { _ in |
| 1135 | + viewContextChanged = true |
| 1136 | + }.store(in: &subscriptions) |
| 1137 | + |
| 1138 | + // When |
| 1139 | + let publisher: AnyPublisher<[Yosemite.Order], Never> = waitFor { promise in |
| 1140 | + let action = OrderAction.observeInsertedOrders(siteID: siteID) { publisher in |
| 1141 | + promise(publisher) |
| 1142 | + } |
| 1143 | + store.onAction(action) |
| 1144 | + } |
| 1145 | + var ordersSequence = [[Yosemite.Order]]() |
| 1146 | + publisher.sink { orders in |
| 1147 | + ordersSequence.append(orders) |
| 1148 | + }.store(in: &subscriptions) |
| 1149 | + |
| 1150 | + // Inserts an order on the same site. |
| 1151 | + let order = sampleOrder().copy(siteID: siteID, status: .autoDraft) |
| 1152 | + store.upsertStoredOrder(readOnlyOrder: order, in: viewStorage) |
| 1153 | + |
| 1154 | + waitUntil { |
| 1155 | + viewContextChanged == true |
| 1156 | + } |
| 1157 | + |
| 1158 | + // Then |
| 1159 | + XCTAssertEqual(ordersSequence.count, 1) |
| 1160 | + XCTAssertEqual(ordersSequence.first, [order]) |
| 1161 | + } |
| 1162 | + |
| 1163 | + func test_observeInsertedOrders_does_not_emit_values_after_inserting_orders_in_a_different_site() throws { |
| 1164 | + // Given |
| 1165 | + let store = OrderStore(dispatcher: dispatcher, storageManager: storageManager, network: network) |
| 1166 | + let siteID: Int64 = 6688 |
| 1167 | + let anotherSiteID: Int64 = 7799 |
| 1168 | + |
| 1169 | + // Ensures the assertions take place after the Core Data notifications are sent. |
| 1170 | + var viewContextChanged = false |
| 1171 | + NotificationCenter.default |
| 1172 | + .publisher(for: .NSManagedObjectContextObjectsDidChange, object: viewStorage) |
| 1173 | + .sink { _ in |
| 1174 | + viewContextChanged = true |
| 1175 | + }.store(in: &subscriptions) |
| 1176 | + |
| 1177 | + // When |
| 1178 | + let publisher: AnyPublisher<[Yosemite.Order], Never> = waitFor { promise in |
| 1179 | + let action = OrderAction.observeInsertedOrders(siteID: siteID) { publisher in |
| 1180 | + promise(publisher) |
| 1181 | + } |
| 1182 | + store.onAction(action) |
| 1183 | + } |
| 1184 | + var ordersSequence = [[Yosemite.Order]]() |
| 1185 | + publisher.sink { orders in |
| 1186 | + ordersSequence.append(orders) |
| 1187 | + }.store(in: &subscriptions) |
| 1188 | + |
| 1189 | + // Inserts an order on another site. |
| 1190 | + let order = sampleOrder().copy(siteID: anotherSiteID, status: .autoDraft) |
| 1191 | + store.upsertStoredOrder(readOnlyOrder: order, in: viewStorage) |
| 1192 | + |
| 1193 | + waitUntil { |
| 1194 | + viewContextChanged == true |
| 1195 | + } |
| 1196 | + |
| 1197 | + // Then |
| 1198 | + XCTAssertEqual(ordersSequence.count, 0) |
| 1199 | + } |
| 1200 | + |
| 1201 | + func test_observeInsertedOrders_does_not_emit_values_after_inserting_a_non_order_object() throws { |
| 1202 | + // Given |
| 1203 | + let store = OrderStore(dispatcher: dispatcher, storageManager: storageManager, network: network) |
| 1204 | + let siteID: Int64 = 6688 |
| 1205 | + |
| 1206 | + // Ensures the assertions take place after the Core Data notifications are sent. |
| 1207 | + var viewContextChanged = false |
| 1208 | + NotificationCenter.default |
| 1209 | + .publisher(for: .NSManagedObjectContextObjectsDidChange, object: viewStorage) |
| 1210 | + .sink { _ in |
| 1211 | + viewContextChanged = true |
| 1212 | + }.store(in: &subscriptions) |
| 1213 | + |
| 1214 | + // When |
| 1215 | + let publisher: AnyPublisher<[Yosemite.Order], Never> = waitFor { promise in |
| 1216 | + let action = OrderAction.observeInsertedOrders(siteID: siteID) { publisher in |
| 1217 | + promise(publisher) |
| 1218 | + } |
| 1219 | + store.onAction(action) |
| 1220 | + } |
| 1221 | + var ordersSequence = [[Yosemite.Order]]() |
| 1222 | + publisher.sink { orders in |
| 1223 | + ordersSequence.append(orders) |
| 1224 | + }.store(in: &subscriptions) |
| 1225 | + |
| 1226 | + // Inserts a product on the same site. |
| 1227 | + let product = Product.fake().copy(siteID: siteID) |
| 1228 | + let storageProduct = viewStorage.insertNewObject(ofType: Storage.Product.self) |
| 1229 | + storageProduct.update(with: product) |
| 1230 | + |
| 1231 | + waitUntil { |
| 1232 | + viewContextChanged == true |
| 1233 | + } |
| 1234 | + |
| 1235 | + // Then |
| 1236 | + XCTAssertEqual(ordersSequence.count, 0) |
| 1237 | + } |
1121 | 1238 | } |
1122 | 1239 |
|
1123 | 1240 |
|
|
0 commit comments