From 600f25251693fab046340fb48d5e8248b5fdb0cb Mon Sep 17 00:00:00 2001 From: Luca Baggi <74901945+tl-luca-baggi@users.noreply.github.com> Date: Mon, 5 Aug 2024 11:53:44 +0200 Subject: [PATCH] [ACL-175] Fix missing EqualsAndHashCode Lombok annotations (#304) Co-authored-by: Andrea Di Lisio --- gradle.properties | 2 +- .../BbanAccountIdentifier.java | 2 + .../IbanAccountIdentifier.java | 2 + .../NrbAccountIdentifier.java | 2 + ...ortCodeAccountNumberAccountIdentifier.java | 2 + .../entities/beneficiary/ExternalAccount.java | 2 + .../entities/beneficiary/MerchantAccount.java | 2 + .../mandate/VRPCommercialMandate.java | 2 + .../entities/mandate/VRPSweepingMandate.java | 2 + .../entities/beneficiary/ExternalAccount.java | 2 + .../entities/beneficiary/MerchantAccount.java | 2 + .../entities/paymentmethod/BankTransfer.java | 2 + .../entities/paymentmethod/Mandate.java | 2 + .../PreselectedProviderSelection.java | 2 + .../UserSelectedProviderSelection.java | 2 + .../InstantOnlySchemeSelection.java | 6 ++ .../InstantPreferredSchemeSelection.java | 6 ++ .../PaymentsProvidersAcceptanceTests.java | 4 +- .../integration/PaymentsIntegrationTests.java | 64 +++++++++++++++++++ .../entities/SchemeSelectionTests.java | 46 +++++++++++++ .../paymentmethod/PaymentMethodTests.java | 50 +++++++++++++++ 21 files changed, 203 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/truelayer/java/payments/entities/SchemeSelectionTests.java diff --git a/gradle.properties b/gradle.properties index 12b06251..6c37d81f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ # Main properties group=com.truelayer archivesBaseName=truelayer-java -version=13.1.1 +version=13.1.2 # Artifacts properties sonatype_repository_url=https://s01.oss.sonatype.org/service/local/ diff --git a/src/main/java/com/truelayer/java/entities/accountidentifier/BbanAccountIdentifier.java b/src/main/java/com/truelayer/java/entities/accountidentifier/BbanAccountIdentifier.java index 55326f5a..a07a07bc 100644 --- a/src/main/java/com/truelayer/java/entities/accountidentifier/BbanAccountIdentifier.java +++ b/src/main/java/com/truelayer/java/entities/accountidentifier/BbanAccountIdentifier.java @@ -3,10 +3,12 @@ import static com.truelayer.java.entities.accountidentifier.AccountIdentifier.Type.BBAN; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Builder @Getter +@EqualsAndHashCode(callSuper = false) public class BbanAccountIdentifier extends AccountIdentifier { private final Type type = BBAN; diff --git a/src/main/java/com/truelayer/java/entities/accountidentifier/IbanAccountIdentifier.java b/src/main/java/com/truelayer/java/entities/accountidentifier/IbanAccountIdentifier.java index 7ab7b973..ceff8a45 100644 --- a/src/main/java/com/truelayer/java/entities/accountidentifier/IbanAccountIdentifier.java +++ b/src/main/java/com/truelayer/java/entities/accountidentifier/IbanAccountIdentifier.java @@ -1,10 +1,12 @@ package com.truelayer.java.entities.accountidentifier; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Builder @Getter +@EqualsAndHashCode(callSuper = false) public class IbanAccountIdentifier extends AccountIdentifier { private final Type type = Type.IBAN; diff --git a/src/main/java/com/truelayer/java/entities/accountidentifier/NrbAccountIdentifier.java b/src/main/java/com/truelayer/java/entities/accountidentifier/NrbAccountIdentifier.java index 48710a8d..f98105a5 100644 --- a/src/main/java/com/truelayer/java/entities/accountidentifier/NrbAccountIdentifier.java +++ b/src/main/java/com/truelayer/java/entities/accountidentifier/NrbAccountIdentifier.java @@ -3,10 +3,12 @@ import static com.truelayer.java.entities.accountidentifier.AccountIdentifier.Type.NRB; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Builder @Getter +@EqualsAndHashCode(callSuper = false) public class NrbAccountIdentifier extends AccountIdentifier { private final Type type = NRB; diff --git a/src/main/java/com/truelayer/java/entities/accountidentifier/SortCodeAccountNumberAccountIdentifier.java b/src/main/java/com/truelayer/java/entities/accountidentifier/SortCodeAccountNumberAccountIdentifier.java index a1249474..2111afa5 100644 --- a/src/main/java/com/truelayer/java/entities/accountidentifier/SortCodeAccountNumberAccountIdentifier.java +++ b/src/main/java/com/truelayer/java/entities/accountidentifier/SortCodeAccountNumberAccountIdentifier.java @@ -1,10 +1,12 @@ package com.truelayer.java.entities.accountidentifier; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Builder @Getter +@EqualsAndHashCode(callSuper = false) public class SortCodeAccountNumberAccountIdentifier extends AccountIdentifier { private final Type type = Type.SORT_CODE_ACCOUNT_NUMBER; diff --git a/src/main/java/com/truelayer/java/mandates/entities/beneficiary/ExternalAccount.java b/src/main/java/com/truelayer/java/mandates/entities/beneficiary/ExternalAccount.java index 29b2d2fe..c5f18487 100644 --- a/src/main/java/com/truelayer/java/mandates/entities/beneficiary/ExternalAccount.java +++ b/src/main/java/com/truelayer/java/mandates/entities/beneficiary/ExternalAccount.java @@ -4,10 +4,12 @@ import com.truelayer.java.entities.accountidentifier.AccountIdentifier; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Builder @Getter +@EqualsAndHashCode(callSuper = false) public class ExternalAccount extends Beneficiary { private final Type type = EXTERNAL_ACCOUNT; diff --git a/src/main/java/com/truelayer/java/mandates/entities/beneficiary/MerchantAccount.java b/src/main/java/com/truelayer/java/mandates/entities/beneficiary/MerchantAccount.java index b9ccbf54..d5388a6d 100644 --- a/src/main/java/com/truelayer/java/mandates/entities/beneficiary/MerchantAccount.java +++ b/src/main/java/com/truelayer/java/mandates/entities/beneficiary/MerchantAccount.java @@ -1,10 +1,12 @@ package com.truelayer.java.mandates.entities.beneficiary; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Builder @Getter +@EqualsAndHashCode(callSuper = false) public class MerchantAccount extends Beneficiary { private final Type type = Type.MERCHANT_ACCOUNT; diff --git a/src/main/java/com/truelayer/java/mandates/entities/mandate/VRPCommercialMandate.java b/src/main/java/com/truelayer/java/mandates/entities/mandate/VRPCommercialMandate.java index 7e13b8ef..7e847c1a 100644 --- a/src/main/java/com/truelayer/java/mandates/entities/mandate/VRPCommercialMandate.java +++ b/src/main/java/com/truelayer/java/mandates/entities/mandate/VRPCommercialMandate.java @@ -5,10 +5,12 @@ import com.truelayer.java.mandates.entities.beneficiary.Beneficiary; import com.truelayer.java.payments.entities.providerselection.ProviderSelection; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Builder @Getter +@EqualsAndHashCode(callSuper = false) public class VRPCommercialMandate extends Mandate { private final Type type = COMMERCIAL; diff --git a/src/main/java/com/truelayer/java/mandates/entities/mandate/VRPSweepingMandate.java b/src/main/java/com/truelayer/java/mandates/entities/mandate/VRPSweepingMandate.java index a6bc951a..38f4f221 100644 --- a/src/main/java/com/truelayer/java/mandates/entities/mandate/VRPSweepingMandate.java +++ b/src/main/java/com/truelayer/java/mandates/entities/mandate/VRPSweepingMandate.java @@ -5,10 +5,12 @@ import com.truelayer.java.mandates.entities.beneficiary.Beneficiary; import com.truelayer.java.payments.entities.providerselection.ProviderSelection; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Builder @Getter +@EqualsAndHashCode(callSuper = false) public class VRPSweepingMandate extends Mandate { private final Type type = SWEEPING; diff --git a/src/main/java/com/truelayer/java/payments/entities/beneficiary/ExternalAccount.java b/src/main/java/com/truelayer/java/payments/entities/beneficiary/ExternalAccount.java index 371e01bd..ea214a97 100644 --- a/src/main/java/com/truelayer/java/payments/entities/beneficiary/ExternalAccount.java +++ b/src/main/java/com/truelayer/java/payments/entities/beneficiary/ExternalAccount.java @@ -4,10 +4,12 @@ import com.truelayer.java.entities.accountidentifier.AccountIdentifier; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Builder @Getter +@EqualsAndHashCode(callSuper = false) public class ExternalAccount extends Beneficiary { private final Type type = EXTERNAL_ACCOUNT; diff --git a/src/main/java/com/truelayer/java/payments/entities/beneficiary/MerchantAccount.java b/src/main/java/com/truelayer/java/payments/entities/beneficiary/MerchantAccount.java index 320d70f2..c9e1deb4 100644 --- a/src/main/java/com/truelayer/java/payments/entities/beneficiary/MerchantAccount.java +++ b/src/main/java/com/truelayer/java/payments/entities/beneficiary/MerchantAccount.java @@ -1,10 +1,12 @@ package com.truelayer.java.payments.entities.beneficiary; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Builder @Getter +@EqualsAndHashCode(callSuper = false) public class MerchantAccount extends Beneficiary { private final Type type = Type.MERCHANT_ACCOUNT; diff --git a/src/main/java/com/truelayer/java/payments/entities/paymentmethod/BankTransfer.java b/src/main/java/com/truelayer/java/payments/entities/paymentmethod/BankTransfer.java index 71f3a8c6..72df6382 100644 --- a/src/main/java/com/truelayer/java/payments/entities/paymentmethod/BankTransfer.java +++ b/src/main/java/com/truelayer/java/payments/entities/paymentmethod/BankTransfer.java @@ -8,10 +8,12 @@ import com.truelayer.java.payments.entities.providerselection.ProviderSelection; import java.util.Optional; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Builder @Getter +@EqualsAndHashCode(callSuper = false) public class BankTransfer extends PaymentMethod { private final Type type = BANK_TRANSFER; diff --git a/src/main/java/com/truelayer/java/payments/entities/paymentmethod/Mandate.java b/src/main/java/com/truelayer/java/payments/entities/paymentmethod/Mandate.java index 00807094..41393e04 100644 --- a/src/main/java/com/truelayer/java/payments/entities/paymentmethod/Mandate.java +++ b/src/main/java/com/truelayer/java/payments/entities/paymentmethod/Mandate.java @@ -6,10 +6,12 @@ import com.truelayer.java.payments.entities.retry.Retry; import java.util.Optional; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Builder @Getter +@EqualsAndHashCode(callSuper = false) public class Mandate extends PaymentMethod { private final Type type = MANDATE; diff --git a/src/main/java/com/truelayer/java/payments/entities/providerselection/PreselectedProviderSelection.java b/src/main/java/com/truelayer/java/payments/entities/providerselection/PreselectedProviderSelection.java index 306f2377..5dc0d454 100644 --- a/src/main/java/com/truelayer/java/payments/entities/providerselection/PreselectedProviderSelection.java +++ b/src/main/java/com/truelayer/java/payments/entities/providerselection/PreselectedProviderSelection.java @@ -3,10 +3,12 @@ import com.truelayer.java.entities.Remitter; import com.truelayer.java.payments.entities.SchemeId; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Getter @Builder +@EqualsAndHashCode(callSuper = false) public class PreselectedProviderSelection extends ProviderSelection { private final Type type = Type.PRESELECTED; diff --git a/src/main/java/com/truelayer/java/payments/entities/providerselection/UserSelectedProviderSelection.java b/src/main/java/com/truelayer/java/payments/entities/providerselection/UserSelectedProviderSelection.java index 86a0cba8..d99bd2f5 100644 --- a/src/main/java/com/truelayer/java/payments/entities/providerselection/UserSelectedProviderSelection.java +++ b/src/main/java/com/truelayer/java/payments/entities/providerselection/UserSelectedProviderSelection.java @@ -4,10 +4,12 @@ import com.truelayer.java.payments.entities.SchemeId; import com.truelayer.java.payments.entities.schemeselection.SchemeSelection; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Builder @Getter +@EqualsAndHashCode(callSuper = false) public class UserSelectedProviderSelection extends ProviderSelection { private final Type type = Type.USER_SELECTED; diff --git a/src/main/java/com/truelayer/java/payments/entities/schemeselection/InstantOnlySchemeSelection.java b/src/main/java/com/truelayer/java/payments/entities/schemeselection/InstantOnlySchemeSelection.java index b389f2ab..7a89a4ba 100644 --- a/src/main/java/com/truelayer/java/payments/entities/schemeselection/InstantOnlySchemeSelection.java +++ b/src/main/java/com/truelayer/java/payments/entities/schemeselection/InstantOnlySchemeSelection.java @@ -1,14 +1,20 @@ package com.truelayer.java.payments.entities.schemeselection; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.ToString; import lombok.experimental.Accessors; @Getter @Builder +@EqualsAndHashCode(callSuper = false) +@ToString public class InstantOnlySchemeSelection extends SchemeSelection { private final Type type = Type.INSTANT_ONLY; @Accessors(fluent = true) + @JsonProperty // Jackson's @JsonProperty is required for serialization to work as expected private boolean allowRemitterFee; } diff --git a/src/main/java/com/truelayer/java/payments/entities/schemeselection/InstantPreferredSchemeSelection.java b/src/main/java/com/truelayer/java/payments/entities/schemeselection/InstantPreferredSchemeSelection.java index 30f5c2b5..19a008db 100644 --- a/src/main/java/com/truelayer/java/payments/entities/schemeselection/InstantPreferredSchemeSelection.java +++ b/src/main/java/com/truelayer/java/payments/entities/schemeselection/InstantPreferredSchemeSelection.java @@ -1,14 +1,20 @@ package com.truelayer.java.payments.entities.schemeselection; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.ToString; import lombok.experimental.Accessors; @Getter @Builder +@EqualsAndHashCode(callSuper = false) +@ToString public class InstantPreferredSchemeSelection extends SchemeSelection { private final Type type = Type.INSTANT_PREFERRED; @Accessors(fluent = true) + @JsonProperty // Jackson's @JsonProperty is required for serialization to work as expected private boolean allowRemitterFee; } diff --git a/src/test/java/com/truelayer/java/acceptance/PaymentsProvidersAcceptanceTests.java b/src/test/java/com/truelayer/java/acceptance/PaymentsProvidersAcceptanceTests.java index ed3df47c..757195c7 100644 --- a/src/test/java/com/truelayer/java/acceptance/PaymentsProvidersAcceptanceTests.java +++ b/src/test/java/com/truelayer/java/acceptance/PaymentsProvidersAcceptanceTests.java @@ -16,9 +16,9 @@ public class PaymentsProvidersAcceptanceTests extends AcceptanceTests { public static final String PROVIDER_ID = "mock-payments-gb-redirect"; @Test - @DisplayName("It should get by id a payments provider") + @DisplayName("It should get a payments provider by id") @SneakyThrows - public void shouldCreateAPaymentWithUserSelectionProvider() { + public void shouldGetAPaymentsProviderById() { ApiResponse getPaymentsProviderResponse = tlClient.paymentsProviders().getProvider(PROVIDER_ID).get(); diff --git a/src/test/java/com/truelayer/java/integration/PaymentsIntegrationTests.java b/src/test/java/com/truelayer/java/integration/PaymentsIntegrationTests.java index 35795b39..f07d1c1b 100644 --- a/src/test/java/com/truelayer/java/integration/PaymentsIntegrationTests.java +++ b/src/test/java/com/truelayer/java/integration/PaymentsIntegrationTests.java @@ -12,6 +12,8 @@ import com.truelayer.java.TestUtils; import com.truelayer.java.TestUtils.RequestStub; +import com.truelayer.java.entities.CurrencyCode; +import com.truelayer.java.entities.ProviderFilter; import com.truelayer.java.entities.RelatedProducts; import com.truelayer.java.http.entities.ApiResponse; import com.truelayer.java.http.entities.Headers; @@ -21,6 +23,9 @@ import com.truelayer.java.payments.entities.paymentdetail.Status; import com.truelayer.java.payments.entities.paymentmethod.PaymentMethod; import com.truelayer.java.payments.entities.paymentrefund.PaymentRefund; +import com.truelayer.java.payments.entities.providerselection.ProviderSelection; +import com.truelayer.java.payments.entities.providerselection.UserSelectedProviderSelection; +import com.truelayer.java.payments.entities.schemeselection.SchemeSelection; import java.util.Collections; import java.util.stream.Stream; import lombok.SneakyThrows; @@ -94,6 +99,47 @@ public void shouldCreateAPaymentWithAdditionalProductIntention() { .withRequestBody(matchingJsonPath("$.related_products", equalToJson("{\"signup_plus\": {}}")))); } + @DisplayName("It should create payment with") + @ParameterizedTest(name = "scheme_selection={0} and expected allow_remitter_fee={1}") + @MethodSource("provideSchemeSelectionTestParameters") + @SneakyThrows + public void shouldCreateAPaymentWithSchemeSelection( + SchemeSelection schemeSelection, boolean expectedAllowRemitterFee) { + RequestStub.New() + .method("post") + .path(urlPathEqualTo("/connect/token")) + .status(200) + .bodyFile("auth/200.access_token.json") + .build(); + + UserSelectedProviderSelection userSelectedProviderSelection = ProviderSelection.userSelected() + .filter(ProviderFilter.builder() + .countries(Collections.singletonList(CountryCode.GB)) + .releaseChannel(ReleaseChannel.GENERAL_AVAILABILITY) + .customerSegments(Collections.singletonList(CustomerSegment.RETAIL)) + .build()) + .schemeSelection(schemeSelection) + .build(); + CreatePaymentRequest paymentRequest = CreatePaymentRequest.builder() + .amountInMinor(50) + .currency(CurrencyCode.GBP) + .paymentMethod(PaymentMethod.bankTransfer() + .providerSelection(userSelectedProviderSelection) + .build()) + .build(); + + tlClient.payments().createPayment(paymentRequest).get(); + + verifyGeneratedToken(Collections.singletonList(PAYMENTS)); + + verify(postRequestedFor(urlPathEqualTo("/payments")) + .withRequestBody(matchingJsonPath( + "$.payment_method.provider_selection.scheme_selection", + equalToJson(String.format( + "{\"type\": \"%s\", \"allow_remitter_fee\": %s}", + schemeSelection.getType().getType(), expectedAllowRemitterFee))))); + } + @Test @DisplayName("It should return an error if the signature is not valid") @SneakyThrows @@ -452,4 +498,22 @@ private static Stream provideShouldReturnAPaymentDetailTestParameters Arguments.of(MANDATE, EXECUTED), Arguments.of(MANDATE, FAILED)); } + + private static Stream provideSchemeSelectionTestParameters() { + return Stream.of( + Arguments.of( + SchemeSelection.instantOnly().allowRemitterFee(true).build(), true), + Arguments.of( + SchemeSelection.instantOnly().allowRemitterFee(false).build(), false), + Arguments.of( + SchemeSelection.instantPreferred() + .allowRemitterFee(true) + .build(), + true), + Arguments.of( + SchemeSelection.instantPreferred() + .allowRemitterFee(false) + .build(), + false)); + } } diff --git a/src/test/java/com/truelayer/java/payments/entities/SchemeSelectionTests.java b/src/test/java/com/truelayer/java/payments/entities/SchemeSelectionTests.java new file mode 100644 index 00000000..45c08c73 --- /dev/null +++ b/src/test/java/com/truelayer/java/payments/entities/SchemeSelectionTests.java @@ -0,0 +1,46 @@ +package com.truelayer.java.payments.entities; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.truelayer.java.payments.entities.schemeselection.SchemeSelection; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public class SchemeSelectionTests { + + @DisplayName("Scheme selection base class should yield the expected type and allow_remitter_fee") + @ParameterizedTest(name = "object={0}, expected type={1}, expected allow_remitter_fee={2}") + @MethodSource("provideSchemeSelectionTestParameters") + public void baseClassShouldYieldExpectedDetails( + SchemeSelection schemeSelection, SchemeSelection.Type expectedType, boolean expectAllowRemitterFee) { + assertEquals(schemeSelection.getType(), expectedType); + assertEquals(schemeSelection.allowRemitterFee(), expectAllowRemitterFee); + } + + private static Stream provideSchemeSelectionTestParameters() { + return Stream.of( + Arguments.of( + SchemeSelection.instantOnly().allowRemitterFee(true).build(), + SchemeSelection.Type.INSTANT_ONLY, + true), + Arguments.of( + SchemeSelection.instantOnly().allowRemitterFee(false).build(), + SchemeSelection.Type.INSTANT_ONLY, + false), + Arguments.of( + SchemeSelection.instantPreferred() + .allowRemitterFee(true) + .build(), + SchemeSelection.Type.INSTANT_PREFERRED, + true), + Arguments.of( + SchemeSelection.instantPreferred() + .allowRemitterFee(false) + .build(), + SchemeSelection.Type.INSTANT_PREFERRED, + false)); + } +} diff --git a/src/test/java/com/truelayer/java/payments/entities/paymentmethod/PaymentMethodTests.java b/src/test/java/com/truelayer/java/payments/entities/paymentmethod/PaymentMethodTests.java index ce4d704e..7bd6d71f 100644 --- a/src/test/java/com/truelayer/java/payments/entities/paymentmethod/PaymentMethodTests.java +++ b/src/test/java/com/truelayer/java/payments/entities/paymentmethod/PaymentMethodTests.java @@ -3,6 +3,9 @@ import static org.junit.jupiter.api.Assertions.*; import com.truelayer.java.TrueLayerException; +import com.truelayer.java.entities.Remitter; +import com.truelayer.java.payments.entities.beneficiary.Beneficiary; +import com.truelayer.java.payments.entities.providerselection.ProviderSelection; import java.util.UUID; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -65,4 +68,51 @@ public void shouldNotConvertToMandate() { assertEquals( String.format("Payment method is of type %s.", sut.getClass().getSimpleName()), thrown.getMessage()); } + + @Test + @DisplayName("BankTransfer class should implement equals method") + public void bankTransferShouldImplementEqualsMethod() { + String aBeneficiaryReference = "a_beneficiary_reference"; + String anotherBeneficiaryReference = "another_beneficiary_reference"; + String aRemitterName = "a_remitter_name"; + String anotherRemitterName = "another_remitter_name"; + + BankTransfer bankTransfer = createBankTransfer(aBeneficiaryReference, aRemitterName); + BankTransfer identicalBankTransfer = createBankTransfer(aBeneficiaryReference, aRemitterName); + BankTransfer differentBankTransfer = createBankTransfer(anotherBeneficiaryReference, anotherRemitterName); + + assertEquals(bankTransfer, identicalBankTransfer); + assertNotEquals(bankTransfer, differentBankTransfer); + } + + @Test + @DisplayName("Mandate class should implement equals method") + public void mandateShouldImplementEqualsMethod() { + String aMandateId = UUID.randomUUID().toString(); + String anotherMandateId = UUID.randomUUID().toString(); + + Mandate mandate = createMandate(aMandateId); + Mandate identicalMandate = createMandate(aMandateId); + Mandate differentMandate = createMandate(anotherMandateId); + + assertEquals(mandate, identicalMandate); + assertNotEquals(mandate, differentMandate); + } + + private static BankTransfer createBankTransfer(String beneficiaryReference, String remitterName) { + return BankTransfer.builder() + .providerSelection(ProviderSelection.preselected() + .remitter(Remitter.builder() + .accountHolderName(remitterName) + .build()) + .build()) + .beneficiary(Beneficiary.externalAccount() + .reference(beneficiaryReference) + .build()) + .build(); + } + + private static Mandate createMandate(String id) { + return Mandate.builder().mandateId(id).build(); + } }