diff --git a/commercetools/commercetools-sdk-java-api/src/integrationTest/java/commercetools/custom_command/CartDecoratorTest.java b/commercetools/commercetools-sdk-java-api/src/integrationTest/java/commercetools/custom_command/CartDecoratorTest.java new file mode 100644 index 00000000000..81e4a17bf90 --- /dev/null +++ b/commercetools/commercetools-sdk-java-api/src/integrationTest/java/commercetools/custom_command/CartDecoratorTest.java @@ -0,0 +1,118 @@ + +package commercetools.custom_command; + +import java.net.URI; +import java.time.Duration; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; + +import com.commercetools.api.client.ByProjectKeyCartsByIDPost; +import com.commercetools.api.client.ProjectApiRoot; +import com.commercetools.api.models.cart.*; +import commercetools.utils.CommercetoolsTestUtils; + +import io.vrap.rmf.base.client.ApiHttpClient; +import io.vrap.rmf.base.client.ApiHttpRequest; +import io.vrap.rmf.base.client.ApiHttpResponse; +import io.vrap.rmf.base.client.CreateHttpRequestCommand; +import io.vrap.rmf.base.client.ResponseSerializer; + +import org.junit.jupiter.api.Test; + +public class CartDecoratorTest { + @Test + public void decoratedClient() { + final ProjectApiRoot apiRoot = CommercetoolsTestUtils.getProjectApiRoot(); + final DecoratedApiHttpClient client = new DecoratedApiHttpClient(apiRoot.getApiHttpClient(), true); + final ProjectApiRoot decoratedRoot = ProjectApiRoot.fromClient(apiRoot.getProjectKey(), client); + final CartDraft cartDraft = CartDraftBuilder.of().currency("EUR").build(); + + final CartRecalculateAction cartRecalculateAction = CartUpdateActionBuilder.of().recalculateBuilder().build(); + final CartChangeTaxModeAction cartChangeTaxModeAction = CartUpdateActionBuilder.of() + .changeTaxModeBuilder() + .taxMode(TaxMode.DISABLED) + .build(); + final Cart cart = decoratedRoot.carts().create(cartDraft).execute().thenApply(ApiHttpResponse::getBody).join(); + final Cart updatedCart = decoratedRoot.carts() + .withId(cart.getId()) + .post(IncludeCartCartUpdateBuilder.of() + .cart(cart) + .version(cart.getVersion()) + .actions(cartRecalculateAction, cartChangeTaxModeAction) + .build()) + .execute() + .thenApply(ApiHttpResponse::getBody) + .join(); + } + + public static class DecoratedApiHttpClient implements ApiHttpClient { + private final ApiHttpClient apiHttpClient; + + private ApiHttpRequest lastRequest; + + private boolean enableResetLineItemExternalTotals; + + public DecoratedApiHttpClient(ApiHttpClient apiHttpClient, boolean enableResetLineItemExternalTotals) { + this.apiHttpClient = apiHttpClient; + this.enableResetLineItemExternalTotals = enableResetLineItemExternalTotals; + } + + @Override + public ResponseSerializer getSerializerService() { + return apiHttpClient.getSerializerService(); + } + + @Override + public URI getBaseUri() { + return apiHttpClient.getBaseUri(); + } + + @Override + public CompletableFuture> execute(ApiHttpRequest request) { + lastRequest = request; + return apiHttpClient.execute(request); + } + + @Override + public CompletableFuture> execute(CreateHttpRequestCommand request, + Function, ApiHttpResponse> mapper) { + return ApiHttpClient.super.execute(resetLineItemExternalTotals(request), mapper); + } + + @Override + public ApiHttpResponse executeBlocking(CreateHttpRequestCommand method, + Function, ApiHttpResponse> mapper, Duration timeout) { + return ApiHttpClient.super.executeBlocking(resetLineItemExternalTotals(method), mapper, timeout); + } + + @Override + public CompletableFuture> send(CreateHttpRequestCommand method) { + return ApiHttpClient.super.send(resetLineItemExternalTotals(method)); + } + + @Override + public ApiHttpResponse sendBlocking(CreateHttpRequestCommand method, Duration timeout) { + return ApiHttpClient.super.sendBlocking(resetLineItemExternalTotals(method), timeout); + } + + @Override + public void close() throws Exception { + apiHttpClient.close(); + } + + public CreateHttpRequestCommand resetLineItemExternalTotals(CreateHttpRequestCommand method) { + if (enableResetLineItemExternalTotals && method instanceof ByProjectKeyCartsByIDPost) { + final ByProjectKeyCartsByIDPost byProjectKeyCartsByIDPost = (ByProjectKeyCartsByIDPost) method; + final CartUpdate cartUpdate = byProjectKeyCartsByIDPost.getBody(); + if (cartUpdate instanceof WithCartCartUpdateImpl) { + final WithCartCartUpdateImpl withCartCartUpdate = (WithCartCartUpdateImpl) cartUpdate; + final Cart cart = withCartCartUpdate.getCart(); + + // do sth with the cart + } + } + + return method; + } + } +} diff --git a/commercetools/commercetools-sdk-java-api/src/integrationTest/java/commercetools/custom_command/IncludeCartCartUpdateBuilder.java b/commercetools/commercetools-sdk-java-api/src/integrationTest/java/commercetools/custom_command/IncludeCartCartUpdateBuilder.java new file mode 100644 index 00000000000..cd15ff80c9d --- /dev/null +++ b/commercetools/commercetools-sdk-java-api/src/integrationTest/java/commercetools/custom_command/IncludeCartCartUpdateBuilder.java @@ -0,0 +1,37 @@ + +package commercetools.custom_command; + +import java.util.List; +import java.util.Objects; + +import com.commercetools.api.models.cart.Cart; +import com.commercetools.api.models.cart.CartUpdate; +import com.commercetools.api.models.cart.CartUpdateAction; +import com.commercetools.api.models.cart.CartUpdateBuilder; + +public class IncludeCartCartUpdateBuilder extends CartUpdateBuilder { + private Cart cart; + + public Cart getCart() { + return cart; + } + + public IncludeCartCartUpdateBuilder cart(Cart cart) { + this.cart = cart; + return this; + } + + public static IncludeCartCartUpdateBuilder of() { + return new IncludeCartCartUpdateBuilder(); + } + + @Override + public CartUpdate build() { + final Long version = super.getVersion(); + final List actions = super.getActions(); + Objects.requireNonNull(version, CartUpdate.class + ": version is missing"); + Objects.requireNonNull(actions, CartUpdate.class + ": actions is missing"); + Objects.requireNonNull(cart, CartUpdate.class + ": cart is missing"); + return new WithCartCartUpdateImpl(cart, version, actions); + } +} diff --git a/commercetools/commercetools-sdk-java-api/src/integrationTest/java/commercetools/custom_command/WithCartCartUpdateImpl.java b/commercetools/commercetools-sdk-java-api/src/integrationTest/java/commercetools/custom_command/WithCartCartUpdateImpl.java new file mode 100644 index 00000000000..c1d49456ad0 --- /dev/null +++ b/commercetools/commercetools-sdk-java-api/src/integrationTest/java/commercetools/custom_command/WithCartCartUpdateImpl.java @@ -0,0 +1,24 @@ + +package commercetools.custom_command; + +import com.commercetools.api.models.cart.Cart; + +public class WithCartCartUpdateImpl extends com.commercetools.api.models.cart.CartUpdateImpl { + + private Cart cart; + + public WithCartCartUpdateImpl(final Cart cart, final Long version, + final java.util.List actions) { + this.cart = cart; + super.setActions(actions); + super.setVersion(version); + } + + public Cart getCart() { + return cart; + } + + public void setCart(final Cart cart) { + this.cart = cart; + } +}