diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/PaymentMethodValidatorTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/PaymentMethodValidatorTest.java new file mode 100644 index 0000000..8ed39e9 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/PaymentMethodValidatorTest.java @@ -0,0 +1,50 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.validator; + +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.PaymentMethodInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.PaymentType; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.junit.jupiter.api.Assertions.*; + +public class PaymentMethodValidatorTest { + + @Test + @DisplayName("Should validate payment method with valid data") + void testValidateValidPaymentMethod() { + PaymentMethodInfo validPaymentMethod = new PaymentMethodInfo(PaymentType.CB.name(), "Maxime Lebreton"); + + assertDoesNotThrow(() -> PaymentMethodValidator.validate(validPaymentMethod)); + } + + @Nested + @DisplayName("PaymentType validation tests") + class PaymentTypeValidationTests { + + @ParameterizedTest + @EnumSource(value = PaymentType.class) + void testValidatePaymentType(PaymentType paymentType) { + String validPaymentType = paymentType.toString(); + PaymentMethodInfo validPaymentMethod = new PaymentMethodInfo(validPaymentType, "Maxime Lebreton"); + + assertDoesNotThrow(() -> PaymentMethodValidator.validate(validPaymentMethod)); + } + + @ParameterizedTest + @ValueSource(strings = {"jambon", " ", ""}) + void testNotValidatePaymentType(String invalidPaymentType) { + PaymentMethodInfo invalidPaymentMethod = new PaymentMethodInfo(invalidPaymentType, "Maxime Lebreton"); + + NotValidPaymentMethodException exception = assertThrows( + NotValidPaymentMethodException.class, + () -> PaymentMethodValidator.validate(invalidPaymentMethod) + ); + + assertEquals(PaymentMethodValidator.MODE_PAIEMENT_IS_NOT_VALIDE, exception.getMessage()); + } + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/SubscriptionValidatorTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/SubscriptionValidatorTest.java new file mode 100644 index 0000000..c9d3d64 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/SubscriptionValidatorTest.java @@ -0,0 +1,84 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.validator; + +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionDurationDesired; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionInfo; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class SubscriptionValidatorTest { + + @Test + @DisplayName("Should validate subscription with valid data") + void testValidateValidSubscription() { + LocalDate desiredStartDate = LocalDate.of(2026, 6, 24); + SubscriptionInfo validSubscription = new SubscriptionInfo(SubscriptionDurationDesired.THREE.getValue(), desiredStartDate); + + assertDoesNotThrow(() -> SubscriptionValidator.validate(validSubscription)); + } + + @Nested + @DisplayName("SubscriptionDurationDesired validation tests") + class SubscriptionDurationDesiredValidationTests { + + @ParameterizedTest + @EnumSource(value = SubscriptionDurationDesired.class) + void testValidateSubscriptionDurationDesired(SubscriptionDurationDesired subscriptionDurationDesired) { + Integer validSubscriptionDurationDesired = subscriptionDurationDesired.getValue(); + LocalDate desiredStartDate = LocalDate.of(2026, 6, 24); + SubscriptionInfo validSubscription = new SubscriptionInfo(validSubscriptionDurationDesired, desiredStartDate); + + assertDoesNotThrow(() -> SubscriptionValidator.validate(validSubscription)); + } + + @Test + @DisplayName("Should throw exception when subscriptionDurationDesired is not 3, 6 or 12") + void testNotValidateSubscriptionDurationDesired() { + Integer notValidSubscriptionDurationDesired = 1 ; + LocalDate desiredStartDate = LocalDate.of(2026, 6, 24); + SubscriptionInfo invalidSubscription = new SubscriptionInfo(notValidSubscriptionDurationDesired, desiredStartDate); + + NotValidSubscriptionException exception = assertThrows( + NotValidSubscriptionException.class, + () -> SubscriptionValidator.validate(invalidSubscription) + ); + assertEquals(SubscriptionValidator.SUBSCRIPTION_DURATION_DESIRED_IS_NOT_VALIDE, exception.getMessage()); + } + } + + @Nested + @DisplayName("DesiredStartDate validation tests") + class DesiredStartDateValidationTests { + + @Test + @DisplayName("Should validate when desiredStartDate is before today") + void testValidateDesiredStartDate() { + LocalDate desiredStartDate = LocalDate.now(); + SubscriptionInfo validSubscription = new SubscriptionInfo(SubscriptionDurationDesired.THREE.getValue(), desiredStartDate); + + assertDoesNotThrow(() -> SubscriptionValidator.validate(validSubscription)); + } + + @Test + @DisplayName("Should throw exception when desiredStartDate is before today") + void testNotValidateDesiredStartDate() { + LocalDate desiredStartDate = LocalDate.of(2026, 3, 24); + SubscriptionInfo validSubscription = new SubscriptionInfo(SubscriptionDurationDesired.THREE.getValue(), desiredStartDate); + + NotValidSubscriptionException exception = assertThrows( + NotValidSubscriptionException.class, + () -> SubscriptionValidator.validate(validSubscription) + ); + + assertEquals(SubscriptionValidator.DESIRED_START_DATE_CANNOT_BE_BEFORE_TODAY, exception.getMessage()); + } + } +}