diff --git a/src/main/java/com/checkout/handlepaymentsandpayouts/setups/entities/paymentMethods/PaymentMethods.java b/src/main/java/com/checkout/handlepaymentsandpayouts/setups/entities/paymentMethods/PaymentMethods.java index 8805eeb0b..51466d726 100644 --- a/src/main/java/com/checkout/handlepaymentsandpayouts/setups/entities/paymentMethods/PaymentMethods.java +++ b/src/main/java/com/checkout/handlepaymentsandpayouts/setups/entities/paymentMethods/PaymentMethods.java @@ -43,6 +43,7 @@ import com.checkout.handlepaymentsandpayouts.setups.entities.paymentMethods.twint.Twint; import com.checkout.handlepaymentsandpayouts.setups.entities.paymentMethods.vipps.Vipps; import com.checkout.handlepaymentsandpayouts.setups.entities.paymentMethods.wechatpay.WeChatPay; +import com.google.gson.annotations.SerializedName; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -298,9 +299,10 @@ public final class PaymentMethods { private CardPresent cardPresent; /** - * Pay by Bank (Open Banking) payment method configuration. + * Pay by Bank (Open Banking) payment method configuration. Serialized as {@code paybybank}. * [Optional] */ + @SerializedName("paybybank") private PayByBank payByBank; /** diff --git a/src/main/java/com/checkout/handlepaymentsandpayouts/setups/entities/risk/PaymentSetupRisk.java b/src/main/java/com/checkout/handlepaymentsandpayouts/setups/entities/risk/PaymentSetupRisk.java new file mode 100644 index 000000000..fe9f444ed --- /dev/null +++ b/src/main/java/com/checkout/handlepaymentsandpayouts/setups/entities/risk/PaymentSetupRisk.java @@ -0,0 +1,23 @@ +package com.checkout.handlepaymentsandpayouts.setups.entities.risk; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Risk assessment settings for the Payment Setup. + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public final class PaymentSetupRisk { + + /** + * Indicates whether a risk assessment should be performed. + * [Optional] + * Default: true + */ + private Boolean enabled; +} diff --git a/src/main/java/com/checkout/handlepaymentsandpayouts/setups/requests/PaymentSetupsRequest.java b/src/main/java/com/checkout/handlepaymentsandpayouts/setups/requests/PaymentSetupsRequest.java index 0dd7e53cb..d9c73db1b 100644 --- a/src/main/java/com/checkout/handlepaymentsandpayouts/setups/requests/PaymentSetupsRequest.java +++ b/src/main/java/com/checkout/handlepaymentsandpayouts/setups/requests/PaymentSetupsRequest.java @@ -10,6 +10,7 @@ import com.checkout.handlepaymentsandpayouts.setups.entities.paymentMethods.PaymentMethods; import com.checkout.handlepaymentsandpayouts.setups.entities.billingDescriptor.PaymentSetupBillingDescriptor; import com.checkout.handlepaymentsandpayouts.setups.entities.presentmentDetails.PaymentSetupPresentmentDetails; +import com.checkout.handlepaymentsandpayouts.setups.entities.risk.PaymentSetupRisk; import com.checkout.handlepaymentsandpayouts.setups.entities.settings.Settings; import com.checkout.handlepaymentsandpayouts.setups.entities.terminal.PaymentSetupTerminal; import lombok.AllArgsConstructor; @@ -126,4 +127,10 @@ public final class PaymentSetupsRequest { * [Optional] */ private PaymentSetupTerminal terminal; + + /** + * Risk assessment settings for the Payment Setup. + * [Optional] + */ + private PaymentSetupRisk risk; } \ No newline at end of file diff --git a/src/main/java/com/checkout/handlepaymentsandpayouts/setups/responses/PaymentSetupsResponse.java b/src/main/java/com/checkout/handlepaymentsandpayouts/setups/responses/PaymentSetupsResponse.java index 7f168200a..fd8e4cf85 100644 --- a/src/main/java/com/checkout/handlepaymentsandpayouts/setups/responses/PaymentSetupsResponse.java +++ b/src/main/java/com/checkout/handlepaymentsandpayouts/setups/responses/PaymentSetupsResponse.java @@ -10,6 +10,7 @@ import com.checkout.handlepaymentsandpayouts.setups.entities.order.Order; import com.checkout.handlepaymentsandpayouts.setups.entities.paymentMethods.PaymentMethods; import com.checkout.handlepaymentsandpayouts.setups.entities.presentmentDetails.PaymentSetupPresentmentDetails; +import com.checkout.handlepaymentsandpayouts.setups.entities.risk.PaymentSetupRisk; import com.checkout.handlepaymentsandpayouts.setups.entities.settings.Settings; import com.checkout.handlepaymentsandpayouts.setups.entities.terminal.PaymentSetupTerminal; import com.checkout.payments.PaymentType; @@ -149,4 +150,10 @@ public final class PaymentSetupsResponse extends Resource { * [Optional] */ private PaymentSetupTerminal terminal; + + /** + * Risk assessment settings for the Payment Setup. + * [Optional] + */ + private PaymentSetupRisk risk; } diff --git a/src/test/java/com/checkout/handlepaymentsandpayouts/setups/PaymentSetupsNewFieldsSerializationTest.java b/src/test/java/com/checkout/handlepaymentsandpayouts/setups/PaymentSetupsNewFieldsSerializationTest.java index ddc16477d..e2b1b5833 100644 --- a/src/test/java/com/checkout/handlepaymentsandpayouts/setups/PaymentSetupsNewFieldsSerializationTest.java +++ b/src/test/java/com/checkout/handlepaymentsandpayouts/setups/PaymentSetupsNewFieldsSerializationTest.java @@ -95,7 +95,8 @@ void shouldSerializeNewPaymentMethods() { final String methodsJson = serializer.toJson(methods); assertTrue(methodsJson.contains("\"bacs\"")); assertTrue(methodsJson.contains("\"card_present\"")); - assertTrue(methodsJson.contains("\"pay_by_bank\"")); + assertTrue(methodsJson.contains("\"paybybank\"")); + assertFalse(methodsJson.contains("pay_by_bank")); assertTrue(methodsJson.contains("\"stablecoin\"")); } diff --git a/src/test/java/com/checkout/handlepaymentsandpayouts/setups/PaymentSetupsPayByBankSerializationTest.java b/src/test/java/com/checkout/handlepaymentsandpayouts/setups/PaymentSetupsPayByBankSerializationTest.java new file mode 100644 index 000000000..5c683fa6e --- /dev/null +++ b/src/test/java/com/checkout/handlepaymentsandpayouts/setups/PaymentSetupsPayByBankSerializationTest.java @@ -0,0 +1,101 @@ +package com.checkout.handlepaymentsandpayouts.setups; + +import com.checkout.GsonSerializer; +import com.checkout.common.Currency; +import com.checkout.handlepaymentsandpayouts.setups.entities.paymentMethods.PaymentMethods; +import com.checkout.handlepaymentsandpayouts.setups.entities.paymentMethods.paybybank.PayByBank; +import com.checkout.handlepaymentsandpayouts.setups.entities.paymentMethods.paybybank.PayByBankAction; +import com.checkout.handlepaymentsandpayouts.setups.entities.paymentMethods.paybybank.PayByBankBank; +import com.checkout.handlepaymentsandpayouts.setups.entities.risk.PaymentSetupRisk; +import com.checkout.handlepaymentsandpayouts.setups.requests.PaymentSetupsRequest; +import com.checkout.handlepaymentsandpayouts.setups.responses.PaymentSetupsResponse; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.junit.jupiter.api.Test; + +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Wire format tests for the Payment Setup {@code payment_methods.paybybank} key and the {@code risk} object. + */ +class PaymentSetupsPayByBankSerializationTest { + + private final GsonSerializer serializer = new GsonSerializer(); + + @Test + void shouldSerializePayByBankWithLiteralPaybybankKey() { + final PayByBank payByBank = new PayByBank(); + payByBank.setBankId("bank_123"); + final PaymentSetupsRequest request = PaymentSetupsRequest.builder() + .processingChannelId("pc_q4dbxom5jbgudnjzjpz7j2z6uq") + .amount(1000L) + .currency(Currency.GBP) + .paymentMethods(PaymentMethods.builder().payByBank(payByBank).build()) + .build(); + + final String json = serializer.toJson(request); + + assertTrue(json.contains("\"paybybank\"")); + assertFalse(json.contains("pay_by_bank")); + final JsonObject root = JsonParser.parseString(json).getAsJsonObject(); + assertEquals("bank_123", root.getAsJsonObject("payment_methods") + .getAsJsonObject("paybybank").get("bank_id").getAsString()); + } + + @Test + void shouldDeserializePayByBankActionFromResponse() { + final String json = "{" + + "\"id\":\"ps_123\"," + + "\"payment_methods\":{\"paybybank\":{" + + "\"status\":\"action_required\"," + + "\"flags\":[\"flag\"]," + + "\"bank_id\":\"bank_123\"," + + "\"action\":{\"type\":\"select_bank\",\"banks\":[{" + + "\"bank_id\":\"bank_123\",\"display_name\":\"Example Bank\"," + + "\"logo_url\":\"https://example.com/logo.png\",\"available\":true}]}" + + "}}," + + "\"risk\":{\"enabled\":false}" + + "}"; + + final PaymentSetupsResponse response = serializer.fromJson(json, PaymentSetupsResponse.class); + + final PayByBank payByBank = response.getPaymentMethods().getPayByBank(); + assertNotNull(payByBank); + assertEquals(Collections.singletonList("flag"), payByBank.getFlags()); + assertEquals("bank_123", payByBank.getBankId()); + final PayByBankAction action = payByBank.getAction(); + assertNotNull(action); + assertEquals("select_bank", action.getType()); + final PayByBankBank bank = action.getBanks().get(0); + assertEquals("bank_123", bank.getBankId()); + assertEquals("Example Bank", bank.getDisplayName()); + assertEquals("https://example.com/logo.png", bank.getLogoUrl()); + assertTrue(bank.getAvailable()); + assertFalse(response.getRisk().getEnabled()); + } + + @Test + void shouldSerializeAndRoundTripRiskEnabled() { + final PaymentSetupsRequest request = PaymentSetupsRequest.builder() + .risk(PaymentSetupRisk.builder().enabled(true).build()) + .build(); + + final String json = serializer.toJson(request); + final JsonObject root = JsonParser.parseString(json).getAsJsonObject(); + assertTrue(root.getAsJsonObject("risk").get("enabled").getAsBoolean()); + + final PaymentSetupsRequest restored = serializer.fromJson(json, PaymentSetupsRequest.class); + assertEquals(request.getRisk(), restored.getRisk()); + } + + @Test + void shouldDeserializeRiskSwaggerExample() { + final PaymentSetupRisk risk = serializer.fromJson("{\"enabled\":true}", PaymentSetupRisk.class); + assertTrue(risk.getEnabled()); + } +}