@@ -180,4 +180,89 @@ struct POSCatalogFullSyncServiceTests {
180180 #expect( await mockSyncRemote. loadProductsCallCount. value == 5 )
181181 #expect( await mockSyncRemote. loadProductVariationsCallCount. value == 5 )
182182 }
183+
184+ // MARK: - Catalog API Tests
185+
186+ @Test func startFullSync_with_catalog_API_downloads_and_persists_catalog( ) async throws {
187+ // Given
188+ let expectedProduct = POSProduct . fake ( ) . copy ( siteID: sampleSiteID, productID: 1 )
189+ let expectedVariation = POSProductVariation . fake ( ) . copy ( siteID: sampleSiteID, productID: 1 , productVariationID: 1 )
190+
191+ mockSyncRemote. catalogRequestResult = . success( . init( status: . complete, downloadURL: " https://example.com/catalog.json " ) )
192+ mockSyncRemote. catalogDownloadResult = . success( . init( products: [ expectedProduct] , variations: [ expectedVariation] ) )
193+
194+ let sut = POSCatalogFullSyncService (
195+ syncRemote: mockSyncRemote,
196+ batchSize: 2 ,
197+ persistenceService: mockPersistenceService,
198+ usesCatalogAPI: true
199+ )
200+
201+ // When
202+ let result = try await sut. startFullSync ( for: sampleSiteID)
203+
204+ // Then
205+ #expect( result. products. count == 1 )
206+ #expect( result. variations. count == 1 )
207+ #expect( mockPersistenceService. replaceAllCatalogDataCallCount == 1 )
208+ #expect( mockPersistenceService. replaceAllCatalogDataLastPersistedCatalog? . products. count == 1 )
209+ #expect( mockPersistenceService. replaceAllCatalogDataLastPersistedCatalog? . variations. count == 1 )
210+ }
211+
212+ @Test func startFullSync_with_catalog_API_propagates_catalog_request_error( ) async throws {
213+ // Given
214+ let expectedError = NSError ( domain: " catalog " , code: 500 , userInfo: [ NSLocalizedDescriptionKey: " Catalog request failed " ] )
215+ mockSyncRemote. catalogRequestResult = . failure( expectedError)
216+
217+ let sut = POSCatalogFullSyncService (
218+ syncRemote: mockSyncRemote,
219+ batchSize: 2 ,
220+ persistenceService: mockPersistenceService,
221+ usesCatalogAPI: true
222+ )
223+
224+ // When/Then
225+ await #expect( throws: expectedError) {
226+ _ = try await sut. startFullSync ( for: sampleSiteID)
227+ }
228+ }
229+
230+ @Test func startFullSync_with_catalog_API_propagates_catalog_download_error( ) async throws {
231+ // Given
232+ let expectedError = NSError ( domain: " catalog " , code: 404 , userInfo: [ NSLocalizedDescriptionKey: " Catalog download failed " ] )
233+ mockSyncRemote. catalogRequestResult = . success( . init( status: . complete, downloadURL: " https://example.com/catalog.json " ) )
234+ mockSyncRemote. catalogDownloadResult = . failure( expectedError)
235+
236+ let sut = POSCatalogFullSyncService (
237+ syncRemote: mockSyncRemote,
238+ batchSize: 2 ,
239+ persistenceService: mockPersistenceService,
240+ usesCatalogAPI: true
241+ )
242+
243+ // When/Then
244+ await #expect( throws: expectedError) {
245+ _ = try await sut. startFullSync ( for: sampleSiteID)
246+ }
247+ }
248+
249+ @Test func startFullSync_with_catalog_API_propagates_persistence_error( ) async throws {
250+ // Given
251+ let expectedError = NSError ( domain: " persistence " , code: 1000 , userInfo: [ NSLocalizedDescriptionKey: " Persistence failed " ] )
252+ mockSyncRemote. catalogRequestResult = . success( . init( status: . complete, downloadURL: " https://example.com/catalog.json " ) )
253+ mockSyncRemote. catalogDownloadResult = . success( . init( products: [ ] , variations: [ ] ) )
254+ mockPersistenceService. replaceAllCatalogDataError = expectedError
255+
256+ let sut = POSCatalogFullSyncService (
257+ syncRemote: mockSyncRemote,
258+ batchSize: 2 ,
259+ persistenceService: mockPersistenceService,
260+ usesCatalogAPI: true
261+ )
262+
263+ // When/Then
264+ await #expect( throws: expectedError) {
265+ _ = try await sut. startFullSync ( for: sampleSiteID)
266+ }
267+ }
183268}
0 commit comments