Skip to content

Commit 2100201

Browse files
authored
Merge pull request #1123 from commercetools/DEVX-291_Sync-producttypes-with-reference-set
Sync producttypes with attributes correctly
2 parents c340210 + dae798a commit 2100201

File tree

10 files changed

+266
-96
lines changed

10 files changed

+266
-96
lines changed

src/integration-test/java/com/commercetools/sync/integration/commons/utils/ProductTypeITUtils.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,11 @@ public static void assertAttributesAreEqual(
443443

444444
assertThat(attribute.getLabel()).isEqualTo(attributeDraft.getLabel());
445445

446-
assertThat(attribute.getType()).isEqualTo(attributeDraft.getType());
446+
final boolean isAttributeOfTypeSetType =
447+
attribute.getType() instanceof AttributeSetType;
448+
if (!isAttributeOfTypeSetType) {
449+
assertThat(attribute.getType()).isEqualTo(attributeDraft.getType());
450+
}
447451

448452
assertThat(attribute.getInputHint())
449453
.isEqualTo(
@@ -461,11 +465,11 @@ public static void assertAttributesAreEqual(
461465
ofNullable(attributeDraft.getAttributeConstraint())
462466
.orElse(AttributeConstraintEnum.NONE));
463467

464-
if (attribute.getType().getClass() == AttributeEnumType.class) {
468+
if (attribute.getType() instanceof AttributeEnumType) {
465469
assertPlainEnumsValuesAreEqual(
466470
((AttributeEnumType) attribute.getType()).getValues(),
467471
((AttributeEnumType) attributeDraft.getType()).getValues());
468-
} else if (attribute.getType().getClass() == AttributeLocalizedEnumType.class) {
472+
} else if (attribute.getType() instanceof AttributeLocalizedEnumType) {
469473
assertLocalizedEnumsValuesAreEqual(
470474
((AttributeLocalizedEnumType) attribute.getType()).getValues(),
471475
((AttributeLocalizedEnumType) attributeDraft.getType()).getValues());

src/integration-test/java/com/commercetools/sync/integration/commons/utils/TestUtils.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,9 @@
22

33
import static io.vrap.rmf.base.client.utils.json.JsonUtils.fromInputStream;
44

5-
import java.io.IOException;
65
import java.io.InputStream;
7-
import java.io.UncheckedIOException;
8-
import java.nio.charset.StandardCharsets;
9-
import java.util.Objects;
10-
import org.apache.commons.io.IOUtils;
116

127
public class TestUtils {
13-
public static String stringFromResource(final String resourcePath) {
14-
try {
15-
return IOUtils.toString(
16-
Objects.requireNonNull(
17-
Thread.currentThread().getContextClassLoader().getResourceAsStream(resourcePath)),
18-
StandardCharsets.UTF_8);
19-
} catch (final IOException e) {
20-
throw new UncheckedIOException(e);
21-
}
22-
}
23-
248
public static <T> T readObjectFromResource(final String resourcePath, final Class<T> objectType) {
259
final InputStream resourceAsStream =
2610
Thread.currentThread().getContextClassLoader().getResourceAsStream(resourcePath);

src/integration-test/java/com/commercetools/sync/integration/ctpprojectsource/producttypes/ProductTypeWithNestedAttributeSyncIT.java

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,32 @@
22

33
import static com.commercetools.api.models.common.LocalizedString.ofEnglish;
44
import static com.commercetools.sync.commons.asserts.statistics.AssertionsForStatistics.assertThat;
5+
import static com.commercetools.sync.integration.commons.utils.ProductTypeITUtils.PRODUCT_TYPE_DESCRIPTION_5;
6+
import static com.commercetools.sync.integration.commons.utils.ProductTypeITUtils.PRODUCT_TYPE_KEY_5;
7+
import static com.commercetools.sync.integration.commons.utils.ProductTypeITUtils.PRODUCT_TYPE_NAME_5;
8+
import static com.commercetools.sync.integration.commons.utils.ProductTypeITUtils.assertAttributesAreEqual;
9+
import static com.commercetools.sync.integration.commons.utils.ProductTypeITUtils.getProductTypeByKey;
510
import static com.commercetools.sync.integration.commons.utils.ProductTypeITUtils.populateProjectWithNestedAttributes;
611
import static com.commercetools.sync.integration.commons.utils.ProductTypeITUtils.removeAttributeReferencesAndDeleteProductTypes;
712
import static com.commercetools.sync.integration.commons.utils.TestClientUtils.CTP_SOURCE_CLIENT;
813
import static com.commercetools.sync.integration.commons.utils.TestClientUtils.CTP_TARGET_CLIENT;
914
import static org.assertj.core.api.Assertions.assertThat;
1015

16+
import com.commercetools.api.models.common.LocalizedString;
17+
import com.commercetools.api.models.product_type.AttributeDefinition;
1118
import com.commercetools.api.models.product_type.AttributeDefinitionDraft;
1219
import com.commercetools.api.models.product_type.AttributeDefinitionDraftBuilder;
1320
import com.commercetools.api.models.product_type.AttributeNestedType;
21+
import com.commercetools.api.models.product_type.AttributeNestedTypeBuilder;
22+
import com.commercetools.api.models.product_type.AttributeSetType;
23+
import com.commercetools.api.models.product_type.AttributeSetTypeBuilder;
1424
import com.commercetools.api.models.product_type.ProductType;
1525
import com.commercetools.api.models.product_type.ProductTypeChangeLabelActionBuilder;
1626
import com.commercetools.api.models.product_type.ProductTypeDraft;
1727
import com.commercetools.api.models.product_type.ProductTypeDraftBuilder;
1828
import com.commercetools.api.models.product_type.ProductTypePagedQueryResponse;
29+
import com.commercetools.api.models.product_type.ProductTypeReference;
30+
import com.commercetools.api.models.product_type.ProductTypeReferenceBuilder;
1931
import com.commercetools.api.models.product_type.ProductTypeUpdateAction;
2032
import com.commercetools.sync.commons.utils.CaffeineReferenceIdToKeyCacheImpl;
2133
import com.commercetools.sync.commons.utils.ReferenceIdToKeyCache;
@@ -27,6 +39,7 @@
2739
import io.vrap.rmf.base.client.ApiHttpResponse;
2840
import java.util.ArrayList;
2941
import java.util.List;
42+
import java.util.Optional;
3043
import java.util.stream.Collectors;
3144
import org.junit.jupiter.api.AfterAll;
3245
import org.junit.jupiter.api.BeforeEach;
@@ -116,6 +129,87 @@ void sync_WithEmptyTargetProject_ShouldReturnProperStatistics() {
116129
+ " of NestedType attribute definition(s) referencing a missing product type).");
117130
}
118131

132+
@Test
133+
void sync_WithProductTypeReferencingItselfAsAttribute_ShouldCreateProductType() {
134+
// preparation
135+
final AttributeDefinitionDraft nestedTypeAttr =
136+
AttributeDefinitionDraftBuilder.of()
137+
.name("selfReferenceAttr")
138+
.label(LocalizedString.ofEnglish("selfReferenceAttr"))
139+
.type(
140+
AttributeSetTypeBuilder.of()
141+
.elementType(
142+
AttributeNestedTypeBuilder.of()
143+
.typeReference(
144+
ProductTypeReferenceBuilder.of().id(PRODUCT_TYPE_KEY_5).build())
145+
.build())
146+
.build())
147+
.isSearchable(true)
148+
.isRequired(false)
149+
.build();
150+
151+
final ProductTypeDraft oldProductTypeDraft =
152+
ProductTypeDraftBuilder.of()
153+
.key(PRODUCT_TYPE_KEY_5)
154+
.name(PRODUCT_TYPE_NAME_5)
155+
.description(PRODUCT_TYPE_DESCRIPTION_5)
156+
.attributes(nestedTypeAttr)
157+
.build();
158+
159+
// Sync productDraft with attribute referencing itself to source project
160+
new ProductTypeSync(ProductTypeSyncOptionsBuilder.of(CTP_SOURCE_CLIENT).build())
161+
.sync(List.of(oldProductTypeDraft))
162+
.toCompletableFuture()
163+
.join();
164+
final ProductType oldProductType =
165+
CTP_SOURCE_CLIENT
166+
.productTypes()
167+
.withKey(PRODUCT_TYPE_KEY_5)
168+
.get()
169+
.executeBlocking()
170+
.getBody();
171+
172+
// test
173+
final ProductTypeSync productTypeSync = new ProductTypeSync(productTypeSyncOptions);
174+
final ProductTypeSyncStatistics productTypeSyncStatistics =
175+
ProductTypeTransformUtils.toProductTypeDrafts(
176+
CTP_SOURCE_CLIENT, referenceIdToKeyCache, List.of(oldProductType))
177+
.thenCompose(newDrafts -> productTypeSync.sync(newDrafts))
178+
.toCompletableFuture()
179+
.join();
180+
181+
// assertion
182+
assertThat(errorMessages).isEmpty();
183+
assertThat(exceptions).isEmpty();
184+
assertThat(builtUpdateActions).isEmpty();
185+
assertThat(productTypeSyncStatistics).hasValues(1, 1, 0, 0, 0);
186+
assertThat(productTypeSyncStatistics.getReportMessage())
187+
.isEqualTo(
188+
"Summary: 1 product types were processed in total"
189+
+ " (1 created, 0 updated, 0 failed to sync and 0 product types with at least one NestedType or a Set"
190+
+ " of NestedType attribute definition(s) referencing a missing product type).");
191+
192+
final Optional<ProductType> newProductType =
193+
getProductTypeByKey(CTP_TARGET_CLIENT, PRODUCT_TYPE_KEY_5);
194+
assertThat(newProductType).isPresent();
195+
assertThat(newProductType)
196+
.hasValueSatisfying(
197+
productType -> {
198+
assertAttributesAreEqual(productType.getAttributes(), List.of(nestedTypeAttr));
199+
final AttributeDefinition attributeDefinition1 = productType.getAttributes().get(0);
200+
assertThat(attributeDefinition1.getType()).isInstanceOf(AttributeSetType.class);
201+
final AttributeSetType attributeSetType =
202+
(AttributeSetType) attributeDefinition1.getType();
203+
assertThat(attributeSetType.getElementType()).isInstanceOf(AttributeNestedType.class);
204+
final AttributeNestedType attributeNestedType =
205+
(AttributeNestedType) attributeSetType.getElementType();
206+
assertThat(attributeNestedType.getTypeReference())
207+
.isInstanceOf(ProductTypeReference.class);
208+
assertThat(attributeNestedType.getTypeReference().getId())
209+
.isEqualTo(productType.getId());
210+
});
211+
}
212+
119213
@Test
120214
void sync_WithOneDraftPerBatchOnEmptyProject_ShouldReturnProperStatistics() {
121215
// preparation

src/integration-test/java/com/commercetools/sync/integration/externalsource/producttypes/ProductTypeSyncIT.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import com.commercetools.api.defaultconfig.ApiRootBuilder;
1919
import com.commercetools.api.models.product_type.AttributeConstraintEnum;
2020
import com.commercetools.api.models.product_type.AttributeDefinition;
21-
import com.commercetools.api.models.product_type.AttributeDefinitionBuilder;
2221
import com.commercetools.api.models.product_type.AttributeDefinitionDraft;
2322
import com.commercetools.api.models.product_type.AttributeDefinitionDraftBuilder;
2423
import com.commercetools.api.models.product_type.AttributeLocalizedEnumValueBuilder;
@@ -36,7 +35,6 @@
3635
import com.commercetools.sync.producttypes.ProductTypeSyncOptions;
3736
import com.commercetools.sync.producttypes.ProductTypeSyncOptionsBuilder;
3837
import com.commercetools.sync.producttypes.helpers.ProductTypeSyncStatistics;
39-
import com.commercetools.sync.producttypes.helpers.ResourceToDraftConverters;
4038
import io.vrap.rmf.base.client.ApiHttpMethod;
4139
import io.vrap.rmf.base.client.ApiHttpResponse;
4240
import io.vrap.rmf.base.client.error.BadGatewayException;
@@ -870,8 +868,8 @@ void sync_withProductTypeWithCategoryReference_ShouldAddNewAttributesToTheProduc
870868
final ProductTypeSyncOptions productTypeSyncOptions =
871869
ProductTypeSyncOptionsBuilder.of(CTP_TARGET_CLIENT).build();
872870

873-
final AttributeDefinition referenceTypeAttr =
874-
AttributeDefinitionBuilder.of()
871+
final AttributeDefinitionDraft referenceTypeAttr =
872+
AttributeDefinitionDraftBuilder.of()
875873
.name("referenceTypeAttr")
876874
.label(ofEnglish("referenceTypeAttr"))
877875
.type(
@@ -893,9 +891,7 @@ void sync_withProductTypeWithCategoryReference_ShouldAddNewAttributesToTheProduc
893891
.key(PRODUCT_TYPE_KEY_3)
894892
.name(PRODUCT_TYPE_NAME_3)
895893
.description(PRODUCT_TYPE_DESCRIPTION_3)
896-
.attributes(
897-
ResourceToDraftConverters.toAttributeDefinitionDraftBuilder(referenceTypeAttr)
898-
.build())
894+
.attributes(referenceTypeAttr)
899895
.build();
900896

901897
final ProductTypeSync productTypeSync = new ProductTypeSync(productTypeSyncOptions);
@@ -906,10 +902,7 @@ void sync_withProductTypeWithCategoryReference_ShouldAddNewAttributesToTheProduc
906902
.key(PRODUCT_TYPE_KEY_3)
907903
.name(PRODUCT_TYPE_NAME_3)
908904
.description(PRODUCT_TYPE_DESCRIPTION_3)
909-
.attributes(
910-
ATTRIBUTE_DEFINITION_DRAFT_1,
911-
ResourceToDraftConverters.toAttributeDefinitionDraftBuilder(referenceTypeAttr)
912-
.build())
905+
.attributes(ATTRIBUTE_DEFINITION_DRAFT_1, referenceTypeAttr)
913906
.build();
914907

915908
productTypeSync.sync(singletonList(updatedProductTypeDraft)).toCompletableFuture().join();

src/main/java/com/commercetools/sync/producttypes/helpers/ResourceToDraftConverters.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public static AttributeDefinitionDraftBuilder toAttributeDefinitionDraftBuilder(
3939
.label(attributeDefinition.getLabel())
4040
.isSearchable(attributeDefinition.getIsSearchable())
4141
.inputTip(attributeDefinition.getInputTip())
42-
.isRequired(attributeDefinition.getIsSearchable())
42+
.isRequired(attributeDefinition.getIsRequired())
4343
.attributeConstraint(attributeDefinition.getAttributeConstraint())
4444
.inputHint(attributeDefinition.getInputHint());
4545
}

0 commit comments

Comments
 (0)