@@ -564,6 +564,42 @@ struct POSCatalogPersistenceServiceTests {
564564 #expect( site? . id == sampleSiteID)
565565 }
566566 }
567+
568+ // MARK: - Orphaned Variation Filtering Tests
569+
570+ @Test func replaceAllCatalogData_filters_out_variations_without_parent_products( ) async throws {
571+ // Given
572+ let product = POSProduct . fake ( ) . copy ( siteID: sampleSiteID, productID: 10 )
573+ let validVariation = POSProductVariation . fake ( )
574+ . copy ( siteID: sampleSiteID, productID: 10 , productVariationID: 1 , image: ProductImage . fake ( ) . copy ( imageID: 100 ) )
575+ let orphanedVariation1 = POSProductVariation . fake ( )
576+ . copy ( siteID: sampleSiteID, productID: 20 , productVariationID: 2 , image: ProductImage . fake ( ) . copy ( imageID: 200 ) )
577+ let orphanedVariation2 = POSProductVariation . fake ( )
578+ . copy ( siteID: sampleSiteID, productID: 30 , productVariationID: 3 , image: ProductImage . fake ( ) . copy ( imageID: 300 ) )
579+
580+ let catalog = POSCatalog (
581+ products: [ product] ,
582+ variations: [ validVariation, orphanedVariation1, orphanedVariation2] ,
583+ syncDate: . now
584+ )
585+
586+ // When
587+ try await sut. replaceAllCatalogData ( catalog, siteID: sampleSiteID)
588+
589+ // Then
590+ try await db. read { db in
591+ let variationCount = try PersistedProductVariation . fetchCount ( db)
592+ #expect( variationCount == 1 )
593+ let variationImageCount = try PersistedProductVariationImage . fetchCount ( db)
594+ #expect( variationImageCount == 1 )
595+
596+ let variation = try PersistedProductVariation . fetchOne ( db)
597+ #expect( variation? . id == 1 )
598+ #expect( variation? . productID == 10 )
599+ let variationImage = try PersistedProductVariationImage . fetchOne ( db)
600+ #expect( variationImage? . imageID == 100 )
601+ }
602+ }
567603}
568604
569605private extension POSCatalogPersistenceServiceTests {
0 commit comments