@@ -36,6 +36,12 @@ struct BookingStoreTests {
3636 return viewStorage. countObjects ( ofType: StorageBooking . self)
3737 }
3838
39+ /// Convenience: returns the number of stored booking resources
40+ ///
41+ private var storedBookingResourceCount : Int {
42+ return viewStorage. countObjects ( ofType: Storage . BookingResource. self)
43+ }
44+
3945 /// SiteID
4046 ///
4147 private let sampleSiteID : Int64 = 120934
@@ -618,6 +624,153 @@ struct BookingStoreTests {
618624 #expect( orderInfo. statusKey == " processing " )
619625 }
620626
627+ // MARK: - synchronizeResources
628+
629+ @Test func synchronizeResources_stores_resources_upon_success( ) async throws {
630+ // Given
631+ let resource = BookingResource . fake ( ) . copy ( siteID: sampleSiteID, resourceID: 123 )
632+ remote. whenFetchingResources ( thenReturn: . success( [ resource] ) )
633+ let store = BookingStore ( dispatcher: Dispatcher ( ) ,
634+ storageManager: storageManager,
635+ network: network,
636+ remote: remote,
637+ ordersRemote: ordersRemote)
638+ #expect( storedBookingResourceCount == 0 )
639+
640+ // When
641+ let result = await withCheckedContinuation { continuation in
642+ store. onAction ( BookingAction . synchronizeResources ( siteID: sampleSiteID,
643+ pageNumber: defaultPageNumber,
644+ pageSize: defaultPageSize,
645+ onCompletion: { result in
646+ continuation. resume ( returning: result)
647+ } ) )
648+ }
649+
650+ // Then
651+ #expect( result. isSuccess)
652+ #expect( storedBookingResourceCount == 1 )
653+ }
654+
655+ @Test func synchronizeResources_updates_existing_resource_when_resource_already_exists( ) async throws {
656+ // Given
657+ let originalResource = BookingResource . fake ( ) . copy ( siteID: sampleSiteID, resourceID: 123 , name: " Original Name " )
658+ storeBookingResource ( originalResource)
659+ #expect( storedBookingResourceCount == 1 )
660+
661+ let updatedResource = originalResource. copy ( name: " Updated Name " )
662+ remote. whenFetchingResources ( thenReturn: . success( [ updatedResource] ) )
663+ let store = BookingStore ( dispatcher: Dispatcher ( ) ,
664+ storageManager: storageManager,
665+ network: network,
666+ remote: remote,
667+ ordersRemote: ordersRemote)
668+
669+ // When
670+ let result = await withCheckedContinuation { continuation in
671+ store. onAction ( BookingAction . synchronizeResources ( siteID: sampleSiteID,
672+ pageNumber: defaultPageNumber,
673+ pageSize: defaultPageSize,
674+ onCompletion: { result in
675+ continuation. resume ( returning: result)
676+ } ) )
677+ }
678+
679+ // Then
680+ #expect( result. isSuccess)
681+ #expect( storedBookingResourceCount == 1 )
682+ let storedResource = try #require( viewStorage. loadBookingResource ( siteID: sampleSiteID, resourceID: 123 ) )
683+ #expect( storedResource. name == " Updated Name " )
684+ }
685+
686+ @Test func synchronizeResources_stores_multiple_resources_upon_success( ) async throws {
687+ // Given
688+ let resource1 = BookingResource . fake ( ) . copy ( siteID: sampleSiteID, resourceID: 123 )
689+ let resource2 = BookingResource . fake ( ) . copy ( siteID: sampleSiteID, resourceID: 456 )
690+ remote. whenFetchingResources ( thenReturn: . success( [ resource1, resource2] ) )
691+ let store = BookingStore ( dispatcher: Dispatcher ( ) ,
692+ storageManager: storageManager,
693+ network: network,
694+ remote: remote,
695+ ordersRemote: ordersRemote)
696+ #expect( storedBookingResourceCount == 0 )
697+
698+ // When
699+ let result = await withCheckedContinuation { continuation in
700+ store. onAction ( BookingAction . synchronizeResources ( siteID: sampleSiteID,
701+ pageNumber: defaultPageNumber,
702+ pageSize: defaultPageSize,
703+ onCompletion: { result in
704+ continuation. resume ( returning: result)
705+ } ) )
706+ }
707+
708+ // Then
709+ #expect( result. isSuccess)
710+ #expect( storedBookingResourceCount == 2 )
711+ }
712+
713+ @Test func synchronizeResources_returns_error_on_failure( ) async throws {
714+ // Given
715+ remote. whenFetchingResources ( thenReturn: . failure( NetworkError . timeout ( ) ) )
716+ let store = BookingStore ( dispatcher: Dispatcher ( ) ,
717+ storageManager: storageManager,
718+ network: network,
719+ remote: remote,
720+ ordersRemote: ordersRemote)
721+
722+ // When
723+ let result = await withCheckedContinuation { continuation in
724+ store. onAction ( BookingAction . synchronizeResources ( siteID: sampleSiteID,
725+ pageNumber: defaultPageNumber,
726+ pageSize: defaultPageSize,
727+ onCompletion: { result in
728+ continuation. resume ( returning: result)
729+ } ) )
730+ }
731+
732+ // Then
733+ #expect( result. isFailure)
734+ let error = result. failure as? NetworkError
735+ #expect( error == . timeout( ) )
736+ }
737+
738+ @Test func synchronizeResources_preserves_existing_resources_from_previous_pages( ) async throws {
739+ // Given
740+ let existingResource = BookingResource . fake ( ) . copy ( siteID: sampleSiteID, resourceID: 999 )
741+ storeBookingResource ( existingResource)
742+ #expect( storedBookingResourceCount == 1 )
743+
744+ let newResource = BookingResource . fake ( ) . copy ( siteID: sampleSiteID, resourceID: 123 )
745+ remote. whenFetchingResources ( thenReturn: . success( [ newResource] ) )
746+ let store = BookingStore ( dispatcher: Dispatcher ( ) ,
747+ storageManager: storageManager,
748+ network: network,
749+ remote: remote,
750+ ordersRemote: ordersRemote)
751+
752+ // When
753+ let result = await withCheckedContinuation { continuation in
754+ store. onAction ( BookingAction . synchronizeResources ( siteID: sampleSiteID,
755+ pageNumber: defaultPageNumber,
756+ pageSize: defaultPageSize,
757+ onCompletion: { result in
758+ continuation. resume ( returning: result)
759+ } ) )
760+ }
761+
762+ // Then
763+ #expect( result. isSuccess)
764+ #expect( storedBookingResourceCount == 2 )
765+
766+ // Verify both resources exist
767+ let newStoredResource = try #require( viewStorage. loadBookingResource ( siteID: sampleSiteID, resourceID: 123 ) )
768+ #expect( newStoredResource. resourceID == 123 )
769+
770+ let existingStoredResource = try #require( viewStorage. loadBookingResource ( siteID: sampleSiteID, resourceID: 999 ) )
771+ #expect( existingStoredResource. resourceID == 999 )
772+ }
773+
621774 // MARK: - orderInfo Storage Tests
622775
623776 @Test func synchronizeBookings_stores_complete_orderInfo_with_all_nested_properties( ) async throws {
0 commit comments