diff --git a/pom.xml b/pom.xml index 27ec78e..cbe66e0 100644 --- a/pom.xml +++ b/pom.xml @@ -117,6 +117,12 @@ ${mockito.version} test + + junit + junit + RELEASE + test + 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..dc42b6c --- /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()); + } + } +} 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/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..d775ce7 --- /dev/null +++ b/src/test/java/fr/iut_fbleau/but3/dev62/mylibrary/subscription/usecase/SubscriptionUseCaseTest.java @@ -0,0 +1,218 @@ +package fr.iut_fbleau.but3.dev62.mylibrary.subscription.usecase; + + +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.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.UUID; + +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)); + } + } +} + + + + + + + + + + + + + + + + + + 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..da0d041 --- /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()); + } + } +} \ No newline at end of file