diff --git a/gradle.properties b/gradle.properties index 125ebd04..bd5c7eb7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ # Main properties group=com.truelayer archivesBaseName=truelayer-java -version=14.0.0 +version=14.1.0 # Artifacts properties sonatype_repository_url=https://s01.oss.sonatype.org/service/local/ diff --git a/src/main/java/com/truelayer/java/payments/entities/schemeselection/preselected/SchemeSelection.java b/src/main/java/com/truelayer/java/payments/entities/schemeselection/preselected/SchemeSelection.java index ce43bb7d..af6306a5 100644 --- a/src/main/java/com/truelayer/java/payments/entities/schemeselection/preselected/SchemeSelection.java +++ b/src/main/java/com/truelayer/java/payments/entities/schemeselection/preselected/SchemeSelection.java @@ -14,6 +14,7 @@ @JsonSubTypes({ @JsonSubTypes.Type(value = InstantOnlySchemeSelection.class, name = "instant_only"), @JsonSubTypes.Type(value = InstantPreferredSchemeSelection.class, name = "instant_preferred"), + @JsonSubTypes.Type(value = UserSelectedSchemeSelection.class, name = "user_selected"), @JsonSubTypes.Type(value = PreselectedSchemeSelection.class, name = "preselected"), }) @Getter @@ -32,6 +33,10 @@ public static InstantPreferredSchemeSelection.InstantPreferredSchemeSelectionBui return InstantPreferredSchemeSelection.builder(); } + public static UserSelectedSchemeSelection.UserSelectedSchemeSelectionBuilder userSelected() { + return UserSelectedSchemeSelection.builder(); + } + public static PreselectedSchemeSelection.PreselectedSchemeSelectionBuilder preselected() { return PreselectedSchemeSelection.builder(); } @@ -46,6 +51,11 @@ public boolean isInstantPreferred() { return this instanceof InstantPreferredSchemeSelection; } + @JsonIgnore + public boolean isUserSelected() { + return this instanceof UserSelectedSchemeSelection; + } + @JsonIgnore public boolean isPreselected() { return this instanceof PreselectedSchemeSelection; @@ -67,6 +77,14 @@ public InstantPreferredSchemeSelection asInstantPreferred() { return (InstantPreferredSchemeSelection) this; } + @JsonIgnore + public UserSelectedSchemeSelection asUserSelected() { + if (!isUserSelected()) { + throw new TrueLayerException(buildErrorMessage()); + } + return (UserSelectedSchemeSelection) this; + } + @JsonIgnore public PreselectedSchemeSelection asPreselected() { if (!isPreselected()) { @@ -84,6 +102,7 @@ private String buildErrorMessage() { public enum Type { INSTANT_ONLY("instant_only"), INSTANT_PREFERRED("instant_preferred"), + USER_SELECTED("user_selected"), PRESELECTED("preselected"); @JsonValue diff --git a/src/main/java/com/truelayer/java/payments/entities/schemeselection/preselected/UserSelectedSchemeSelection.java b/src/main/java/com/truelayer/java/payments/entities/schemeselection/preselected/UserSelectedSchemeSelection.java new file mode 100644 index 00000000..3f8826f7 --- /dev/null +++ b/src/main/java/com/truelayer/java/payments/entities/schemeselection/preselected/UserSelectedSchemeSelection.java @@ -0,0 +1,14 @@ +package com.truelayer.java.payments.entities.schemeselection.preselected; + +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; + +@Getter +@Builder +@EqualsAndHashCode(callSuper = false) +@ToString +public class UserSelectedSchemeSelection extends SchemeSelection { + private final Type type = Type.USER_SELECTED; +} diff --git a/src/main/java/com/truelayer/java/payments/entities/schemeselection/userselected/SchemeSelection.java b/src/main/java/com/truelayer/java/payments/entities/schemeselection/userselected/SchemeSelection.java index 17e4f3b9..4b765966 100644 --- a/src/main/java/com/truelayer/java/payments/entities/schemeselection/userselected/SchemeSelection.java +++ b/src/main/java/com/truelayer/java/payments/entities/schemeselection/userselected/SchemeSelection.java @@ -13,7 +13,8 @@ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = InstantOnlySchemeSelection.class) @JsonSubTypes({ @JsonSubTypes.Type(value = InstantOnlySchemeSelection.class, name = "instant_only"), - @JsonSubTypes.Type(value = InstantPreferredSchemeSelection.class, name = "instant_preferred") + @JsonSubTypes.Type(value = InstantPreferredSchemeSelection.class, name = "instant_preferred"), + @JsonSubTypes.Type(value = UserSelectedSchemeSelection.class, name = "user_selected"), }) @Getter @ToString @@ -23,9 +24,6 @@ public abstract class SchemeSelection { @JsonIgnore public abstract Type getType(); - @JsonIgnore - public abstract boolean allowRemitterFee(); - public static InstantOnlySchemeSelection.InstantOnlySchemeSelectionBuilder instantOnly() { return InstantOnlySchemeSelection.builder(); } @@ -34,6 +32,10 @@ public static InstantPreferredSchemeSelection.InstantPreferredSchemeSelectionBui return InstantPreferredSchemeSelection.builder(); } + public static UserSelectedSchemeSelection.UserSelectedSchemeSelectionBuilder userSelected() { + return UserSelectedSchemeSelection.builder(); + } + @JsonIgnore public boolean isInstantOnly() { return this instanceof InstantOnlySchemeSelection; @@ -44,6 +46,11 @@ public boolean isInstantPreferred() { return this instanceof InstantPreferredSchemeSelection; } + @JsonIgnore + public boolean isUserSelected() { + return this instanceof UserSelectedSchemeSelection; + } + @JsonIgnore public InstantOnlySchemeSelection asInstantOnly() { if (!isInstantOnly()) { @@ -60,6 +67,14 @@ public InstantPreferredSchemeSelection asInstantPreferred() { return (InstantPreferredSchemeSelection) this; } + @JsonIgnore + public UserSelectedSchemeSelection asUserSelected() { + if (!isUserSelected()) { + throw new TrueLayerException(buildErrorMessage()); + } + return (UserSelectedSchemeSelection) this; + } + private String buildErrorMessage() { return String.format("Scheme selection is of type %s.", this.getClass().getSimpleName()); } @@ -68,7 +83,8 @@ private String buildErrorMessage() { @Getter public enum Type { INSTANT_ONLY("instant_only"), - INSTANT_PREFERRED("instant_preferred"); + INSTANT_PREFERRED("instant_preferred"), + USER_SELECTED("user_selected"); @JsonValue private final String type; diff --git a/src/main/java/com/truelayer/java/payments/entities/schemeselection/userselected/UserSelectedSchemeSelection.java b/src/main/java/com/truelayer/java/payments/entities/schemeselection/userselected/UserSelectedSchemeSelection.java new file mode 100644 index 00000000..5ab12eba --- /dev/null +++ b/src/main/java/com/truelayer/java/payments/entities/schemeselection/userselected/UserSelectedSchemeSelection.java @@ -0,0 +1,14 @@ +package com.truelayer.java.payments.entities.schemeselection.userselected; + +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; + +@Getter +@Builder +@EqualsAndHashCode(callSuper = false) +@ToString +public class UserSelectedSchemeSelection extends SchemeSelection { + private final Type type = Type.USER_SELECTED; +} diff --git a/src/test/java/com/truelayer/java/payments/entities/schemeselection/preselected/SchemeSelectionTests.java b/src/test/java/com/truelayer/java/payments/entities/schemeselection/preselected/SchemeSelectionTests.java index 2adfda4d..64d5b1a8 100644 --- a/src/test/java/com/truelayer/java/payments/entities/schemeselection/preselected/SchemeSelectionTests.java +++ b/src/test/java/com/truelayer/java/payments/entities/schemeselection/preselected/SchemeSelectionTests.java @@ -61,6 +61,32 @@ public void shouldNotConvertToInstantPreferred() { String.format("Scheme selection is of type %s.", sut.getClass().getSimpleName()), thrown.getMessage()); } + @Test + @DisplayName("It should yield true if instance is of type UserSelectedSchemeSelection") + public void shouldYieldTrueIfUserSelected() { + SchemeSelection sut = new UserSelectedSchemeSelection(); + assertTrue(sut.isUserSelected()); + } + + @Test + @DisplayName("It should convert to an instance of class UserSelectedSchemeSelection") + public void shouldConvertToUserSelected() { + SchemeSelection sut = new UserSelectedSchemeSelection(); + + assertDoesNotThrow(sut::asUserSelected); + } + + @Test + @DisplayName("It should throw an error when converting to UserSelectedSchemeSelection") + public void shouldNotConvertToUserSelected() { + SchemeSelection sut = new InstantOnlySchemeSelection(true); + + Throwable thrown = assertThrows(TrueLayerException.class, sut::asUserSelected); + + assertEquals( + String.format("Scheme selection is of type %s.", sut.getClass().getSimpleName()), thrown.getMessage()); + } + @Test @DisplayName("It should yield true if instance is of type PreselectedSchemeSelection") public void shouldYieldTrueIfPreselected() { diff --git a/src/test/java/com/truelayer/java/payments/entities/schemeselection/userselected/SchemeSelectionTests.java b/src/test/java/com/truelayer/java/payments/entities/schemeselection/userselected/SchemeSelectionTests.java index e609bf92..e4427683 100644 --- a/src/test/java/com/truelayer/java/payments/entities/schemeselection/userselected/SchemeSelectionTests.java +++ b/src/test/java/com/truelayer/java/payments/entities/schemeselection/userselected/SchemeSelectionTests.java @@ -3,24 +3,11 @@ import static org.junit.jupiter.api.Assertions.*; import com.truelayer.java.TrueLayerException; -import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -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); - } - @Test @DisplayName("It should yield true if instance is of type InstantOnlySchemeSelection") public void shouldYieldTrueIfInstantOnly() { @@ -73,27 +60,29 @@ public void shouldNotConvertToInstantPreferred() { String.format("Scheme selection is of type %s.", sut.getClass().getSimpleName()), thrown.getMessage()); } - 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)); + @Test + @DisplayName("It should yield true if instance is of type UserSelectedSchemeSelection") + public void shouldYieldTrueIfUserSelected() { + SchemeSelection sut = new UserSelectedSchemeSelection(); + assertTrue(sut.isUserSelected()); + } + + @Test + @DisplayName("It should convert to an instance of class UserSelectedSchemeSelection") + public void shouldConvertToUserSelected() { + SchemeSelection sut = new UserSelectedSchemeSelection(); + + assertDoesNotThrow(sut::asUserSelected); + } + + @Test + @DisplayName("It should throw an error when converting to UserSelectedSchemeSelection") + public void shouldNotConvertToUserSelected() { + SchemeSelection sut = new InstantOnlySchemeSelection(true); + + Throwable thrown = assertThrows(TrueLayerException.class, sut::asUserSelected); + + assertEquals( + String.format("Scheme selection is of type %s.", sut.getClass().getSimpleName()), thrown.getMessage()); } }