diff --git a/src/integration-test/java/com/commercetools/sync/integration/externalsource/customers/CustomerSyncIT.java b/src/integration-test/java/com/commercetools/sync/integration/externalsource/customers/CustomerSyncIT.java index b4640de4c9..897a666e79 100644 --- a/src/integration-test/java/com/commercetools/sync/integration/externalsource/customers/CustomerSyncIT.java +++ b/src/integration-test/java/com/commercetools/sync/integration/externalsource/customers/CustomerSyncIT.java @@ -344,4 +344,115 @@ void sync_WithUpdatedAllFieldsOfCustomer_ShouldUpdateCustomerWithAllExpectedActi .isEqualTo( "Summary: 1 customers were processed in total (0 created, 1 updated and 0 failed to sync)."); } + + @Test + void sync_WithUpdatedAddressStateAndAdditionalStreetInfo_ShouldUpdateCustomer() { + // Create a customer with addresses containing state and additionalStreetInfo + final CustomerDraft customerDraftWithAddressFields = + CustomerDraftBuilder.of() + .email("address-test@example.com") + .password("12345") + .key("customer-key-address-test") + .addresses( + asList( + AddressBuilder.of() + .country(CountryCode.US.name()) + .city("San Francisco") + .key("address1") + .state("California") + .additionalStreetInfo("Suite 100") + .build(), + AddressBuilder.of() + .country(CountryCode.DE.name()) + .city("Munich") + .key("address2") + .state("Bavaria") + .additionalStreetInfo("Building A") + .build())) + .build(); + + // Create the customer + final CustomerSyncStatistics createStatistics = + customerSync + .sync(singletonList(customerDraftWithAddressFields)) + .toCompletableFuture() + .join(); + + assertThat(createStatistics.getCreated().get()).isEqualTo(1); + assertThat(errorMessages).isEmpty(); + assertThat(warningMessages).isEmpty(); + + // Verify the created customer has the correct fields + final Customer createdCustomer = + TestClientUtils.CTP_TARGET_CLIENT + .customers() + .withKey("customer-key-address-test") + .get() + .executeBlocking() + .getBody(); + + assertThat(createdCustomer.getAddresses()).hasSize(2); + assertThat(createdCustomer.getAddresses().get(0).getState()).isEqualTo("California"); + assertThat(createdCustomer.getAddresses().get(0).getAdditionalStreetInfo()) + .isEqualTo("Suite 100"); + assertThat(createdCustomer.getAddresses().get(1).getState()).isEqualTo("Bavaria"); + assertThat(createdCustomer.getAddresses().get(1).getAdditionalStreetInfo()) + .isEqualTo("Building A"); + + // Update the customer with different state and additionalStreetInfo + final CustomerDraft updatedCustomerDraft = + CustomerDraftBuilder.of() + .email("address-test@example.com") + .password("12345") + .key("customer-key-address-test") + .addresses( + asList( + AddressBuilder.of() + .country(CountryCode.US.name()) + .city("San Francisco") + .key("address1") + .state("Texas") // Changed from California + .additionalStreetInfo("Suite 200") // Changed from Suite 100 + .build(), + AddressBuilder.of() + .country(CountryCode.DE.name()) + .city("Munich") + .key("address2") + .state("Berlin") // Changed from Bavaria + .additionalStreetInfo("Building B") // Changed from Building A + .build())) + .build(); + + // Clear previous update actions + updateActionList.clear(); + + // Sync the updated customer + final CustomerSyncStatistics updateStatistics = + customerSync.sync(singletonList(updatedCustomerDraft)).toCompletableFuture().join(); + + assertThat(updateStatistics.getUpdated().get()).isEqualTo(1); + assertThat(errorMessages).isEmpty(); + assertThat(warningMessages).isEmpty(); + + // Verify update actions were generated for the changed fields + assertThat(updateActionList).isNotEmpty(); + assertThat(updateActionList.toString()).contains("changeAddress"); + + // Verify the updated customer has the new values + final Customer updatedCustomer = + TestClientUtils.CTP_TARGET_CLIENT + .customers() + .withKey("customer-key-address-test") + .get() + .executeBlocking() + .getBody(); + + assertThat(updatedCustomer.getAddresses()).hasSize(2); + assertThat(updatedCustomer.getAddresses().get(0).getState()).isEqualTo("Texas"); + assertThat(updatedCustomer.getAddresses().get(0).getAdditionalStreetInfo()) + .isEqualTo("Suite 200"); + assertThat(updatedCustomer.getAddresses().get(1).getState()).isEqualTo("Berlin"); + assertThat(updatedCustomer.getAddresses().get(1).getAdditionalStreetInfo()) + .isEqualTo("Building B"); + } } diff --git a/src/main/java/com/commercetools/sync/customers/utils/CustomerReferenceResolutionUtils.java b/src/main/java/com/commercetools/sync/customers/utils/CustomerReferenceResolutionUtils.java index 18305b022e..4cdcabe5e5 100644 --- a/src/main/java/com/commercetools/sync/customers/utils/CustomerReferenceResolutionUtils.java +++ b/src/main/java/com/commercetools/sync/customers/utils/CustomerReferenceResolutionUtils.java @@ -164,10 +164,12 @@ private static List mapToAddressesDraft( .lastName(address.getLastName()) .streetName(address.getStreetName()) .streetNumber(address.getStreetNumber()) + .additionalStreetInfo(address.getAdditionalStreetInfo()) .additionalAddressInfo(address.getAdditionalAddressInfo()) .postalCode(address.getPostalCode()) .city(address.getCity()) .region(address.getRegion()) + .state(address.getState()) .country(address.getCountry()) .company(address.getCompany()) .department(address.getDepartment()) diff --git a/src/test/java/com/commercetools/sync/customers/utils/AddressUpdateActionUtilsTest.java b/src/test/java/com/commercetools/sync/customers/utils/AddressUpdateActionUtilsTest.java index 48bf2b7346..af2c123edf 100644 --- a/src/test/java/com/commercetools/sync/customers/utils/AddressUpdateActionUtilsTest.java +++ b/src/test/java/com/commercetools/sync/customers/utils/AddressUpdateActionUtilsTest.java @@ -529,6 +529,121 @@ void buildChangeAddressUpdateActions_WithNullAddresses_ShouldNotReturnChangeAddr assertThat(updateActions).isEmpty(); } + @Test + void buildChangeAddressUpdateActions_WithDifferentState_ShouldReturnChangeAddressAction() { + + when(oldCustomer.getAddresses()) + .thenReturn( + singletonList( + AddressBuilder.of() + .country(CountryCode.US.toString()) + .key("address-key-1") + .id("address-id-1") + .state("California") + .build())); + + final AddressDraft address1 = + AddressDraftBuilder.of() + .country(CountryCode.US.toString()) + .key("address-key-1") + .state("Texas") + .id("address-id-new-1") + .build(); + + final CustomerDraft newCustomer = + CustomerDraftBuilder.of() + .email("email") + .password("pass") + .addresses(singletonList(address1)) + .build(); + + final List updateActions = + CustomerUpdateActionUtils.buildChangeAddressUpdateActions(oldCustomer, newCustomer); + + assertThat(updateActions) + .containsExactly( + CustomerChangeAddressActionBuilder.of() + .addressId("address-id-1") + .address(address1) + .build()); + } + + @Test + void + buildChangeAddressUpdateActions_WithDifferentAdditionalStreetInfo_ShouldReturnChangeAddressAction() { + + when(oldCustomer.getAddresses()) + .thenReturn( + singletonList( + AddressBuilder.of() + .country(CountryCode.US.toString()) + .key("address-key-1") + .id("address-id-1") + .additionalStreetInfo("Suite 100") + .build())); + + final AddressDraft address1 = + AddressDraftBuilder.of() + .country(CountryCode.US.toString()) + .key("address-key-1") + .additionalStreetInfo("Suite 200") + .id("address-id-new-1") + .build(); + + final CustomerDraft newCustomer = + CustomerDraftBuilder.of() + .email("email") + .password("pass") + .addresses(singletonList(address1)) + .build(); + + final List updateActions = + CustomerUpdateActionUtils.buildChangeAddressUpdateActions(oldCustomer, newCustomer); + + assertThat(updateActions) + .containsExactly( + CustomerChangeAddressActionBuilder.of() + .addressId("address-id-1") + .address(address1) + .build()); + } + + @Test + void + buildChangeAddressUpdateActions_WithSameStateAndAdditionalStreetInfo_ShouldNotReturnAction() { + + when(oldCustomer.getAddresses()) + .thenReturn( + singletonList( + AddressBuilder.of() + .country(CountryCode.US.toString()) + .key("address-key-1") + .id("address-id-1") + .state("California") + .additionalStreetInfo("Suite 100") + .build())); + + final CustomerDraft newCustomer = + CustomerDraftBuilder.of() + .email("email") + .password("pass") + .addresses( + singletonList( + AddressBuilder.of() + .country(CountryCode.US.toString()) + .key("address-key-1") + .id("address-id-new-1") + .state("California") + .additionalStreetInfo("Suite 100") + .build())) + .build(); + + final List updateActions = + CustomerUpdateActionUtils.buildChangeAddressUpdateActions(oldCustomer, newCustomer); + + assertThat(updateActions).isEmpty(); + } + @Test void buildChangeAddressUpdateActions_WithAddressesWithoutKeys_ShouldNotReturnChangeAddressActions() { diff --git a/src/test/java/com/commercetools/sync/customers/utils/CustomerReferenceResolutionUtilsTest.java b/src/test/java/com/commercetools/sync/customers/utils/CustomerReferenceResolutionUtilsTest.java index 8ab3c62cc5..896b641dd3 100644 --- a/src/test/java/com/commercetools/sync/customers/utils/CustomerReferenceResolutionUtilsTest.java +++ b/src/test/java/com/commercetools/sync/customers/utils/CustomerReferenceResolutionUtilsTest.java @@ -212,4 +212,69 @@ void mapToCustomerDrafts_WithAddresses_ShouldReturnResourceIdentifiersWithCorrec assertThat(customerDraft.getBillingAddresses()).isEqualTo(asList(0, 2)); assertThat(customerDraft.getShippingAddresses()).isEmpty(); } + + @Test + void mapToCustomerDrafts_WithStateAndAdditionalStreetInfo_ShouldMapFieldsCorrectly() { + final Customer mockCustomer = mock(Customer.class); + when(mockCustomer.getEmail()).thenReturn("email"); + when(mockCustomer.getPassword()).thenReturn("password"); + when(mockCustomer.getAddresses()) + .thenReturn( + asList( + AddressBuilder.of() + .country(CountryCode.US.toString()) + .id("address-id1") + .key("address-key1") + .state("California") + .additionalStreetInfo("Suite 100") + .build(), + AddressBuilder.of() + .country(CountryCode.DE.toString()) + .id("address-id2") + .key("address-key2") + .state("Bavaria") + .additionalStreetInfo("Building A") + .build())); + + final List referenceReplacedDrafts = + CustomerReferenceResolutionUtils.mapToCustomerDrafts( + singletonList(mockCustomer), referenceIdToKeyCache); + + final CustomerDraft customerDraft = referenceReplacedDrafts.get(0); + + assertThat(customerDraft.getAddresses()).hasSize(2); + assertThat(customerDraft.getAddresses().get(0).getState()).isEqualTo("California"); + assertThat(customerDraft.getAddresses().get(0).getAdditionalStreetInfo()) + .isEqualTo("Suite 100"); + assertThat(customerDraft.getAddresses().get(1).getState()).isEqualTo("Bavaria"); + assertThat(customerDraft.getAddresses().get(1).getAdditionalStreetInfo()) + .isEqualTo("Building A"); + } + + @Test + void mapToCustomerDrafts_WithNullStateAndAdditionalStreetInfo_ShouldMapFieldsAsNull() { + final Customer mockCustomer = mock(Customer.class); + when(mockCustomer.getEmail()).thenReturn("email"); + when(mockCustomer.getPassword()).thenReturn("password"); + when(mockCustomer.getAddresses()) + .thenReturn( + singletonList( + AddressBuilder.of() + .country(CountryCode.US.toString()) + .id("address-id1") + .key("address-key1") + .state(null) + .additionalStreetInfo(null) + .build())); + + final List referenceReplacedDrafts = + CustomerReferenceResolutionUtils.mapToCustomerDrafts( + singletonList(mockCustomer), referenceIdToKeyCache); + + final CustomerDraft customerDraft = referenceReplacedDrafts.get(0); + + assertThat(customerDraft.getAddresses()).hasSize(1); + assertThat(customerDraft.getAddresses().get(0).getState()).isNull(); + assertThat(customerDraft.getAddresses().get(0).getAdditionalStreetInfo()).isNull(); + } }