From 5a1ab8d5bdb43a428067d5b886a973d3321d1eb9 Mon Sep 17 00:00:00 2001 From: praveenkumarct Date: Wed, 8 Sep 2021 11:55:58 +0200 Subject: [PATCH 1/3] Set NoShipping to 1, When address is missing. --- .../model/common/AuthorizationRequest.java | 9 ++ .../payone/mapping/MappingUtil.java | 40 ++++--- .../main/BasicPaymentRequestWorkflow.java | 100 +++++++++++++++- .../payone/mapping/MappingUtilTest.java | 113 +++++++++++++++--- 4 files changed, 222 insertions(+), 40 deletions(-) diff --git a/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/common/AuthorizationRequest.java b/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/common/AuthorizationRequest.java index 694bbb1b99..6f0af287ef 100644 --- a/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/common/AuthorizationRequest.java +++ b/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/common/AuthorizationRequest.java @@ -120,6 +120,7 @@ public class AuthorizationRequest extends BaseRequest { private String backurl; + private int noShipping; protected AuthorizationRequest(final PayoneConfig config, final String requestType, final String clearingtype) { super(config, requestType); @@ -436,4 +437,12 @@ public String getBackurl() { public void setBackurl(final String backurl) { this.backurl = backurl; } + + public int getNoShipping() { + return noShipping; + } + + public void setNoShipping(int noShipping) { + this.noShipping = noShipping; + } } diff --git a/service/src/main/java/com/commercetools/pspadapter/payone/mapping/MappingUtil.java b/service/src/main/java/com/commercetools/pspadapter/payone/mapping/MappingUtil.java index 3c9e2c8994..d39e3d4eec 100644 --- a/service/src/main/java/com/commercetools/pspadapter/payone/mapping/MappingUtil.java +++ b/service/src/main/java/com/commercetools/pspadapter/payone/mapping/MappingUtil.java @@ -129,22 +129,30 @@ public static void mapCustomerToRequest(@Nonnull final AuthorizationRequest requ public static void mapShippingAddressToRequest(final AuthorizationRequest request, final Address shippingAddress) { - if(shippingAddress == null) { - throw new IllegalArgumentException("Missing shipping address details"); - } - - request.setShipping_firstname(shippingAddress.getFirstName()); - request.setShipping_lastname(shippingAddress.getLastName()); - request.setShipping_street(joinStringsIgnoringNull(Arrays.asList(shippingAddress.getStreetName(), - shippingAddress.getStreetNumber()))); - request.setShipping_zip(shippingAddress.getPostalCode()); - request.setShipping_city(shippingAddress.getCity()); - request.setShipping_country(shippingAddress.getCountry().toLocale().getCountry()); - request.setShipping_company(joinStringsIgnoringNull(Arrays.asList(shippingAddress.getCompany(), - shippingAddress.getDepartment()))); - - if (countriesWithStateAllowed.contains(shippingAddress.getCountry())) { - request.setShipping_state(shippingAddress.getState()); + final String shippingCountry = shippingAddress.getCountry().toLocale().getCountry(); + final String shipping_street = joinStringsIgnoringNull(asList(shippingAddress.getStreetName(), + shippingAddress.getStreetNumber())); + + if(shippingAddress == null + || StringUtils.isBlank(shippingAddress.getPostalCode()) + || StringUtils.isBlank(shippingCountry) + || StringUtils.isBlank(shipping_street) + || StringUtils.isBlank(shippingAddress.getCity()) + ) { + request.setNoShipping(1); + } else { + request.setShipping_firstname(shippingAddress.getFirstName()); + request.setShipping_lastname(shippingAddress.getLastName()); + request.setShipping_street(shipping_street); + request.setShipping_zip(shippingAddress.getPostalCode()); + request.setShipping_city(shippingAddress.getCity()); + request.setShipping_country(shippingCountry); + request.setShipping_company(joinStringsIgnoringNull(Arrays.asList(shippingAddress.getCompany(), + shippingAddress.getDepartment()))); + + if (countriesWithStateAllowed.contains(shippingAddress.getCountry())) { + request.setShipping_state(shippingAddress.getState()); + } } } diff --git a/service/src/test/java/com/commercetools/main/BasicPaymentRequestWorkflow.java b/service/src/test/java/com/commercetools/main/BasicPaymentRequestWorkflow.java index ac8cb047a4..01a77b81bf 100644 --- a/service/src/test/java/com/commercetools/main/BasicPaymentRequestWorkflow.java +++ b/service/src/test/java/com/commercetools/main/BasicPaymentRequestWorkflow.java @@ -2,24 +2,51 @@ import com.commercetools.Main; import com.commercetools.pspadapter.payone.config.PropertyProvider; +import com.commercetools.pspadapter.payone.domain.ctp.CustomTypeBuilder; +import com.commercetools.pspadapter.payone.mapping.CustomFieldKeys; +import com.neovisionaries.i18n.CountryCode; +import io.sphere.sdk.carts.CartDraft; +import io.sphere.sdk.carts.CartDraftBuilder; +import io.sphere.sdk.carts.commands.CartCreateCommand; +import io.sphere.sdk.carts.commands.CartUpdateCommand; +import io.sphere.sdk.carts.commands.updateactions.AddPayment; +import io.sphere.sdk.carts.commands.updateactions.SetBillingAddress; +import io.sphere.sdk.carts.commands.updateactions.SetShippingAddress; +import io.sphere.sdk.models.Address; import io.sphere.sdk.payments.Payment; +import io.sphere.sdk.payments.PaymentDraft; +import io.sphere.sdk.payments.PaymentDraftBuilder; +import io.sphere.sdk.payments.PaymentMethodInfoBuilder; +import io.sphere.sdk.payments.TransactionDraftBuilder; import io.sphere.sdk.payments.TransactionState; +import io.sphere.sdk.payments.TransactionType; +import io.sphere.sdk.payments.commands.PaymentCreateCommand; +import io.sphere.sdk.payments.commands.PaymentUpdateCommand; +import io.sphere.sdk.payments.commands.updateactions.AddTransaction; import io.sphere.sdk.payments.queries.PaymentQuery; import io.sphere.sdk.queries.PagedQueryResult; import io.sphere.sdk.queries.QueryPredicate; +import io.sphere.sdk.types.CustomFieldsDraft; +import io.sphere.sdk.utils.MoneyImpl; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; -import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; -import java.net.URISyntaxException; +import javax.annotation.Nonnull; +import javax.money.Monetary; +import javax.money.MonetaryAmount; +import java.time.ZonedDateTime; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.function.Function; import static com.commercetools.pspadapter.payone.domain.payone.PayonePostServiceImpl.executeGetRequest; import static com.commercetools.pspadapter.payone.domain.payone.model.common.ResponseStatus.APPROVED; +import static com.commercetools.pspadapter.payone.domain.payone.model.common.ResponseStatus.REDIRECT; import static java.lang.String.format; import static org.assertj.core.api.Assertions.assertThat; import static util.PaymentRequestHelperUtil.CTP_CLIENT; @@ -37,10 +64,10 @@ public class BasicPaymentRequestWorkflow { public static final int DEFAULT_PORT = 8080; - private final Map testInternalProperties = new HashMap<>(); + private static final Map testInternalProperties = new HashMap<>(); - @Before - public void setUp() throws URISyntaxException { + @BeforeClass + public static void setUp() { testInternalProperties.put("TENANTS", getTenant()); testInternalProperties.put("TEST_DATA_CT_PROJECT_KEY", getProjectKey()); @@ -89,4 +116,67 @@ public void verifyCreditCardTransferPayoneRequestIsSuccess() throws Exception { assertThat(payment.getTransactions().get(0).getState()).isEqualTo(TransactionState.SUCCESS); }); } + + @Test + public void verifyPaypalWalletTransferPayoneAuthorizationRequestIsSuccess() throws Exception { + // Prepare + final String paymentId = preparePaymentWithAuthorizedAmountAndOrder(); + + // Test + final HttpResponse httpResponse = executeGetRequest(format(URL_HANDLE_PAYMENT+paymentId, DEFAULT_PORT)); + + // Assert + assertThat(httpResponse.getStatusLine().getStatusCode()).isIn(HttpStatus.SC_ACCEPTED, HttpStatus.SC_OK); + + final PagedQueryResult paymentPagedQueryResult = + CTP_CLIENT.execute(PaymentQuery.of() + .withPredicates(QueryPredicate.of(format("id=\"%s\"", paymentId)))) + .toCompletableFuture().join(); + + assertThat(paymentPagedQueryResult.getResults().get(0)) + .satisfies( + payment -> { + assertThat(payment.getPaymentStatus().getInterfaceCode()).isEqualTo(REDIRECT.toString()); + }); + } + + @Nonnull + private static String preparePaymentWithAuthorizedAmountAndOrder() { + final Map customFieldKeysMap = new HashMap<>(); + customFieldKeysMap.put(CustomFieldKeys.SUCCESS_URL_FIELD, "https://example.com/success"); + customFieldKeysMap.put(CustomFieldKeys.ERROR_URL_FIELD, "https://example.com/error"); + customFieldKeysMap.put(CustomFieldKeys.CANCEL_URL_FIELD, "https://example.com/cancel"); + customFieldKeysMap.put(CustomFieldKeys.REDIRECT_URL_FIELD, "https://example.com/redirect"); + customFieldKeysMap.put(CustomFieldKeys.REFERENCE_FIELD, String.valueOf(new Random().nextInt() + System.nanoTime())); + customFieldKeysMap.put(CustomFieldKeys.LANGUAGE_CODE_FIELD, "en"); + + final MonetaryAmount monetaryAmount = MoneyImpl.ofCents(4000, "EUR"); + final PaymentDraft paymentDraft = + PaymentDraftBuilder.of(monetaryAmount) + .paymentMethodInfo(PaymentMethodInfoBuilder.of() + .method("WALLET-PAYPAL") + .paymentInterface("PAYONE") + .build()) + .custom(CustomFieldsDraft.ofTypeKeyAndObjects( + CustomTypeBuilder.PAYMENT_WALLET, customFieldKeysMap)) + .build(); + + final Payment payment = CTP_CLIENT.executeBlocking(PaymentCreateCommand.of(paymentDraft)); + final CartDraft cartDraft = CartDraftBuilder.of(Monetary.getCurrency("EUR")).build(); + + CTP_CLIENT.executeBlocking(CartUpdateCommand.of( + CTP_CLIENT.executeBlocking(CartCreateCommand.of(cartDraft)), + Arrays.asList( + AddPayment.of(payment), + SetShippingAddress.of(Address.of(CountryCode.DE)), + SetBillingAddress.of(Address.of(CountryCode.DE).withLastName("Test Buyer")) + ))); + + CTP_CLIENT.executeBlocking(PaymentUpdateCommand.of(payment, AddTransaction.of(TransactionDraftBuilder + .of(TransactionType.AUTHORIZATION, monetaryAmount, ZonedDateTime.now()) + .state(TransactionState.PENDING) + .build()))); + + return payment.getId(); + } } diff --git a/service/src/test/java/com/commercetools/pspadapter/payone/mapping/MappingUtilTest.java b/service/src/test/java/com/commercetools/pspadapter/payone/mapping/MappingUtilTest.java index 5328c8b395..b13123e2fc 100644 --- a/service/src/test/java/com/commercetools/pspadapter/payone/mapping/MappingUtilTest.java +++ b/service/src/test/java/com/commercetools/pspadapter/payone/mapping/MappingUtilTest.java @@ -70,7 +70,7 @@ public void setUp() throws Exception { } @Test - public void testCountryStateMapping() { + public void testBillingAddressCountryStateMapping() { Address addressDE = Address.of(DE) .withState("AK"); Address addressUS = Address.of(CountryCode.US) @@ -84,20 +84,45 @@ public void testCountryStateMapping() { paymentWithCartLike); MappingUtil.mapBillingAddressToRequest(authorizationRequestDE, addressDE); - MappingUtil.mapShippingAddressToRequest(authorizationRequestDE, addressDE); MappingUtil.mapBillingAddressToRequest(authorizationRequestUS, addressUS); - MappingUtil.mapShippingAddressToRequest(authorizationRequestUS, addressUS); softly.assertThat(authorizationRequestDE.getState()).as("DE billing address state").isNullOrEmpty(); - softly.assertThat(authorizationRequestDE.getShipping_state()).as("DE shipping address state").isNullOrEmpty(); softly.assertThat(authorizationRequestUS.getState()).as("US billing address state").isEqualTo("AK"); + + softly.assertAll(); + } + + @Test + public void testShippingAddressCountryStateMapping() { + Address addressDE = Address.of(DE) + .withCity("City") + .withPostalCode("123") + .withStreetNumber("5") + .withState("AK"); + Address addressUS = Address.of(CountryCode.US) + .withCity("City") + .withPostalCode("123") + .withStreetName("test Street Name") + .withState("AK"); + + CreditCardAuthorizationRequest authorizationRequestDE = + new CreditCardAuthorizationRequest(new PayoneConfig(tenantPropertyProvider), "000123", + paymentWithCartLike); + CreditCardAuthorizationRequest authorizationRequestUS = + new CreditCardAuthorizationRequest(new PayoneConfig(tenantPropertyProvider), "000123", + paymentWithCartLike); + + MappingUtil.mapShippingAddressToRequest(authorizationRequestDE, addressDE); + MappingUtil.mapShippingAddressToRequest(authorizationRequestUS, addressUS); + + softly.assertThat(authorizationRequestDE.getShipping_state()).as("DE shipping address state").isNullOrEmpty(); softly.assertThat(authorizationRequestUS.getShipping_state()).as("US shipping address state").isEqualTo("AK"); softly.assertAll(); } @Test - public void streetJoiningFull() { + public void billingAddressStreetJoiningFull() { Address addressWithNameNumber = Address.of(DE) .withStreetName("Test Street") .withStreetNumber("2"); @@ -107,16 +132,29 @@ public void streetJoiningFull() { paymentWithCartLike); MappingUtil.mapBillingAddressToRequest(authorizationRequestWithNameNumber, addressWithNameNumber); - MappingUtil.mapShippingAddressToRequest(authorizationRequestWithNameNumber, addressWithNameNumber); - softly.assertThat(authorizationRequestWithNameNumber.getStreet()).as("billing address state").isEqualTo(addressWithNameNumber.getStreetName() + " " + addressWithNameNumber.getStreetNumber()); - softly.assertThat(authorizationRequestWithNameNumber.getShipping_street()).as("shipping address state").isEqualTo(addressWithNameNumber.getStreetName() + " " + addressWithNameNumber.getStreetNumber()); + assertThat(authorizationRequestWithNameNumber.getStreet()).as("billing address state").isEqualTo(addressWithNameNumber.getStreetName() + " " + addressWithNameNumber.getStreetNumber()); + } - softly.assertAll(); + @Test + public void ShippingAddressStreetJoiningFull() { + Address addressWithNameNumber = Address.of(DE) + .withPostalCode("123") + .withCity("City") + .withStreetName("Test Street") + .withStreetNumber("2"); + + CreditCardAuthorizationRequest authorizationRequestWithNameNumber = + new CreditCardAuthorizationRequest(new PayoneConfig(tenantPropertyProvider), "000123", + paymentWithCartLike); + + MappingUtil.mapShippingAddressToRequest(authorizationRequestWithNameNumber, addressWithNameNumber); + + assertThat(authorizationRequestWithNameNumber.getShipping_street()).as("shipping address state").isEqualTo(addressWithNameNumber.getStreetName() + " " + addressWithNameNumber.getStreetNumber()); } @Test - public void streetJoiningNoNumber() { + public void billingAddressStreetJoiningNoNumber() { Address addressNoNumber = Address.of(DE) .withStreetName("Test Street"); @@ -125,16 +163,28 @@ public void streetJoiningNoNumber() { paymentWithCartLike); MappingUtil.mapBillingAddressToRequest(authorizationRequestNoNumber, addressNoNumber); - MappingUtil.mapShippingAddressToRequest(authorizationRequestNoNumber, addressNoNumber); - softly.assertThat(authorizationRequestNoNumber.getStreet()).as("billing address state").isEqualTo(addressNoNumber.getStreetName()); - softly.assertThat(authorizationRequestNoNumber.getShipping_street()).as("shipping address state").isEqualTo(addressNoNumber.getStreetName()); + assertThat(authorizationRequestNoNumber.getStreet()).as("billing address state").isEqualTo(addressNoNumber.getStreetName()); + } - softly.assertAll(); + @Test + public void shippingAddressStreetJoiningNoNumber() { + Address addressNoNumber = Address.of(DE) + .withCity("City") + .withPostalCode("123") + .withStreetName("Test Street"); + + CreditCardAuthorizationRequest authorizationRequestNoNumber = + new CreditCardAuthorizationRequest(new PayoneConfig(tenantPropertyProvider), "000123", + paymentWithCartLike); + + MappingUtil.mapShippingAddressToRequest(authorizationRequestNoNumber, addressNoNumber); + + assertThat(authorizationRequestNoNumber.getShipping_street()).as("shipping address state").isEqualTo(addressNoNumber.getStreetName()); } @Test - public void streetJoiningNoName() { + public void billingAddressStreetJoiningNoName() { Address addressNoName = Address.of(DE) .withStreetNumber("5"); @@ -143,13 +193,38 @@ public void streetJoiningNoName() { paymentWithCartLike); MappingUtil.mapBillingAddressToRequest(authorizationRequestNoName, addressNoName); + + assertThat(authorizationRequestNoName.getStreet()).as("DE billing address state").isEqualTo("5"); + } + + @Test + public void shippingAddressStreetJoiningNoName() { + Address addressNoName = Address.of(DE) + .withCity("City") + .withPostalCode("123") + .withStreetNumber("5"); + + CreditCardAuthorizationRequest authorizationRequestNoName = + new CreditCardAuthorizationRequest(new PayoneConfig(tenantPropertyProvider), "000123", + paymentWithCartLike); + MappingUtil.mapShippingAddressToRequest(authorizationRequestNoName, addressNoName); - softly.assertThat(authorizationRequestNoName.getStreet()).as("DE billing address state").isEqualTo("5"); - softly.assertThat(authorizationRequestNoName.getShipping_street()).as("DE shipping address state").isEqualTo( - "5"); + assertThat(authorizationRequestNoName.getShipping_street()).as("DE shipping address state").isEqualTo( + "5"); + } - softly.assertAll(); + @Test + public void shippingAddressMissingSetNoShippingToOne() { + Address addressMissingFields = Address.of(DE); + + CreditCardAuthorizationRequest authorizationRequestMissingAddress = + new CreditCardAuthorizationRequest(new PayoneConfig(tenantPropertyProvider), "000123", + paymentWithCartLike); + + MappingUtil.mapShippingAddressToRequest(authorizationRequestMissingAddress, addressMissingFields); + + assertThat(authorizationRequestMissingAddress.getNoShipping()).as("DE shipping address noShipping").isEqualTo(1); } @Test From 6f1625eeeb82416971e4847793c27599ec452c7e Mon Sep 17 00:00:00 2001 From: praveenkumarct Date: Thu, 9 Sep 2021 11:23:12 +0200 Subject: [PATCH 2/3] Move noShipping parameter only to Paypal wallet transcations. --- .../model/common/AuthorizationRequest.java | 10 -- .../wallet/WalletAuthorizationRequest.java | 9 +- .../wallet/WalletPreauthorizationRequest.java | 10 +- .../payone/mapping/MappingUtil.java | 39 +++-- .../payone/mapping/PayoneRequestFactory.java | 3 +- .../payone/mapping/WalletRequestFactory.java | 11 +- .../mapping/BaseWalletRequestFactoryTest.java | 4 +- .../payone/mapping/MappingUtilTest.java | 134 +++++++----------- .../pspadapter/tenant/TenantFactoryTest.java | 3 +- 9 files changed, 109 insertions(+), 114 deletions(-) diff --git a/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/common/AuthorizationRequest.java b/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/common/AuthorizationRequest.java index 6f0af287ef..7eb01786fc 100644 --- a/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/common/AuthorizationRequest.java +++ b/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/common/AuthorizationRequest.java @@ -120,8 +120,6 @@ public class AuthorizationRequest extends BaseRequest { private String backurl; - private int noShipping; - protected AuthorizationRequest(final PayoneConfig config, final String requestType, final String clearingtype) { super(config, requestType); @@ -437,12 +435,4 @@ public String getBackurl() { public void setBackurl(final String backurl) { this.backurl = backurl; } - - public int getNoShipping() { - return noShipping; - } - - public void setNoShipping(int noShipping) { - this.noShipping = noShipping; - } } diff --git a/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/wallet/WalletAuthorizationRequest.java b/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/wallet/WalletAuthorizationRequest.java index 5356d9afba..4d5ca98d97 100644 --- a/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/wallet/WalletAuthorizationRequest.java +++ b/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/wallet/WalletAuthorizationRequest.java @@ -13,10 +13,13 @@ public class WalletAuthorizationRequest extends AuthorizationRequest { private String wallettype; - public WalletAuthorizationRequest(final PayoneConfig config, final ClearingType clearingType) { + private int noShipping; + + public WalletAuthorizationRequest(final PayoneConfig config, final ClearingType clearingType, final int noShipping) { super(config, RequestType.AUTHORIZATION.getType(), clearingType.getPayoneCode()); this.wallettype = clearingType.getSubType(); + this.noShipping = noShipping; } //************************************************************** @@ -27,4 +30,8 @@ public WalletAuthorizationRequest(final PayoneConfig config, final ClearingType public String getWallettype() { return wallettype; } + + public int getNoShipping() { + return noShipping; + } } diff --git a/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/wallet/WalletPreauthorizationRequest.java b/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/wallet/WalletPreauthorizationRequest.java index f29d3892b0..4c3b1477a7 100644 --- a/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/wallet/WalletPreauthorizationRequest.java +++ b/service/src/main/java/com/commercetools/pspadapter/payone/domain/payone/model/wallet/WalletPreauthorizationRequest.java @@ -13,10 +13,13 @@ public class WalletPreauthorizationRequest extends AuthorizationRequest { private String wallettype; - public WalletPreauthorizationRequest(final PayoneConfig config, final ClearingType clearingType) { + private int noShipping; + + public WalletPreauthorizationRequest(final PayoneConfig config, final ClearingType clearingType, final int noShipping) { super(config, RequestType.PREAUTHORIZATION.getType(), clearingType.getPayoneCode()); this.wallettype = clearingType.getSubType(); + this.noShipping = noShipping; } //************************************************************** @@ -27,4 +30,9 @@ public WalletPreauthorizationRequest(final PayoneConfig config, final ClearingTy public String getWallettype() { return wallettype; } + + public int getNoShipping() { + return noShipping; + } + } diff --git a/service/src/main/java/com/commercetools/pspadapter/payone/mapping/MappingUtil.java b/service/src/main/java/com/commercetools/pspadapter/payone/mapping/MappingUtil.java index d39e3d4eec..0f9b6f2834 100644 --- a/service/src/main/java/com/commercetools/pspadapter/payone/mapping/MappingUtil.java +++ b/service/src/main/java/com/commercetools/pspadapter/payone/mapping/MappingUtil.java @@ -1,6 +1,7 @@ package com.commercetools.pspadapter.payone.mapping; import com.commercetools.pspadapter.payone.domain.ctp.PaymentWithCartLike; +import com.commercetools.pspadapter.payone.domain.ctp.paymentmethods.MethodKeys; import com.commercetools.pspadapter.payone.domain.payone.model.common.AuthorizationRequest; import com.neovisionaries.i18n.CountryCode; import io.sphere.sdk.carts.CartLike; @@ -127,33 +128,41 @@ public static void mapCustomerToRequest(@Nonnull final AuthorizationRequest requ }); } - public static void mapShippingAddressToRequest(final AuthorizationRequest request, final Address shippingAddress) { + public static void mapShippingAddressToRequest(final AuthorizationRequest request, + final Address shippingAddress, + final String paymentMethod) { - final String shippingCountry = shippingAddress.getCountry().toLocale().getCountry(); - final String shipping_street = joinStringsIgnoringNull(asList(shippingAddress.getStreetName(), - shippingAddress.getStreetNumber())); - - if(shippingAddress == null - || StringUtils.isBlank(shippingAddress.getPostalCode()) - || StringUtils.isBlank(shippingCountry) - || StringUtils.isBlank(shipping_street) - || StringUtils.isBlank(shippingAddress.getCity()) - ) { - request.setNoShipping(1); - } else { + if(shippingAddress != null) { request.setShipping_firstname(shippingAddress.getFirstName()); request.setShipping_lastname(shippingAddress.getLastName()); - request.setShipping_street(shipping_street); + request.setShipping_street(joinStringsIgnoringNull(Arrays.asList(shippingAddress.getStreetName(), + shippingAddress.getStreetNumber()))); request.setShipping_zip(shippingAddress.getPostalCode()); request.setShipping_city(shippingAddress.getCity()); - request.setShipping_country(shippingCountry); + request.setShipping_country(shippingAddress.getCountry().toLocale().getCountry()); request.setShipping_company(joinStringsIgnoringNull(Arrays.asList(shippingAddress.getCompany(), shippingAddress.getDepartment()))); if (countriesWithStateAllowed.contains(shippingAddress.getCountry())) { request.setShipping_state(shippingAddress.getState()); } + } else if(!MethodKeys.WALLET_PAYPAL.equals(paymentMethod)) { + throw new IllegalArgumentException("Missing shipping address details"); + } + } + + public static int checkForMissingShippingAddress(Address shippingAddress) { + + if(shippingAddress == null + || StringUtils.isBlank(shippingAddress.getPostalCode()) + || StringUtils.isBlank(shippingAddress.getCity()) + || StringUtils.isBlank(shippingAddress.getCountry().toLocale().getCountry()) + || StringUtils.isBlank(joinStringsIgnoringNull(asList(shippingAddress.getStreetName(), + shippingAddress.getStreetNumber()))) + ) { + return 1; } + return 0; } public static void mapCustomFieldsFromPayment(final AuthorizationRequest request, final CustomFields ctPaymentCustomFields) { diff --git a/service/src/main/java/com/commercetools/pspadapter/payone/mapping/PayoneRequestFactory.java b/service/src/main/java/com/commercetools/pspadapter/payone/mapping/PayoneRequestFactory.java index d27f2eff52..fdca04bb6d 100644 --- a/service/src/main/java/com/commercetools/pspadapter/payone/mapping/PayoneRequestFactory.java +++ b/service/src/main/java/com/commercetools/pspadapter/payone/mapping/PayoneRequestFactory.java @@ -101,7 +101,8 @@ protected void mapFormPaymentWithCartLike(final AuthorizationRequest request, } try { - MappingUtil.mapShippingAddressToRequest(request, ctCartLike.getShippingAddress()); + MappingUtil.mapShippingAddressToRequest(request, ctCartLike.getShippingAddress(), + ctPayment.getPaymentMethodInfo().getMethod()); } catch (final IllegalArgumentException ex) { logger.debug( createTenantKeyValue(tenantConfig.getName()), diff --git a/service/src/main/java/com/commercetools/pspadapter/payone/mapping/WalletRequestFactory.java b/service/src/main/java/com/commercetools/pspadapter/payone/mapping/WalletRequestFactory.java index 318b143837..b943c2338f 100644 --- a/service/src/main/java/com/commercetools/pspadapter/payone/mapping/WalletRequestFactory.java +++ b/service/src/main/java/com/commercetools/pspadapter/payone/mapping/WalletRequestFactory.java @@ -7,6 +7,8 @@ import com.commercetools.pspadapter.payone.domain.payone.model.wallet.WalletAuthorizationRequest; import com.commercetools.pspadapter.payone.domain.payone.model.wallet.WalletPreauthorizationRequest; import com.commercetools.pspadapter.tenant.TenantConfig; +import com.commercetools.util.function.TriFunction; +import io.sphere.sdk.carts.CartLike; import io.sphere.sdk.payments.Payment; import io.sphere.sdk.payments.PaymentMethodInfo; @@ -16,7 +18,8 @@ /** * Requests factory for Wallet based payments, like PayPal and Paydirekt. *

Based on {@link PaymentMethodInfo#getMethod() Payment#paymentMethodInfo#method} value the request will be created - * with respective {@link WalletAuthorizationRequest#clearingtype} and {@link WalletAuthorizationRequest#wallettype}

+ * with respective {@link WalletAuthorizationRequest#clearingtype}, {@link WalletAuthorizationRequest#wallettype} + * and {@link WalletAuthorizationRequest#noShipping}

*/ public class WalletRequestFactory extends PayoneRequestFactory { @@ -38,16 +41,18 @@ public WalletAuthorizationRequest createAuthorizationRequest(@Nonnull final Paym @Nonnull private WR createRequestInternal(@Nonnull final PaymentWithCartLike paymentWithCartLike, - @Nonnull final BiFunction requestConstructor) { + @Nonnull final TriFunction requestConstructor) { final Payment ctPayment = paymentWithCartLike.getPayment(); + final CartLike ctCartLike = paymentWithCartLike.getCartLike(); if(ctPayment.getCustom() == null) { throw new IllegalArgumentException("Missing custom fields on payment!"); } + final int noShippingAddress = MappingUtil.checkForMissingShippingAddress(ctCartLike.getShippingAddress()); final ClearingType clearingType = ClearingType.getClearingTypeByKey(ctPayment.getPaymentMethodInfo().getMethod()); - WR request = requestConstructor.apply(getPayoneConfig(), clearingType); + WR request = requestConstructor.apply(getPayoneConfig(), clearingType, noShippingAddress); mapFormPaymentWithCartLike(request, paymentWithCartLike); diff --git a/service/src/test/java/com/commercetools/pspadapter/payone/mapping/BaseWalletRequestFactoryTest.java b/service/src/test/java/com/commercetools/pspadapter/payone/mapping/BaseWalletRequestFactoryTest.java index 2e0c6a070c..6afa7a9f93 100644 --- a/service/src/test/java/com/commercetools/pspadapter/payone/mapping/BaseWalletRequestFactoryTest.java +++ b/service/src/test/java/com/commercetools/pspadapter/payone/mapping/BaseWalletRequestFactoryTest.java @@ -58,6 +58,7 @@ protected final void createFullPreauthorizationRequestFromValidPayment(Payment p //clearing type softly.assertThat(result.getClearingtype()).isEqualTo(expectedClearingtype); softly.assertThat(result.getWallettype()).isEqualTo(expectedWalletType); + softly.assertThat(result.getNoShipping()).isEqualTo(0); //references softly.assertThat(result.getReference()).isEqualTo(paymentWithCartLike.getReference()); @@ -134,6 +135,7 @@ protected void createFullAuthorizationRequestFromValidPayment(Payment payment, //clearing type softly.assertThat(result.getClearingtype()).isEqualTo(expectedClearingtype); softly.assertThat(result.getWallettype()).isEqualTo(expectedWalletType); + softly.assertThat(result.getNoShipping()).isEqualTo(0); //references softly.assertThat(result.getReference()).isEqualTo(paymentWithCartLike.getReference()); @@ -181,4 +183,4 @@ protected void createFullAuthorizationRequestFromValidPayment(Payment payment, softly.assertAll(); } -} \ No newline at end of file +} diff --git a/service/src/test/java/com/commercetools/pspadapter/payone/mapping/MappingUtilTest.java b/service/src/test/java/com/commercetools/pspadapter/payone/mapping/MappingUtilTest.java index b13123e2fc..26ea80737b 100644 --- a/service/src/test/java/com/commercetools/pspadapter/payone/mapping/MappingUtilTest.java +++ b/service/src/test/java/com/commercetools/pspadapter/payone/mapping/MappingUtilTest.java @@ -26,6 +26,8 @@ import java.util.Locale; import java.util.Optional; +import static com.commercetools.pspadapter.payone.domain.ctp.paymentmethods.MethodKeys.CREDIT_CARD; +import static com.commercetools.pspadapter.payone.domain.ctp.paymentmethods.MethodKeys.WALLET_PAYPAL; import static com.commercetools.pspadapter.payone.mapping.CustomFieldKeys.GENDER_FIELD; import static com.commercetools.pspadapter.payone.mapping.CustomFieldKeys.LANGUAGE_CODE_FIELD; import static com.commercetools.pspadapter.payone.mapping.MappingUtil.getPaymentLanguage; @@ -70,7 +72,7 @@ public void setUp() throws Exception { } @Test - public void testBillingAddressCountryStateMapping() { + public void testCountryStateMapping() { Address addressDE = Address.of(DE) .withState("AK"); Address addressUS = Address.of(CountryCode.US) @@ -84,45 +86,20 @@ public void testBillingAddressCountryStateMapping() { paymentWithCartLike); MappingUtil.mapBillingAddressToRequest(authorizationRequestDE, addressDE); + MappingUtil.mapShippingAddressToRequest(authorizationRequestDE, addressDE, CREDIT_CARD); MappingUtil.mapBillingAddressToRequest(authorizationRequestUS, addressUS); + MappingUtil.mapShippingAddressToRequest(authorizationRequestUS, addressUS, CREDIT_CARD); softly.assertThat(authorizationRequestDE.getState()).as("DE billing address state").isNullOrEmpty(); - softly.assertThat(authorizationRequestUS.getState()).as("US billing address state").isEqualTo("AK"); - - softly.assertAll(); - } - - @Test - public void testShippingAddressCountryStateMapping() { - Address addressDE = Address.of(DE) - .withCity("City") - .withPostalCode("123") - .withStreetNumber("5") - .withState("AK"); - Address addressUS = Address.of(CountryCode.US) - .withCity("City") - .withPostalCode("123") - .withStreetName("test Street Name") - .withState("AK"); - - CreditCardAuthorizationRequest authorizationRequestDE = - new CreditCardAuthorizationRequest(new PayoneConfig(tenantPropertyProvider), "000123", - paymentWithCartLike); - CreditCardAuthorizationRequest authorizationRequestUS = - new CreditCardAuthorizationRequest(new PayoneConfig(tenantPropertyProvider), "000123", - paymentWithCartLike); - - MappingUtil.mapShippingAddressToRequest(authorizationRequestDE, addressDE); - MappingUtil.mapShippingAddressToRequest(authorizationRequestUS, addressUS); - softly.assertThat(authorizationRequestDE.getShipping_state()).as("DE shipping address state").isNullOrEmpty(); + softly.assertThat(authorizationRequestUS.getState()).as("US billing address state").isEqualTo("AK"); softly.assertThat(authorizationRequestUS.getShipping_state()).as("US shipping address state").isEqualTo("AK"); softly.assertAll(); } @Test - public void billingAddressStreetJoiningFull() { + public void streetJoiningFull() { Address addressWithNameNumber = Address.of(DE) .withStreetName("Test Street") .withStreetNumber("2"); @@ -132,29 +109,16 @@ public void billingAddressStreetJoiningFull() { paymentWithCartLike); MappingUtil.mapBillingAddressToRequest(authorizationRequestWithNameNumber, addressWithNameNumber); + MappingUtil.mapShippingAddressToRequest(authorizationRequestWithNameNumber, addressWithNameNumber, CREDIT_CARD); - assertThat(authorizationRequestWithNameNumber.getStreet()).as("billing address state").isEqualTo(addressWithNameNumber.getStreetName() + " " + addressWithNameNumber.getStreetNumber()); - } - - @Test - public void ShippingAddressStreetJoiningFull() { - Address addressWithNameNumber = Address.of(DE) - .withPostalCode("123") - .withCity("City") - .withStreetName("Test Street") - .withStreetNumber("2"); - - CreditCardAuthorizationRequest authorizationRequestWithNameNumber = - new CreditCardAuthorizationRequest(new PayoneConfig(tenantPropertyProvider), "000123", - paymentWithCartLike); - - MappingUtil.mapShippingAddressToRequest(authorizationRequestWithNameNumber, addressWithNameNumber); + softly.assertThat(authorizationRequestWithNameNumber.getStreet()).as("billing address state").isEqualTo(addressWithNameNumber.getStreetName() + " " + addressWithNameNumber.getStreetNumber()); + softly.assertThat(authorizationRequestWithNameNumber.getShipping_street()).as("shipping address state").isEqualTo(addressWithNameNumber.getStreetName() + " " + addressWithNameNumber.getStreetNumber()); - assertThat(authorizationRequestWithNameNumber.getShipping_street()).as("shipping address state").isEqualTo(addressWithNameNumber.getStreetName() + " " + addressWithNameNumber.getStreetNumber()); + softly.assertAll(); } @Test - public void billingAddressStreetJoiningNoNumber() { + public void streetJoiningNoNumber() { Address addressNoNumber = Address.of(DE) .withStreetName("Test Street"); @@ -163,28 +127,16 @@ public void billingAddressStreetJoiningNoNumber() { paymentWithCartLike); MappingUtil.mapBillingAddressToRequest(authorizationRequestNoNumber, addressNoNumber); + MappingUtil.mapShippingAddressToRequest(authorizationRequestNoNumber, addressNoNumber, CREDIT_CARD); - assertThat(authorizationRequestNoNumber.getStreet()).as("billing address state").isEqualTo(addressNoNumber.getStreetName()); - } - - @Test - public void shippingAddressStreetJoiningNoNumber() { - Address addressNoNumber = Address.of(DE) - .withCity("City") - .withPostalCode("123") - .withStreetName("Test Street"); - - CreditCardAuthorizationRequest authorizationRequestNoNumber = - new CreditCardAuthorizationRequest(new PayoneConfig(tenantPropertyProvider), "000123", - paymentWithCartLike); + softly.assertThat(authorizationRequestNoNumber.getStreet()).as("billing address state").isEqualTo(addressNoNumber.getStreetName()); + softly.assertThat(authorizationRequestNoNumber.getShipping_street()).as("shipping address state").isEqualTo(addressNoNumber.getStreetName()); - MappingUtil.mapShippingAddressToRequest(authorizationRequestNoNumber, addressNoNumber); - - assertThat(authorizationRequestNoNumber.getShipping_street()).as("shipping address state").isEqualTo(addressNoNumber.getStreetName()); + softly.assertAll(); } @Test - public void billingAddressStreetJoiningNoName() { + public void streetJoiningNoName() { Address addressNoName = Address.of(DE) .withStreetNumber("5"); @@ -193,38 +145,58 @@ public void billingAddressStreetJoiningNoName() { paymentWithCartLike); MappingUtil.mapBillingAddressToRequest(authorizationRequestNoName, addressNoName); + MappingUtil.mapShippingAddressToRequest(authorizationRequestNoName, addressNoName, CREDIT_CARD); - assertThat(authorizationRequestNoName.getStreet()).as("DE billing address state").isEqualTo("5"); - } + softly.assertThat(authorizationRequestNoName.getStreet()).as("DE billing address state").isEqualTo("5"); + softly.assertThat(authorizationRequestNoName.getShipping_street()).as("DE shipping address state").isEqualTo( + "5"); - @Test - public void shippingAddressStreetJoiningNoName() { - Address addressNoName = Address.of(DE) - .withCity("City") - .withPostalCode("123") - .withStreetNumber("5"); + softly.assertAll(); + } + @Test(expected = IllegalArgumentException.class) + public void WhenNoShippingAddressThrowException() { CreditCardAuthorizationRequest authorizationRequestNoName = new CreditCardAuthorizationRequest(new PayoneConfig(tenantPropertyProvider), "000123", paymentWithCartLike); - MappingUtil.mapShippingAddressToRequest(authorizationRequestNoName, addressNoName); + MappingUtil.mapShippingAddressToRequest(authorizationRequestNoName, null, CREDIT_CARD); + } - assertThat(authorizationRequestNoName.getShipping_street()).as("DE shipping address state").isEqualTo( - "5"); + @Test + public void WhenShippingAddressIsNullReturnOneToSetValueForNoShipping() { + + assertThat(MappingUtil.checkForMissingShippingAddress(null)).isEqualTo(1); } @Test - public void shippingAddressMissingSetNoShippingToOne() { - Address addressMissingFields = Address.of(DE); + public void WhenMissingShippingAddressReturnOneToSetValueForNoShipping() { + Address missingAddressFields = Address.of(DE) + .withStreetName("Test Street"); - CreditCardAuthorizationRequest authorizationRequestMissingAddress = + assertThat(MappingUtil.checkForMissingShippingAddress(missingAddressFields)).isEqualTo(1); + } + + @Test + public void WhenShippingAddressIsPresentReturnZeroToSetValueForNoShipping() { + Address missingAddressFields = Address.of(DE) + .withPostalCode("123") + .withStreetNumber("5") + .withStreetName("Test Street") + .withCity("Test city"); + + assertThat(MappingUtil.checkForMissingShippingAddress(missingAddressFields)).isEqualTo(0); + } + + @Test + public void WhenWalletPaymentAndNoShippingAddressShouldNotThrowException() { + CreditCardAuthorizationRequest authorizationRequest = new CreditCardAuthorizationRequest(new PayoneConfig(tenantPropertyProvider), "000123", paymentWithCartLike); - MappingUtil.mapShippingAddressToRequest(authorizationRequestMissingAddress, addressMissingFields); + MappingUtil.mapShippingAddressToRequest(authorizationRequest, null, WALLET_PAYPAL); - assertThat(authorizationRequestMissingAddress.getNoShipping()).as("DE shipping address noShipping").isEqualTo(1); + assertThat(authorizationRequest.getShipping_country()).isEqualTo(null); } @Test diff --git a/service/src/test/java/com/commercetools/pspadapter/tenant/TenantFactoryTest.java b/service/src/test/java/com/commercetools/pspadapter/tenant/TenantFactoryTest.java index cefc25528d..cefc409adb 100644 --- a/service/src/test/java/com/commercetools/pspadapter/tenant/TenantFactoryTest.java +++ b/service/src/test/java/com/commercetools/pspadapter/tenant/TenantFactoryTest.java @@ -175,7 +175,7 @@ public void createRequestFactory_paypal_preauthorization() throws Exception { } @Test - public void createRequestFactory_paypal_authorization() throws Exception { + public void createRequestFactory_with_NoShippingAddress_paypal_authorization() throws Exception { PayoneRequestFactory requestFactory = factory.createRequestFactory(WALLET_PAYPAL, tenantConfig); PaymentWithCartLike paymentWithCartLike = testHelper.createPaypalPaymentWithCartLike(); AuthorizationRequest authorizationRequest = requestFactory.createAuthorizationRequest(paymentWithCartLike); @@ -185,6 +185,7 @@ public void createRequestFactory_paypal_authorization() throws Exception { assertThat(actual.get("request")).isEqualTo("authorization"); assertThat(actual.get("clearingtype")).isEqualTo("wlt"); assertThat(actual.get("wallettype")).isEqualTo("PPE"); + assertThat(actual.get("noShipping")).isEqualTo(1); } @Test From 9d1d6af4cdadb371319debfb31e4c016d82dde7c Mon Sep 17 00:00:00 2001 From: praveenkumarct Date: Fri, 10 Sep 2021 20:56:14 +0200 Subject: [PATCH 3/3] Rename the IT test class name. --- ...tRequestWorkflow.java => BasicPaymentRequestWorkflowIT.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename service/src/test/java/com/commercetools/main/{BasicPaymentRequestWorkflow.java => BasicPaymentRequestWorkflowIT.java} (99%) diff --git a/service/src/test/java/com/commercetools/main/BasicPaymentRequestWorkflow.java b/service/src/test/java/com/commercetools/main/BasicPaymentRequestWorkflowIT.java similarity index 99% rename from service/src/test/java/com/commercetools/main/BasicPaymentRequestWorkflow.java rename to service/src/test/java/com/commercetools/main/BasicPaymentRequestWorkflowIT.java index 01a77b81bf..91f1a2390f 100644 --- a/service/src/test/java/com/commercetools/main/BasicPaymentRequestWorkflow.java +++ b/service/src/test/java/com/commercetools/main/BasicPaymentRequestWorkflowIT.java @@ -61,7 +61,7 @@ import static util.PropertiesHelperUtil.getProjectKey; import static util.PropertiesHelperUtil.getTenant; -public class BasicPaymentRequestWorkflow { +public class BasicPaymentRequestWorkflowIT { public static final int DEFAULT_PORT = 8080; private static final Map testInternalProperties = new HashMap<>();