From 3734847aecc08ef59c41d087c7e7467b1b948f77 Mon Sep 17 00:00:00 2001 From: Ab3d0 Date: Sun, 14 Jun 2026 15:37:57 +0200 Subject: [PATCH] Feat: Add Subscription Tests and the Subscription code --- pom.xml | 14 ++ .../mylibrary/subscription/ModePaiement.java | 13 ++ .../subscription/SubscriptionDTO.java | 17 ++ .../subscription/SubscriptionDuree.java | 21 ++ .../subscription/SubscriptionInfo.java | 12 + .../mylibrary/subscription/TypePaiement.java | 6 + .../converter/SubscriptionConverter.java | 39 ++++ .../subscription/entity/Subscription.java | 25 +++ .../NotValidSubscriptionException.java | 8 + .../SubscriptionNotFoundException.java | 12 + .../repository/SubscriptionRepository.java | 51 +++++ .../usecase/SubscriptionUseCase.java | 63 ++++++ .../validator/SubscriptionValidator.java | 51 +++++ .../converter/SubscriptionConverterTest.java | 78 +++++++ .../subscription/entity/SubscriptionTest.java | 67 ++++++ .../NotValidSubscriptionExceptionTest.java | 61 +++++ .../SubscriptionNotFoundExceptionTest.java | 48 ++++ .../SubscriptionRepositoryTest.java | 194 ++++++++++++++++ .../usecase/SubscriptionUseCaseTest.java | 211 ++++++++++++++++++ .../validator/SubscriptionValidatorTest.java | 200 +++++++++++++++++ 20 files changed, 1191 insertions(+) create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/ModePaiement.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionDTO.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionDuree.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionInfo.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/TypePaiement.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/converter/SubscriptionConverter.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/entity/Subscription.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/NotValidSubscriptionException.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/SubscriptionNotFoundException.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/repository/SubscriptionRepository.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/usecase/SubscriptionUseCase.java create mode 100644 src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/SubscriptionValidator.java create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/converter/SubscriptionConverterTest.java create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/entity/SubscriptionTest.java create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/NotValidSubscriptionExceptionTest.java create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/SubscriptionNotFoundExceptionTest.java create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/repository/SubscriptionRepositoryTest.java create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/usecase/SubscriptionUseCaseTest.java create mode 100644 src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/SubscriptionValidatorTest.java diff --git a/pom.xml b/pom.xml index 27ec78e..4f48e8b 100644 --- a/pom.xml +++ b/pom.xml @@ -117,6 +117,20 @@ ${mockito.version} test + + junit + junit + 4.13.2 + compile + + + org.junit.jupiter + junit-jupiter-api + + + org.junit.jupiter + junit-jupiter-params + diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/ModePaiement.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/ModePaiement.java new file mode 100644 index 0000000..d3579be --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/ModePaiement.java @@ -0,0 +1,13 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription; + + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class ModePaiement { + private final TypePaiement type; + private final Object details; + +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionDTO.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionDTO.java new file mode 100644 index 0000000..4f3d853 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionDTO.java @@ -0,0 +1,17 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription; + +import lombok.Builder; +import lombok.Getter; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.UUID; + +@Builder +@Getter +public class SubscriptionDTO { + private final UUID abonnementId; + private final Date dateDebut; + private final Date dateFin; + private final BigDecimal montantMensuel; +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionDuree.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionDuree.java new file mode 100644 index 0000000..2956c03 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionDuree.java @@ -0,0 +1,21 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription; + +import java.math.BigDecimal; + +public enum SubscriptionDuree { + M3,M6,M12; + + private Integer[] subValues = {3,6,12}; + private BigDecimal[] subPrices = {BigDecimal.valueOf(9.99), BigDecimal.valueOf(9.50), + BigDecimal.valueOf(8.99)}; + + public int getValue(){ + return subValues[this.ordinal()]; + } + + public BigDecimal getMonthlyPricing(){ + return subPrices[this.ordinal()]; + } + + +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionInfo.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionInfo.java new file mode 100644 index 0000000..99280bd --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/SubscriptionInfo.java @@ -0,0 +1,12 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription; + +import java.util.Date; +import java.util.UUID; + +public record SubscriptionInfo ( + UUID clientId, + SubscriptionDuree duree, + ModePaiement modePaiement, + Date dateDebutSouhaitee +) { +} \ No newline at end of file diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/TypePaiement.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/TypePaiement.java new file mode 100644 index 0000000..c3217ad --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/TypePaiement.java @@ -0,0 +1,6 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription; + +public enum TypePaiement { + CB, + Paypal +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/converter/SubscriptionConverter.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/converter/SubscriptionConverter.java new file mode 100644 index 0000000..3d13f83 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/converter/SubscriptionConverter.java @@ -0,0 +1,39 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.converter; + +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionDTO; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.entity.Subscription; + +import java.util.Calendar; + +public final class SubscriptionConverter { + + private SubscriptionConverter() { + } + + public static Subscription toDomain(SubscriptionInfo subscriptionInfo) { + Subscription sub = Subscription.builder() + .clientId(subscriptionInfo.clientId()) + .duree(subscriptionInfo.duree()) + .modePaiement(subscriptionInfo.modePaiement()) + .dateDebutSouhaitee(subscriptionInfo.dateDebutSouhaitee()) + .build(); + sub.setRandomUUID(); + return sub; + } + + public static SubscriptionDTO toDTO(Subscription subscription) { + + Calendar cal = Calendar.getInstance(); + cal.setTime(subscription.getDateDebutSouhaitee()); + cal.add(Calendar.MONTH, subscription.getDuree().getValue()); + + return SubscriptionDTO.builder() + .abonnementId(subscription.getAbonnementId()) + .dateDebut(subscription.getDateDebutSouhaitee()) + .dateFin(cal.getTime()) + .montantMensuel(subscription.getDuree().getMonthlyPricing()) + .build(); + + } +} \ No newline at end of file diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/entity/Subscription.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/entity/Subscription.java new file mode 100644 index 0000000..30ca584 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/entity/Subscription.java @@ -0,0 +1,25 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.entity; + + +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.ModePaiement; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionDuree; +import lombok.Builder; +import lombok.Getter; + +import java.util.Date; +import java.util.UUID; + +@Builder +@Getter +public class Subscription { + private UUID abonnementId; + private UUID clientId; + private SubscriptionDuree duree; + private ModePaiement modePaiement; + private Date dateDebutSouhaitee; + + public void setRandomUUID() { + this.abonnementId = UUID.randomUUID(); + } + +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/NotValidSubscriptionException.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/NotValidSubscriptionException.java new file mode 100644 index 0000000..4ab97d2 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/NotValidSubscriptionException.java @@ -0,0 +1,8 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception; + +public class NotValidSubscriptionException extends Exception { + + public NotValidSubscriptionException(String message) { + super(message); + } +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/SubscriptionNotFoundException.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/SubscriptionNotFoundException.java new file mode 100644 index 0000000..1db3cea --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/SubscriptionNotFoundException.java @@ -0,0 +1,12 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception; + +import java.text.MessageFormat; +import java.util.UUID; + +public class SubscriptionNotFoundException extends Exception{ + public static final String THE_SUBSCRIPTION_WITH_ID_DOES_NOT_EXIST_MESSAGE = "The Subscription with id {0} does not exist"; + + public SubscriptionNotFoundException(UUID uuid) { + super(MessageFormat.format(THE_SUBSCRIPTION_WITH_ID_DOES_NOT_EXIST_MESSAGE, uuid)); + } +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/repository/SubscriptionRepository.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/repository/SubscriptionRepository.java new file mode 100644 index 0000000..35e4d1b --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/repository/SubscriptionRepository.java @@ -0,0 +1,51 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.repository; + +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.entity.Subscription; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@NoArgsConstructor +public final class SubscriptionRepository { + + private final List subscriptions = new ArrayList<>(); + + public List findAll() { + return subscriptions; + } + + public void deleteAll() { + subscriptions.clear(); + } + + public Subscription save(Subscription newSubscription) { + Optional optionalBookWithSameId = this.findByUuid(newSubscription.getAbonnementId()); + optionalBookWithSameId.ifPresentOrElse(subscriptions::remove, newSubscription::setRandomUUID); + this.subscriptions.add(newSubscription); + return newSubscription; + } + + public Optional findByUuid(UUID uuid) { + return this.subscriptions.stream() + .filter(subscription -> subscription.getAbonnementId().equals(uuid)) + .findFirst(); + } + + public boolean existsById(UUID uuid) { + return this.subscriptions.stream() + .anyMatch(subscription -> subscription.getAbonnementId().equals(uuid)); + } + + public Optional findByClientUuid(UUID uuid) { + return this.subscriptions.stream() + .filter(subscription -> subscription.getClientId().equals(uuid)) + .findFirst(); + } + + public void delete(Subscription subscription) { + this.subscriptions.remove(subscription); + } +} diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/usecase/SubscriptionUseCase.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/usecase/SubscriptionUseCase.java new file mode 100644 index 0000000..948562b --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/usecase/SubscriptionUseCase.java @@ -0,0 +1,63 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.usecase; + +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionDTO; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.converter.SubscriptionConverter; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.entity.Subscription; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.NotValidSubscriptionException; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.SubscriptionNotFoundException; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.repository.SubscriptionRepository; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.validator.SubscriptionValidator; + +import java.util.Optional; +import java.util.UUID; + +public class SubscriptionUseCase { + + private final SubscriptionRepository subscriptionRepository; + + public SubscriptionUseCase(SubscriptionRepository subscriptionRepository) { + this.subscriptionRepository = subscriptionRepository; + + } + + public SubscriptionDTO registerSubscription(SubscriptionInfo subscriptionInfo) throws NotValidSubscriptionException { + SubscriptionValidator.validate(subscriptionInfo); + Subscription subscriptionToRegister = SubscriptionConverter.toDomain(subscriptionInfo); + Subscription registeredSubscription = subscriptionRepository.save(subscriptionToRegister); + return SubscriptionConverter.toDTO(registeredSubscription); + } + + public Optional findSubscriptionByUuid(UUID uuid) { + Optional optionalSubscription = subscriptionRepository.findByClientUuid(uuid); + return optionalSubscription.map(SubscriptionConverter::toDTO); + } + + public SubscriptionDTO updateSubscription(UUID uuid, SubscriptionInfo subscriptionInfo) throws SubscriptionNotFoundException, NotValidSubscriptionException { + SubscriptionValidator.validate(subscriptionInfo); + Subscription existingSubscription = getSubscriptionIfNotFoundThrowException(uuid); + Subscription updatedSubscription = Subscription.builder() + .abonnementId(uuid) + .clientId(subscriptionInfo.clientId()) + .duree(subscriptionInfo.duree()) + .modePaiement(subscriptionInfo.modePaiement()) + .dateDebutSouhaitee(subscriptionInfo.dateDebutSouhaitee()) + .build(); + Subscription saved = subscriptionRepository.save(updatedSubscription); + return SubscriptionConverter.toDTO(saved); + } + + public void deleteSubscription(UUID uuid) throws SubscriptionNotFoundException { + Subscription subscriptionToDelete = getSubscriptionIfNotFoundThrowException(uuid); + subscriptionRepository.delete(subscriptionToDelete); + } + + private Subscription getSubscriptionIfNotFoundThrowException(UUID uuid) throws SubscriptionNotFoundException { + Optional optionalSubscription = subscriptionRepository.findByUuid(uuid); + if (optionalSubscription.isEmpty()) { + throw new SubscriptionNotFoundException(uuid); + } + return optionalSubscription.get(); + } +} + diff --git a/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/SubscriptionValidator.java b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/SubscriptionValidator.java new file mode 100644 index 0000000..6cbbde1 --- /dev/null +++ b/src/main/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/SubscriptionValidator.java @@ -0,0 +1,51 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.validator; + +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.TypePaiement; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.NotValidSubscriptionException; + +public final class SubscriptionValidator { + + public static final String Client_ID_NOT_VALID = "l'identifient du client est incorect" ; + public static final String LA_DUREE_RENSEIGNEE_N_EST_PAS_CORRECTE = "La durée renseignée n'est pas correcte"; + public static final String LE_TYPE_DE_PAYEMENT_N_EST_PAS_PRIS_EN_CHARGE = "Le type de payement n'est pas pris en charge"; + public static final String LA_DATE_DE_DEBUT_N_A_PAS_ETE_RENSEIGNEE = "La date de début n'a pas été renseignée"; + + private SubscriptionValidator() { + } + + public static void validate(SubscriptionInfo bookInfo) throws NotValidSubscriptionException { + validateClientID(bookInfo); + validateDuree(bookInfo); + validateModePaiement(bookInfo); + validateDateDebut(bookInfo); + } + + private static void validateClientID(SubscriptionInfo bookInfo) throws NotValidSubscriptionException { + if (bookInfo.clientId() == null){ + throw new NotValidSubscriptionException(Client_ID_NOT_VALID); + } + } + + private static void validateDuree(SubscriptionInfo bookInfo) throws NotValidSubscriptionException { + try { + if (bookInfo.duree().getValue() != 3 && bookInfo.duree().getValue() != 6 && bookInfo.duree().getValue() != 12){ + throw new NotValidSubscriptionException(LA_DUREE_RENSEIGNEE_N_EST_PAS_CORRECTE); + } + } catch (Exception e) { + throw new NotValidSubscriptionException(LA_DUREE_RENSEIGNEE_N_EST_PAS_CORRECTE); + } + } + + private static void validateModePaiement(SubscriptionInfo bookInfo) throws NotValidSubscriptionException{ + if (bookInfo.modePaiement().getType() != TypePaiement.CB && bookInfo.modePaiement().getType() != TypePaiement.Paypal){ + throw new NotValidSubscriptionException(LE_TYPE_DE_PAYEMENT_N_EST_PAS_PRIS_EN_CHARGE); + } + } + + private static void validateDateDebut(SubscriptionInfo bookInfo) throws NotValidSubscriptionException{ + if (bookInfo.dateDebutSouhaitee() == null){ + throw new NotValidSubscriptionException(LA_DATE_DE_DEBUT_N_A_PAS_ETE_RENSEIGNEE); + } + } +} \ No newline at end of file diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/converter/SubscriptionConverterTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/converter/SubscriptionConverterTest.java new file mode 100644 index 0000000..b4ee507 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/converter/SubscriptionConverterTest.java @@ -0,0 +1,78 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.converter; + +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.*; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.entity.Subscription; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.Calendar; +import java.util.Date; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@DisplayName("SubscriptionConverter Unit Tests") +class SubscriptionConverterTest { + + @Nested + @DisplayName("toDomain() method tests") + class ToDomainTests { + + @Test + @DisplayName("Should convert SubscriptionInfo to Subscription domain object") + void shouldConvertSubscriptionInfoToDomain() { + SubscriptionInfo subscriptionInfo = new SubscriptionInfo( + UUID.randomUUID(), + SubscriptionDuree.M3, + ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build(), + new Date() + ); + + Subscription result = SubscriptionConverter.toDomain(subscriptionInfo); + + assertNotNull(result); + assertEquals(subscriptionInfo.clientId(), result.getClientId()); + assertEquals(subscriptionInfo.duree(), result.getDuree()); + assertEquals(subscriptionInfo.modePaiement().getType(), result.getModePaiement().getType()); + assertEquals(subscriptionInfo.modePaiement().getDetails(), result.getModePaiement().getDetails()); + assertEquals(subscriptionInfo.dateDebutSouhaitee(), result.getDateDebutSouhaitee()); + } + } + + @Nested + @DisplayName("toDTO() method tests") + class ToDTOTests { + + @Test + @DisplayName("Should convert Subscription domain object to SubscriptionDTO with all fields mapped correctly") + void shouldConvertSubscriptionToDTO() { + Subscription subscription = Subscription.builder() + .clientId(UUID.randomUUID()) + .duree(SubscriptionDuree.M3) + .modePaiement(ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build()) + .dateDebutSouhaitee(new Date()) + .build(); + subscription.setRandomUUID(); + + SubscriptionDTO result = SubscriptionConverter.toDTO(subscription); + + Calendar cal = Calendar.getInstance(); + cal.setTime(subscription.getDateDebutSouhaitee()); + cal.add(Calendar.MONTH, subscription.getDuree().getValue()); + + assertNotNull(result); + assertEquals(subscription.getAbonnementId(), result.getAbonnementId()); + assertEquals(subscription.getDateDebutSouhaitee(), result.getDateDebut()); + assertEquals(cal.getTime(), result.getDateFin()); + assertEquals(subscription.getDuree().getMonthlyPricing(), result.getMontantMensuel()); + } + } +} \ No newline at end of file diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/entity/SubscriptionTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/entity/SubscriptionTest.java new file mode 100644 index 0000000..eb50063 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/entity/SubscriptionTest.java @@ -0,0 +1,67 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.entity; + +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.ModePaiement; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionDuree; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.TypePaiement; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Date; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +class SubscriptionTest { + + @Test + @DisplayName("Builder should create a valid Subscription instance") + void testSubscriptionBuilder() { + UUID id = UUID.randomUUID(); + UUID id2 = UUID.randomUUID(); + Date adj = new Date(); + + Subscription subscription = Subscription.builder() + .abonnementId(id) + .clientId(id2) + .duree(SubscriptionDuree.M3) + .modePaiement(ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build()) + .dateDebutSouhaitee(adj) + .build(); + + + assertEquals(id, subscription.getAbonnementId()); + assertEquals(id2, subscription.getClientId()); + assertEquals(SubscriptionDuree.M3, subscription.getDuree()); + assertEquals(TypePaiement.CB, subscription.getModePaiement().getType()); + assertEquals("yes", subscription.getModePaiement().getDetails()); + assertEquals(adj, subscription.getDateDebutSouhaitee()); + } + + @Test + @DisplayName("setRandomUUID should set a new non-null UUID") + void testSetRandomUUID() { + Subscription subscription = Subscription.builder().build(); + UUID originalId = subscription.getAbonnementId(); + + subscription.setRandomUUID(); + + assertNotNull(subscription.getAbonnementId()); + assertNotEquals(originalId, subscription.getAbonnementId()); + } + + @Test + @DisplayName("Two setRandomUUID calls should produce different UUIDs") + void testSetRandomUUIDTwice() { + Subscription subscription = Subscription.builder().build(); + subscription.setRandomUUID(); + UUID firstId = subscription.getAbonnementId(); + + subscription.setRandomUUID(); + UUID secondId = subscription.getAbonnementId(); + + assertNotEquals(firstId, secondId); + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/NotValidSubscriptionExceptionTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/NotValidSubscriptionExceptionTest.java new file mode 100644 index 0000000..bda72a0 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/NotValidSubscriptionExceptionTest.java @@ -0,0 +1,61 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class NotValidSubscriptionExceptionTest { + + @Test + @DisplayName("Exception should be created with the provided message") + void testExceptionCreation() { + String errorMessage = "Subscription data is not valid"; + + NotValidSubscriptionException exception = new NotValidSubscriptionException(errorMessage); + + assertEquals(errorMessage, exception.getMessage()); + } + + @ParameterizedTest + @ValueSource(strings = { + "Client UUID must be set", + "Durée cannot be blank", + "ModePayement cannot be blank", + "DateDebutSouhaitee cannot be blank" + }) + @DisplayName("Exception should handle different validation messages") + void testExceptionWithDifferentMessages(String errorMessage) { + NotValidSubscriptionException exception = new NotValidSubscriptionException(errorMessage); + + assertEquals(errorMessage, exception.getMessage()); + } + + @Test + @DisplayName("Exception should be properly thrown and caught") + void testExceptionCanBeThrownAndCaught() { + String errorMessage = "Client UUID must be set"; + + Exception exception = assertThrows(NotValidSubscriptionException.class, () -> { + throw new NotValidSubscriptionException(errorMessage); + }); + + assertEquals(errorMessage, exception.getMessage()); + } + + @Test + @DisplayName("Exception should be catchable as a general Exception") + void testExceptionInheritance() { + String errorMessage = "Price must be positive"; + + try { + throw new NotValidSubscriptionException(errorMessage); + } catch (Exception e) { + assertEquals(NotValidSubscriptionException.class, e.getClass()); + assertEquals(errorMessage, e.getMessage()); + } + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/SubscriptionNotFoundExceptionTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/SubscriptionNotFoundExceptionTest.java new file mode 100644 index 0000000..e857fbc --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/exception/SubscriptionNotFoundExceptionTest.java @@ -0,0 +1,48 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class SubscriptionNotFoundExceptionTest { + + @Test + @DisplayName("Exception message should contain the UUID provided") + void testExceptionMessageContainsUUID() { + UUID uuid = UUID.randomUUID(); + + SubscriptionNotFoundException exception = new SubscriptionNotFoundException(uuid); + + String expectedMessage = String.format("The Subscription with id %s does not exist", uuid); + assertEquals(expectedMessage, exception.getMessage()); + } + + @Test + @DisplayName("Exception should use the correct constant message format") + void testExceptionUsesConstantMessageFormat() { + UUID uuid = UUID.randomUUID(); + + SubscriptionNotFoundException exception = new SubscriptionNotFoundException(uuid); + + assertEquals("The Subscription with id {0} does not exist", + SubscriptionNotFoundException.THE_SUBSCRIPTION_WITH_ID_DOES_NOT_EXIST_MESSAGE); + assertTrue(exception.getMessage().contains(uuid.toString())); + } + + @Test + @DisplayName("Exception should be properly thrown and caught") + void testExceptionCanBeThrownAndCaught() { + UUID uuid = UUID.randomUUID(); + + try { + throw new SubscriptionNotFoundException(uuid); + } catch (SubscriptionNotFoundException e) { + String expectedMessage = String.format("The Subscription with id %s does not exist", uuid); + assertEquals(expectedMessage, e.getMessage()); + } + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/repository/SubscriptionRepositoryTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/repository/SubscriptionRepositoryTest.java new file mode 100644 index 0000000..07be69f --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/repository/SubscriptionRepositoryTest.java @@ -0,0 +1,194 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.repository; + +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.ModePaiement; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionDuree; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.TypePaiement; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.entity.Subscription; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.Date; +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +class SubscriptionRepositoryTest { + + private SubscriptionRepository repository; + private Subscription subscription1; + private Subscription subscription2; + + @BeforeEach + void setUp() { + repository = new SubscriptionRepository(); + + subscription1 = Subscription.builder() + .clientId(UUID.randomUUID()) + .duree(SubscriptionDuree.M3) + .modePaiement(ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build()) + .dateDebutSouhaitee(new Date()) + .build(); + subscription1.setRandomUUID(); + + subscription2 = Subscription.builder() + .clientId(UUID.randomUUID()) + .duree(SubscriptionDuree.M6) + .modePaiement(ModePaiement.builder() + .type(TypePaiement.Paypal) + .details("No") + .build()) + .dateDebutSouhaitee(new Date(0)) + .build(); + subscription2.setRandomUUID(); + } + + @Test + @DisplayName("New repository should be empty") + void testNewRepositoryIsEmpty() { + assertTrue(repository.findAll().isEmpty()); + assertEquals(0, repository.findAll().size()); + } + + @Nested + @DisplayName("Save operations") + class SaveOperations { + + @Test + @DisplayName("Save should add a new subscription") + void testSaveNewSubscription() { + Subscription saved = repository.save(subscription1); + + assertEquals(1, repository.findAll().size()); + assertEquals(subscription1.getAbonnementId(), saved.getAbonnementId()); + assertEquals(subscription1.getClientId(), saved.getClientId()); + } + + @Test + @DisplayName("Save should update existing subscription with same ID") + void testSaveUpdatesExistingSubscription() { + repository.save(subscription1); + UUID uuid = subscription1.getAbonnementId(); + + Subscription updatedSubscription = Subscription.builder() + .abonnementId(uuid) + .clientId(UUID.randomUUID()) + .duree(SubscriptionDuree.M12) + .modePaiement(ModePaiement.builder() + .type(TypePaiement.CB) + .details("maybe") + .build()) + .dateDebutSouhaitee(new Date(500000)) + .build(); + + Subscription saved = repository.save(updatedSubscription); + + assertEquals(1, repository.findAll().size()); + assertEquals(uuid, saved.getAbonnementId()); + assertEquals(SubscriptionDuree.M12, saved.getDuree()); + assertEquals("maybe", saved.getModePaiement().getDetails()); + } + + @Test + @DisplayName("Save multiple subscriptions should add all of them") + void testSaveMultipleSubscriptions() { + repository.save(subscription1); + repository.save(subscription2); + + assertEquals(2, repository.findAll().size()); + assertTrue(repository.findAll().contains(subscription1)); + assertTrue(repository.findAll().contains(subscription2)); + } + } + + @Nested + @DisplayName("Find operations") + class FindOperations { + + @BeforeEach + void setUpSubscriptions() { + repository.save(subscription1); + repository.save(subscription2); + } + + @Test + @DisplayName("FindAll should return all subscriptions") + void testFindAll() { + assertEquals(2, repository.findAll().size()); + } + + @Test + @DisplayName("findByUuid should return subscription with matching ID") + void testfindByUuid() { + Optional found = repository.findByClientUuid(subscription1.getClientId()); + + assertTrue(found.isPresent()); + assertEquals(subscription1.getAbonnementId(), found.get().getAbonnementId()); + assertEquals(subscription1.getDuree(), found.get().getDuree()); + } + + @Test + @DisplayName("FindById should return empty Optional when ID doesn't exist") + void testFindByIdNotFound() { + Optional found = repository.findByUuid(UUID.randomUUID()); + + assertTrue(found.isEmpty()); + } + + @Test + @DisplayName("ExistsById should return true when ID exists") + void testExistsByIdExists() { + assertTrue(repository.existsById(subscription1.getAbonnementId())); + } + + @Test + @DisplayName("ExistsById should return false when ID doesn't exist") + void testExistsByIdNotExists() { + assertFalse(repository.existsById(UUID.randomUUID())); + } + } + + @Nested + @DisplayName("Delete operations") + class DeleteOperations { + + @BeforeEach + void setUpSubscriptions() { + repository.save(subscription1); + repository.save(subscription2); + } + + @Test + @DisplayName("Delete should remove the specified subscription") + void testDelete() { + repository.delete(subscription1); + + assertEquals(1, repository.findAll().size()); + assertFalse(repository.findAll().contains(subscription1)); + assertTrue(repository.findAll().contains(subscription2)); + } + + @Test + @DisplayName("DeleteAll should remove all subscriptions") + void testDeleteAll() { + repository.deleteAll(); + + assertTrue(repository.findAll().isEmpty()); + } + + @Test + @DisplayName("Delete should not throw exception when subscription doesn't exist") + void testDeleteNonExistentSubscription() { + Subscription nonExistent = Subscription.builder().clientId(UUID.randomUUID()).build(); + nonExistent.setRandomUUID(); + + assertDoesNotThrow(() -> repository.delete(nonExistent)); + assertEquals(2, repository.findAll().size()); + } + } +} diff --git a/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/usecase/SubscriptionUseCaseTest.java b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/usecase/SubscriptionUseCaseTest.java new file mode 100644 index 0000000..8717b59 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/usecase/SubscriptionUseCaseTest.java @@ -0,0 +1,211 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.usecase; + +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.*; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.entity.Subscription; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.NotValidSubscriptionException; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.SubscriptionNotFoundException; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.repository.SubscriptionRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Date; +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class SubscriptionUseCaseTest { + + @Mock + private SubscriptionRepository subscriptionRepository; + + @InjectMocks + private SubscriptionUseCase subscriptionUseCase; + + private UUID subscriptionId; + private UUID subscriptionClientId; + private Subscription testSubscription; + private SubscriptionInfo validSubscriptionInfo; + + @BeforeEach + void setUp() { + subscriptionId = UUID.randomUUID(); + subscriptionClientId = UUID.randomUUID(); + + Date adj = new Date(); + + testSubscription = Subscription.builder() + .abonnementId(subscriptionId) + .clientId(subscriptionClientId) + .duree(SubscriptionDuree.M3) + .modePaiement(ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build()) + .dateDebutSouhaitee(new Date()) + .build(); + + validSubscriptionInfo = new SubscriptionInfo( + subscriptionClientId, + SubscriptionDuree.M3, + ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build(), + adj + ); + } + + @Nested + @DisplayName("Register subscription tests") + class RegisterSubscriptionTests { + + @Test + @DisplayName("Should register subscription when valid data is provided") + void testRegisterSubscriptionWithValidData() throws NotValidSubscriptionException { + when(subscriptionRepository.save(any(Subscription.class))).thenReturn(testSubscription); + + SubscriptionDTO returnedSubscriptionDTO = subscriptionUseCase.registerSubscription(validSubscriptionInfo); + + assertNotNull(returnedSubscriptionDTO); + assertEquals(subscriptionId, returnedSubscriptionDTO.getAbonnementId()); + verify(subscriptionRepository, times(1)).save(any(Subscription.class)); + } + + @Test + @DisplayName("Should throw exception when subscription data is not valid") + void testRegisterSubscriptionWithInvalidData() { + SubscriptionInfo invalidSubscriptionInfo = new SubscriptionInfo( + null, + null, + null, + null + ); + + assertThrows(NotValidSubscriptionException.class, + () -> subscriptionUseCase.registerSubscription(invalidSubscriptionInfo)); + + verify(subscriptionRepository, never()).save(any(Subscription.class)); + } + } + + @Nested + @DisplayName("Find subscription tests") + class FindSubscriptionTests { + + @Test + @DisplayName("Should return subscription when client UUID exists") + void testFindSubscriptionByUuid() { + when(subscriptionRepository.findByClientUuid(subscriptionClientId)).thenReturn(Optional.of(testSubscription)); + + Optional foundSubscription = subscriptionUseCase.findSubscriptionByUuid(subscriptionClientId); + + assertTrue(foundSubscription.isPresent()); + assertEquals(testSubscription.getAbonnementId(), foundSubscription.get().getAbonnementId()); + verify(subscriptionRepository, times(1)).findByClientUuid(subscriptionClientId); + } + + @Test + @DisplayName("Should return empty Optional when UUID doesn't exist") + void testFindSubscriptionByUuidNotFound() { + UUID uuid = UUID.randomUUID(); + + Optional foundSubscription = subscriptionUseCase.findSubscriptionByUuid(uuid); + + assertTrue(foundSubscription.isEmpty()); + } + } + + @Nested + @DisplayName("Update subscription tests") + class UpdateSubscriptionTests { + + @Test + @DisplayName("Should update subscription when valid data is provided") + void testUpdateSubscriptionWithValidData() throws SubscriptionNotFoundException, NotValidSubscriptionException { + when(subscriptionRepository.findByUuid(subscriptionId)).thenReturn(Optional.of(testSubscription)); + + Subscription updatedSubscription = Subscription.builder() + .abonnementId(subscriptionId) + .clientId(subscriptionClientId) + .duree(SubscriptionDuree.M6) + .modePaiement(ModePaiement.builder() + .type(TypePaiement.Paypal) + .details("no") + .build()) + .dateDebutSouhaitee(new Date(0)) + .build(); + + when(subscriptionRepository.save(any(Subscription.class))).thenReturn(updatedSubscription); + + SubscriptionInfo updateInfo = new SubscriptionInfo( + subscriptionClientId, + SubscriptionDuree.M6, + ModePaiement.builder() + .type(TypePaiement.Paypal) + .details("no") + .build(), + new Date(0) + ); + + SubscriptionDTO result = subscriptionUseCase.updateSubscription(subscriptionId, updateInfo); + + assertNotNull(result); + assertEquals(subscriptionId, result.getAbonnementId()); + assertEquals(new Date(0), result.getDateDebut()); + verify(subscriptionRepository, times(1)).findByUuid(subscriptionId); + verify(subscriptionRepository, times(1)).save(any(Subscription.class)); + } + + @Test + @DisplayName("Should throw exception when subscription ID doesn't exist") + void testUpdateSubscriptionNotFound() { + UUID nonExistentId = UUID.randomUUID(); + when(subscriptionRepository.findByUuid(nonExistentId)).thenReturn(Optional.empty()); + + assertThrows(SubscriptionNotFoundException.class, + () -> subscriptionUseCase.updateSubscription(nonExistentId, validSubscriptionInfo)); + + verify(subscriptionRepository, times(1)).findByUuid(nonExistentId); + verify(subscriptionRepository, never()).save(any(Subscription.class)); + } + } + + @Nested + @DisplayName("Delete subscription tests") + class DeleteSubscriptionTests { + + @Test + @DisplayName("Should delete subscription when ID exists") + void testDeleteSubscription() throws SubscriptionNotFoundException { + when(subscriptionRepository.findByUuid(subscriptionId)).thenReturn(Optional.of(testSubscription)); + + assertDoesNotThrow(() -> subscriptionUseCase.deleteSubscription(subscriptionId)); + + verify(subscriptionRepository, times(1)).findByUuid(subscriptionId); + verify(subscriptionRepository, times(1)).delete(testSubscription); + } + + @Test + @DisplayName("Should throw exception when deleting unknown subscription") + void testDeleteSubscriptionNotFound() { + UUID nonExistentId = UUID.randomUUID(); + when(subscriptionRepository.findByUuid(nonExistentId)).thenReturn(Optional.empty()); + + assertThrows(SubscriptionNotFoundException.class, + () -> subscriptionUseCase.deleteSubscription(nonExistentId)); + + verify(subscriptionRepository, times(1)).findByUuid(nonExistentId); + verify(subscriptionRepository, never()).delete(any(Subscription.class)); + } + } +} \ No newline at end of file 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..9a9cd98 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/validator/SubscriptionValidatorTest.java @@ -0,0 +1,200 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.validator; + +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.ModePaiement; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionDuree; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.SubscriptionInfo; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.TypePaiement; +import fr.iut_fbleau.but3.dev62.mylibrary.subscription.exception.NotValidSubscriptionException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.Date; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +class SubscriptionValidatorTest { + + private SubscriptionInfo validSubscription() { + + UUID uuid = UUID.randomUUID(); + Date adj = new Date(); + + return new SubscriptionInfo( + uuid, + SubscriptionDuree.M3, + ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build(), + adj + ); + } + + @Test + @DisplayName("Should validate subscription with valid data") + void testValidateValidSubscription() { + assertDoesNotThrow(() -> SubscriptionValidator.validate(validSubscription())); + } + + @Nested + @DisplayName("UUID validation tests") + class UuidValidationTests { + + @Test + @DisplayName("Should Be valid") + void testValidatenormalUUID() { + SubscriptionInfo subscription = new SubscriptionInfo( + UUID.randomUUID(), + SubscriptionDuree.M3, + ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build(), + new Date(0) + ); + + assertDoesNotThrow(() -> SubscriptionValidator.validate(subscription)); + } + + @Test + @DisplayName("Should throw exception when UUID is blank") + void testValidateBlankUuid() { + SubscriptionInfo subscription = new SubscriptionInfo( + null, + SubscriptionDuree.M3, + ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build(), + new Date(0) + ); + + NotValidSubscriptionException exception = assertThrows(NotValidSubscriptionException.class, + () -> SubscriptionValidator.validate(subscription)); + + assertEquals(SubscriptionValidator.Client_ID_NOT_VALID, exception.getMessage()); + } + } + + @Nested + @DisplayName("Date validation tests") + class DateValidationTests { + + @Test + @DisplayName("Should be good") + void testValidateTodayDate() { + SubscriptionInfo subscription = new SubscriptionInfo( + UUID.randomUUID(), + SubscriptionDuree.M3, + ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build(), + new Date() + ); + + assertDoesNotThrow(() -> SubscriptionValidator.validate(subscription)); + } + + @Test + @DisplayName("Should throw exception when Date is null") + void testValidateNullDate() { + SubscriptionInfo subscription = new SubscriptionInfo( + UUID.randomUUID(), + SubscriptionDuree.M3, + ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build(), + null + ); + + NotValidSubscriptionException exception = assertThrows(NotValidSubscriptionException.class, + () -> SubscriptionValidator.validate(subscription)); + + assertEquals(SubscriptionValidator.LA_DATE_DE_DEBUT_N_A_PAS_ETE_RENSEIGNEE, exception.getMessage()); + } + } + + @Nested + @DisplayName("ModePaiement validation tests") + class ModePaiementValidationTests { + + @Test + @DisplayName("Should be good") + void testValidateGoodModePaiement() { + SubscriptionInfo subscription = new SubscriptionInfo( + UUID.randomUUID(), + SubscriptionDuree.M3, + ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build(), + new Date() + ); + + assertDoesNotThrow(() -> SubscriptionValidator.validate(subscription)); + } + + @Test + @DisplayName("Should throw exception when Date is null") + void testValidateNullModePaiement() { + SubscriptionInfo subscription = new SubscriptionInfo( + UUID.randomUUID(), + SubscriptionDuree.M3, + ModePaiement.builder() + .type(null) + .details("yes") + .build(), + new Date() + ); + + NotValidSubscriptionException exception = assertThrows(NotValidSubscriptionException.class, + () -> SubscriptionValidator.validate(subscription)); + + assertEquals(SubscriptionValidator.LE_TYPE_DE_PAYEMENT_N_EST_PAS_PRIS_EN_CHARGE, exception.getMessage()); + } + } + + @Nested + @DisplayName("Durée validation tests") + class DureeValidationTests { + + @Test + @DisplayName("Should be good") + void testValidateGoodDuree() { + SubscriptionInfo subscription = new SubscriptionInfo( + UUID.randomUUID(), + SubscriptionDuree.M3, + ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build(), + new Date() + ); + + assertDoesNotThrow(() -> SubscriptionValidator.validate(subscription)); + } + + @Test + @DisplayName("Should throw exception when Date is null") + void testValidateNullDuree() { + SubscriptionInfo subscription = new SubscriptionInfo( + UUID.randomUUID(), + null, + ModePaiement.builder() + .type(TypePaiement.CB) + .details("yes") + .build(), + new Date() + ); + + NotValidSubscriptionException exception = assertThrows(NotValidSubscriptionException.class, + () -> SubscriptionValidator.validate(subscription)); + + assertEquals(SubscriptionValidator.LA_DUREE_RENSEIGNEE_N_EST_PAS_CORRECTE, exception.getMessage()); + } + } +}