@@ -778,7 +778,9 @@ final class WooShippingCreateLabelsViewModelTests: XCTestCase {
778778 }
779779
780780 // When
781- let viewModel = WooShippingCreateLabelsViewModel ( order: Order . fake ( ) , stores: stores)
781+ let viewModel = WooShippingCreateLabelsViewModel ( order: Order . fake ( ) ,
782+ shippingSettingsService: MockShippingSettingsService ( dimensionUnit: " " , weightUnit: " " ) ,
783+ stores: stores)
782784
783785 waitUntil {
784786 viewModel. state == . ready
@@ -847,6 +849,7 @@ final class WooShippingCreateLabelsViewModelTests: XCTestCase {
847849 case . loadOriginAddresses( _, let completion) :
848850 completion ( . success( [ originAddress] ) )
849851 case . loadAccountSettings( _, let completion) :
852+ self . insert ( accountSettings: accountSettings)
850853 completion ( . success( settings) )
851854 case . loadPackages, . verifyDestinationAddress:
852855 break
@@ -856,7 +859,9 @@ final class WooShippingCreateLabelsViewModelTests: XCTestCase {
856859 }
857860
858861
859- let viewModel = WooShippingCreateLabelsViewModel ( order: Order . fake ( ) , stores: stores)
862+ let viewModel = WooShippingCreateLabelsViewModel ( order: Order . fake ( ) ,
863+ shippingSettingsService: MockShippingSettingsService ( dimensionUnit: " " , weightUnit: " " ) ,
864+ stores: stores)
860865
861866 waitUntil {
862867 viewModel. state == . ready
@@ -885,6 +890,154 @@ final class WooShippingCreateLabelsViewModelTests: XCTestCase {
885890 isEditable: true )
886891 ) )
887892 }
893+
894+ // MARK: - loadRequiredData with stored data tests
895+
896+ func test_loadRequiredData_state_becomes_ready_immediately_when_origin_addresses_and_settings_are_stored( ) {
897+ // Given
898+ let originAddress = WooShippingOriginAddress ( siteID: siteID,
899+ id: " stored_address " ,
900+ company: " Stored Company " ,
901+ address1: " 123 Stored St " ,
902+ address2: " " ,
903+ city: " San Francisco " ,
904+ state: " CA " ,
905+ postcode: " 94102 " ,
906+ country: " US " ,
907+ phone: " 555-0123 " ,
908+ firstName: " John " ,
909+ lastName: " Doe " ,
910+ 911+ defaultAddress: true ,
912+ isVerified: true )
913+
914+ let accountSettings = ShippingLabelAccountSettings . fake ( ) . copy ( siteID: siteID)
915+
916+ // Pre-populate storage with data
917+ insert ( originAddress: originAddress)
918+ insert ( accountSettings: accountSettings)
919+
920+ let stores = MockStoresManager ( sessionManager: . testingInstance)
921+ let shippingSettingsService = MockShippingSettingsService ( dimensionUnit: " cm " , weightUnit: " g " )
922+ let viewModel = WooShippingCreateLabelsViewModel ( order: Order . fake ( ) . copy ( siteID: siteID) ,
923+ shippingSettingsService: shippingSettingsService,
924+ stores: stores,
925+ storageManager: storageManager)
926+
927+ waitUntil {
928+ viewModel. state == . ready
929+ }
930+
931+ // Then
932+ XCTAssertEqual ( viewModel. originAddress, " 123 Stored St, San Francisco CA 94102, US " )
933+ XCTAssertEqual ( viewModel. dimensionsUnit, " cm " )
934+ XCTAssertEqual ( viewModel. weightUnit, " g " )
935+ }
936+
937+ func test_loadRequiredData_state_becomes_ready_immediately_when_only_origin_addresses_are_stored( ) {
938+ // Given
939+ let originAddress = WooShippingOriginAddress ( siteID: siteID,
940+ id: " stored_address " ,
941+ company: " Stored Company " ,
942+ address1: " 456 Another St " ,
943+ address2: " " ,
944+ city: " Los Angeles " ,
945+ state: " CA " ,
946+ postcode: " 90210 " ,
947+ country: " US " ,
948+ phone: " 555-0456 " ,
949+ firstName: " Jane " ,
950+ lastName: " Smith " ,
951+ 952+ defaultAddress: true ,
953+ isVerified: false )
954+
955+ // Pre-populate storage with origin addresses only
956+ insert ( originAddress: originAddress)
957+
958+ let stores = MockStoresManager ( sessionManager: . testingInstance)
959+ var accountSettingsLoaded = false
960+
961+ stores. whenReceivingAction ( ofType: WooShippingAction . self) { action in
962+ switch action {
963+ case . loadAccountSettings( _, let completion) :
964+ accountSettingsLoaded = true
965+ completion ( . success( self . settings) )
966+ case . loadPackages, . verifyDestinationAddress, . loadOriginAddresses:
967+ break
968+ default :
969+ XCTFail ( " Unexpected action: \( action) " )
970+ }
971+ }
972+
973+ let shippingSettingsService = MockShippingSettingsService ( dimensionUnit: nil , weightUnit: nil )
974+ let viewModel = WooShippingCreateLabelsViewModel ( order: Order . fake ( ) . copy ( siteID: siteID) ,
975+ shippingSettingsService: shippingSettingsService,
976+ stores: stores,
977+ storageManager: storageManager)
978+
979+ waitUntil {
980+ viewModel. state == . ready
981+ }
982+
983+ // Then
984+ XCTAssertEqual ( viewModel. originAddress, " 456 Another St, Los Angeles CA 90210, US " )
985+ XCTAssertTrue ( accountSettingsLoaded, " Account settings should be loaded from remote when missing " )
986+ XCTAssertEqual ( viewModel. dimensionsUnit, settings. storeOptions. dimensionUnit)
987+ XCTAssertEqual ( viewModel. weightUnit, settings. storeOptions. weightUnit)
988+ }
989+
990+ func test_loadRequiredData_state_becomes_ready_immediately_when_only_account_settings_are_stored( ) {
991+ // Given
992+ let accountSettings = ShippingLabelAccountSettings . fake ( ) . copy ( siteID: siteID)
993+
994+ // Pre-populate storage with account settings only
995+ insert ( accountSettings: accountSettings)
996+
997+ let originAddress = WooShippingOriginAddress ( siteID: siteID,
998+ id: " stored_address " ,
999+ company: " Stored Company " ,
1000+ address1: " 456 Another St " ,
1001+ address2: " " ,
1002+ city: " Los Angeles " ,
1003+ state: " CA " ,
1004+ postcode: " 90210 " ,
1005+ country: " US " ,
1006+ phone: " 555-0456 " ,
1007+ firstName: " Jane " ,
1008+ lastName: " Smith " ,
1009+ 1010+ defaultAddress: true ,
1011+ isVerified: false )
1012+ let stores = MockStoresManager ( sessionManager: . testingInstance)
1013+ var originAddressesLoaded = false
1014+
1015+ stores. whenReceivingAction ( ofType: WooShippingAction . self) { action in
1016+ switch action {
1017+ case . loadOriginAddresses( _, let completion) :
1018+ originAddressesLoaded = true
1019+ completion ( . success( [ originAddress] ) )
1020+ case . loadPackages, . verifyDestinationAddress, . loadAccountSettings:
1021+ break
1022+ default :
1023+ XCTFail ( " Unexpected action: \( action) " )
1024+ }
1025+ }
1026+
1027+ let shippingSettingsService = MockShippingSettingsService ( dimensionUnit: " cm " , weightUnit: " g " )
1028+ let viewModel = WooShippingCreateLabelsViewModel ( order: Order . fake ( ) . copy ( siteID: siteID) ,
1029+ shippingSettingsService: shippingSettingsService,
1030+ stores: stores,
1031+ storageManager: storageManager)
1032+
1033+ waitUntil {
1034+ viewModel. state == . ready
1035+ }
1036+
1037+ // Then
1038+ XCTAssertTrue ( originAddressesLoaded, " Origin addresses should be loaded from remote when missing " )
1039+ XCTAssertFalse ( viewModel. originAddress. isEmpty, " Origin address should be set from loaded data " )
1040+ }
8881041}
8891042
8901043private extension WooShippingCreateLabelsViewModelTests {
@@ -934,4 +1087,14 @@ private extension WooShippingCreateLabelsViewModelTests {
9341087 }
9351088 }
9361089 }
1090+
1091+ func insert( originAddress: WooShippingOriginAddress ) {
1092+ let storageAddress = storage. insertNewObject ( ofType: StorageWooShippingOriginAddress . self)
1093+ storageAddress. update ( with: originAddress)
1094+ }
1095+
1096+ func insert( accountSettings: ShippingLabelAccountSettings ) {
1097+ let storageSettings = storage. insertNewObject ( ofType: StorageShippingLabelAccountSettings . self)
1098+ storageSettings. update ( with: accountSettings)
1099+ }
9371100}
0 commit comments