@@ -8,6 +8,10 @@ struct POSCatalogPersistenceServiceTests {
88 private let sut : POSCatalogPersistenceService
99 private let sampleSiteID : Int64 = 134
1010
11+ private var db : GRDBDatabaseConnection {
12+ grdbManager. databaseConnection
13+ }
14+
1115 init ( ) throws {
1216 self . grdbManager = try GRDBManager ( )
1317 self . sut = POSCatalogPersistenceService ( grdbManager: grdbManager)
@@ -32,7 +36,6 @@ struct POSCatalogPersistenceServiceTests {
3236 try await sut. replaceAllCatalogData ( catalog, siteID: sampleSiteID)
3337
3438 // Then
35- let db = grdbManager. databaseConnection
3639 try await db. read { db in
3740 let siteCount = try PersistedSite . fetchCount ( db)
3841 let productCount = try PersistedProduct . fetchCount ( db)
@@ -61,7 +64,6 @@ struct POSCatalogPersistenceServiceTests {
6164 try await sut. replaceAllCatalogData ( catalog, siteID: sampleSiteID)
6265
6366 // Then
64- let db = grdbManager. databaseConnection
6567 try await db. read { db in
6668 let imageCount = try PersistedProductImage . fetchCount ( db)
6769 let attributeCount = try PersistedProductAttribute . fetchCount ( db)
@@ -86,7 +88,6 @@ struct POSCatalogPersistenceServiceTests {
8688 try await sut. replaceAllCatalogData ( catalog, siteID: sampleSiteID)
8789
8890 // Then
89- let db = grdbManager. databaseConnection
9091 try await db. read { db in
9192 let imageCount = try PersistedProductVariationImage . fetchCount ( db)
9293 let attributeCount = try PersistedProductVariationAttribute . fetchCount ( db)
@@ -115,7 +116,6 @@ struct POSCatalogPersistenceServiceTests {
115116 try await sut. replaceAllCatalogData ( catalog, siteID: sampleSiteID)
116117
117118 // Then - should not fail and should handle duplicates
118- let db = grdbManager. databaseConnection
119119 try await db. read { db in
120120 let productCount = try PersistedProduct . fetchCount ( db)
121121 let imageCount = try PersistedProductImage . fetchCount ( db)
@@ -143,7 +143,6 @@ struct POSCatalogPersistenceServiceTests {
143143 try await sut. replaceAllCatalogData ( newCatalog, siteID: sampleSiteID)
144144
145145 // Then - should have only new data
146- let db = grdbManager. databaseConnection
147146 try await db. read { db in
148147 let productCount = try PersistedProduct . fetchCount ( db)
149148 let variationCount = try PersistedProductVariation . fetchCount ( db)
@@ -175,7 +174,6 @@ struct POSCatalogPersistenceServiceTests {
175174 try await sut. replaceAllCatalogData ( emptyCatalog, siteID: sampleSiteID)
176175
177176 // Then - all related data should be gone
178- let db = grdbManager. databaseConnection
179177 try await db. read { db in
180178 let productCount = try PersistedProduct . fetchCount ( db)
181179 let imageCount = try PersistedProductImage . fetchCount ( db)
@@ -208,7 +206,6 @@ struct POSCatalogPersistenceServiceTests {
208206 try await sut. replaceAllCatalogData ( catalogWithoutVariations, siteID: sampleSiteID)
209207
210208 // Then - variation and its related data should be gone
211- let db = grdbManager. databaseConnection
212209 try await db. read { db in
213210 let productCount = try PersistedProduct . fetchCount ( db)
214211 let variationCount = try PersistedProductVariation . fetchCount ( db)
@@ -236,7 +233,6 @@ struct POSCatalogPersistenceServiceTests {
236233 try await sut. persistIncrementalCatalogData ( catalog, siteID: sampleSiteID)
237234
238235 // Then
239- let db = grdbManager. databaseConnection
240236 try await db. read { db in
241237 let siteCount = try PersistedSite . fetchCount ( db)
242238 let productCount = try PersistedProduct . fetchCount ( db)
@@ -363,7 +359,6 @@ struct POSCatalogPersistenceServiceTests {
363359 try await sut. persistIncrementalCatalogData ( catalog, siteID: sampleSiteID)
364360
365361 // Then
366- let db = grdbManager. databaseConnection
367362 try await db. read { db in
368363 let siteCount = try PersistedSite . fetchCount ( db)
369364 let variationCount = try PersistedProductVariation . fetchCount ( db)
@@ -480,19 +475,152 @@ struct POSCatalogPersistenceServiceTests {
480475 #expect( variations [ 1 ] . id == 2 )
481476 }
482477 }
478+
479+ // MARK: - Site Management Tests
480+
481+ @Test func loadSite_returns_nil_when_site_does_not_exist( ) async throws {
482+ // When
483+ let result = try await sut. loadSite ( siteID: 999 )
484+
485+ // Then
486+ #expect( result == nil )
487+ }
488+
489+ @Test func loadSite_returns_site_when_site_exists( ) async throws {
490+ // Given
491+ let siteID : Int64 = 123
492+ let lastSyncDate = Date ( timeIntervalSince1970: 1000 )
493+ let site = POSSite ( siteID: siteID, lastIncrementalSyncDate: lastSyncDate)
494+ try await insertSite ( site)
495+
496+ // When
497+ let result = try await sut. loadSite ( siteID: siteID)
498+
499+ // Then
500+ let loadedSite = try #require( result)
501+ #expect( loadedSite. siteID == siteID)
502+ #expect( loadedSite. lastIncrementalSyncDate == lastSyncDate)
503+ }
504+
505+ @Test func loadSite_returns_site_with_nil_sync_date_when_no_sync_date_stored( ) async throws {
506+ // Given
507+ let siteID : Int64 = 456
508+ let site = POSSite ( siteID: siteID, lastIncrementalSyncDate: nil )
509+ try await insertSite ( site)
510+
511+ // When
512+ let result = try await sut. loadSite ( siteID: siteID)
513+
514+ // Then
515+ let loadedSite = try #require( result)
516+ #expect( loadedSite. siteID == siteID)
517+ #expect( loadedSite. lastIncrementalSyncDate == nil )
518+ }
519+
520+ @Test func updateSite_throws_error_when_site_does_not_exist( ) async throws {
521+ // Given
522+ let siteID : Int64 = 789
523+ let lastSyncDate = Date ( timeIntervalSince1970: 2000 )
524+ let site = POSSite ( siteID: siteID, lastIncrementalSyncDate: lastSyncDate)
525+
526+ // When/Then
527+ await #expect( throws: POSCatalogPersistenceError . siteNotFound ( siteID: siteID) ) {
528+ try await sut. updateSite ( site)
529+ }
530+
531+ // And verify no site was created
532+ try await db. read { db in
533+ let siteCount = try PersistedSite . fetchCount ( db)
534+ #expect( siteCount == 0 )
535+ }
536+ }
537+
538+ @Test func updateSite_updates_existing_site( ) async throws {
539+ // Given - create initial site
540+ let siteID : Int64 = 101112
541+ let initialSyncDate = Date ( timeIntervalSince1970: 1500 )
542+ let initialSite = POSSite ( siteID: siteID, lastIncrementalSyncDate: initialSyncDate)
543+ try await insertSite ( initialSite)
544+
545+ // When - update with new sync date
546+ let updatedSyncDate = Date ( timeIntervalSince1970: 3000 )
547+ let updatedSite = POSSite ( siteID: siteID, lastIncrementalSyncDate: updatedSyncDate)
548+ try await sut. updateSite ( updatedSite)
549+
550+ // Then
551+ try await db. read { db in
552+ let siteCount = try PersistedSite . fetchCount ( db)
553+ #expect( siteCount == 1 )
554+
555+ let persistedSite = try PersistedSite . fetchOne ( db)
556+ #expect( persistedSite? . id == siteID)
557+ #expect( persistedSite? . posLastIncrementalSyncDate == updatedSyncDate)
558+ }
559+ }
560+
561+ @Test func updateSite_can_set_sync_date_to_nil( ) async throws {
562+ // Given
563+ let siteID : Int64 = 131415
564+ let initialSyncDate = Date ( timeIntervalSince1970: 4000 )
565+ let initialSite = POSSite ( siteID: siteID, lastIncrementalSyncDate: initialSyncDate)
566+ try await insertSite ( initialSite)
567+
568+ // When
569+ let updatedSite = POSSite ( siteID: siteID, lastIncrementalSyncDate: nil )
570+ try await sut. updateSite ( updatedSite)
571+
572+ // Then
573+ try await db. read { db in
574+ let persistedSite = try PersistedSite . fetchOne ( db)
575+ #expect( persistedSite? . id == siteID)
576+ #expect( persistedSite? . posLastIncrementalSyncDate == nil )
577+ }
578+ }
579+
580+ @Test func loadSite_and_updateSite_work_together_for_multiple_sites( ) async throws {
581+ // Given
582+ let site1ID : Int64 = 100
583+ let site2ID : Int64 = 200
584+ let site1Date = Date ( timeIntervalSince1970: 1000 )
585+ let site2Date = Date ( timeIntervalSince1970: 2000 )
586+
587+ let site1 = POSSite ( siteID: site1ID, lastIncrementalSyncDate: site1Date)
588+ let site2 = POSSite ( siteID: site2ID, lastIncrementalSyncDate: site2Date)
589+
590+ // When
591+ try await insertSite ( site1)
592+ try await insertSite ( site2)
593+
594+ // Then
595+ let loadedSite1 = try await sut. loadSite ( siteID: site1ID)
596+ let loadedSite2 = try await sut. loadSite ( siteID: site2ID)
597+
598+ #expect( loadedSite1? . siteID == site1ID)
599+ #expect( loadedSite1? . lastIncrementalSyncDate == site1Date)
600+ #expect( loadedSite2? . siteID == site2ID)
601+ #expect( loadedSite2? . lastIncrementalSyncDate == site2Date)
602+
603+ // When loading non-existent site returns nil
604+ let nonExistentSite = try await sut. loadSite ( siteID: 999 )
605+ #expect( nonExistentSite == nil )
606+ }
483607}
484608
485609private extension POSCatalogPersistenceServiceTests {
610+ func insertSite( _ site: POSSite ) async throws {
611+ try await db. write { db in
612+ try PersistedSite ( from: site) . insert ( db, onConflict: . replace)
613+ }
614+ }
615+
486616 func insertProduct( _ product: POSProduct ) async throws {
487- let db = grdbManager. databaseConnection
488617 try await db. write { db in
489618 try PersistedSite ( id: sampleSiteID) . insert ( db, onConflict: . ignore)
490619 }
491620 try product. save ( to: db)
492621 }
493622
494623 func insertVariation( _ variation: POSProductVariation ) async throws {
495- let db = grdbManager. databaseConnection
496624 try variation. save ( to: db)
497625 }
498626}
0 commit comments