diff --git a/build.gradle b/build.gradle index 1841ed4755..3182e5d3f6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,7 @@ plugins { - id 'org.ajoberstar.git-publish' version '4.2.2' id 'com.adarshr.test-logger' version '4.0.0' - id 'org.ajoberstar.grgit' version '5.2.2' id "com.github.ben-manes.versions" version '0.51.0' - id 'ru.vyarus.mkdocs' version '3.0.0' + id 'ru.vyarus.mkdocs' version '4.0.1' apply false id "com.github.spotbugs" version "6.0.9" id 'com.diffplug.spotless' version '6.25.0' id 'io.github.gradle-nexus.publish-plugin' version '2.0.0' @@ -36,11 +34,11 @@ apply from: "$rootDir/gradle-scripts/jacoco.gradle" apply from: "$rootDir/gradle-scripts/spotbugs.gradle" apply from: "$rootDir/gradle-scripts/maven-publish.gradle" apply from: "$rootDir/gradle-scripts/nexus-publish.gradle" -apply from: "$rootDir/gradle-scripts/javadocs-publish.gradle" apply from: "$rootDir/gradle-scripts/set-library-version.gradle" -apply from: "$rootDir/gradle-scripts/execution-order.gradle" apply from: "$rootDir/gradle-scripts/mkdocs.gradle" +apply from: "$rootDir/gradle-scripts/javadocs-publish.gradle" apply from: "$rootDir/gradle-scripts/spotless.gradle" +apply from: "$rootDir/gradle-scripts/execution-order.gradle" dependencies { implementation "com.commercetools.sdk:commercetools-http-client:${commercetoolsJavaSdkV2Version}" diff --git a/gradle-scripts/mkdocs.gradle b/gradle-scripts/mkdocs.gradle index fad615241b..d25e5e3b13 100644 --- a/gradle-scripts/mkdocs.gradle +++ b/gradle-scripts/mkdocs.gradle @@ -1,6 +1,8 @@ +apply plugin: 'ru.vyarus.mkdocs' + mkdocs { // mkdocs sources - sourcesDir = '.' // default is 'docs' in the root directory. + sourcesDir = "." // default is 'doc' in the root directory. // strict build (fail on build errors) strict = true // target build directory (publication root) diff --git a/src/integration-test/java/com/commercetools/sync/integration/externalsource/products/ProductSyncIT.java b/src/integration-test/java/com/commercetools/sync/integration/externalsource/products/ProductSyncIT.java index 8580d3381f..ed8c338682 100644 --- a/src/integration-test/java/com/commercetools/sync/integration/externalsource/products/ProductSyncIT.java +++ b/src/integration-test/java/com/commercetools/sync/integration/externalsource/products/ProductSyncIT.java @@ -78,6 +78,7 @@ import java.util.Locale; import java.util.Optional; import java.util.Set; +import java.util.UUID; import javax.annotation.Nonnull; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -955,6 +956,62 @@ void sync_withANullDraftInBatch_ShouldNotSyncItAndTriggerErrorCallBack() { assertThat(warningCallBackMessages).isEmpty(); } + @Test + void test_Generic_NPE_error_without_details_on_product_import() { + // preparation + final List<ProductUpdateAction> updateActions = new ArrayList<>(); + final TriConsumer<SyncException, Optional<ProductDraft>, Optional<ProductProjection>> + warningCallBack = + (exception, newResource, oldResource) -> + warningCallBackMessages.add(exception.getMessage()); + + final ProductSyncOptions customOptions = + ProductSyncOptionsBuilder.of(TestClientUtils.CTP_TARGET_CLIENT) + .errorCallback( + (exception, oldResource, newResource, actions) -> + collectErrors(exception.getMessage(), exception.getCause())) + .warningCallback(warningCallBack) + .beforeUpdateCallback( + (actions, draft, old) -> { + updateActions.addAll(actions); + return actions; + }) + .build(); + + final ProductDraft productDraft = + createProductDraftBuilder( + PRODUCT_KEY_1_RESOURCE_PATH, + ProductTypeResourceIdentifierBuilder.of().key(productType.getKey()).build()) + .slug(LocalizedString.of(Locale.ENGLISH, "slug")) + .categories(emptyList()) + .taxCategory((TaxCategoryResourceIdentifier) null) + .state((StateResourceIdentifier) null) + .build(); + + final ProductDraft productDraft2 = + createProductDraftBuilder( + PRODUCT_KEY_1_RESOURCE_PATH, + ProductTypeResourceIdentifierBuilder.of().key(productType.getKey()).build()) + .key(UUID.randomUUID().toString()) + .slug(LocalizedString.of(Locale.ENGLISH, "slug")) + .categories(emptyList()) + .taxCategory((TaxCategoryResourceIdentifier) null) + .state((StateResourceIdentifier) null) + .build(); + + // test + final ProductSync productSync = new ProductSync(customOptions); + productSync.sync(singletonList(productDraft)).toCompletableFuture().join(); + final ProductSyncStatistics syncStatistics = + productSync.sync(singletonList(productDraft2)).toCompletableFuture().join(); + + assertThat(syncStatistics).hasValues(2, 0, 1, 1, 0); + assertThat(this.errorCallBackExceptions.get(0).getCause().getMessage()) + .contains("A duplicate value '\\\"slug\\\"' exists for field"); + assertThat(this.errorCallBackMessages.get(0)) + .contains("A duplicate value '\\\"slug\\\"' exists for field"); + } + @Test void sync_withProductContainingAttributeChanges_shouldSyncProductCorrectly() { // preparation