From 13635e269b8d5e5fa306aee32e46f828c7328b3d Mon Sep 17 00:00:00 2001 From: dahoud <41957584+DahoudG@users.noreply.github.com> Date: Sat, 25 Apr 2026 12:42:06 +0000 Subject: [PATCH] test(sprint-10 api): tests DTOs Sprint 10 pour Jacoco 100% MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Build api 1.0.8 a échoué sur jacoco:check (97-99% < 100% requis). Ajout des tests manquants pour les 6 nouveaux DTOs + extension UpdateOrganisationRequestTest. Tests ajoutés - CreateBeneficiaireEffectifRequestTest : 8 tests (builder all-fields, validation 5 champs obligatoires, nationalité ISO-3, natureControle regex, pourcentage 0-100, paysResidence vide accepté, valide complet, equals/hash/toString) - UpdateBeneficiaireEffectifRequestTest : 7 tests (builder, vide valide, pourcentage > 100, nationalité format, natureControle invalide / vide, equals/hash/toString) - BeneficiaireEffectifResponseTest : 3 tests (all-fields, null defaults, equals) - AuditTrailOperationResponseTest : 3 tests (all-fields, null defaults, equals) - CreateRoleDelegationRequestTest : 6 tests (builder, 6 champs obligatoires, role regex, dateFin future, valide, equals) - RoleDelegationResponseTest : 3 tests (all-fields, null, equals) - UpdateOrganisationRequestTest : 4 tests ajoutés (referentielComptable valide × 3, vide accepté, invalide, complianceOfficerId) Total +34 tests, attendus pour rétablir Jacoco 100% bundle. --- .../AuditTrailOperationResponseTest.java | 67 +++++++++ .../CreateRoleDelegationRequestTest.java | 106 ++++++++++++++ .../response/RoleDelegationResponseTest.java | 59 ++++++++ ...CreateBeneficiaireEffectifRequestTest.java | 133 ++++++++++++++++++ ...UpdateBeneficiaireEffectifRequestTest.java | 104 ++++++++++++++ .../BeneficiaireEffectifResponseTest.java | 80 +++++++++++ .../UpdateOrganisationRequestTest.java | 45 ++++++ 7 files changed, 594 insertions(+) create mode 100644 src/test/java/dev/lions/unionflow/server/api/dto/audit/response/AuditTrailOperationResponseTest.java create mode 100644 src/test/java/dev/lions/unionflow/server/api/dto/delegation/request/CreateRoleDelegationRequestTest.java create mode 100644 src/test/java/dev/lions/unionflow/server/api/dto/delegation/response/RoleDelegationResponseTest.java create mode 100644 src/test/java/dev/lions/unionflow/server/api/dto/kyc/request/CreateBeneficiaireEffectifRequestTest.java create mode 100644 src/test/java/dev/lions/unionflow/server/api/dto/kyc/request/UpdateBeneficiaireEffectifRequestTest.java create mode 100644 src/test/java/dev/lions/unionflow/server/api/dto/kyc/response/BeneficiaireEffectifResponseTest.java diff --git a/src/test/java/dev/lions/unionflow/server/api/dto/audit/response/AuditTrailOperationResponseTest.java b/src/test/java/dev/lions/unionflow/server/api/dto/audit/response/AuditTrailOperationResponseTest.java new file mode 100644 index 0000000..c612b7a --- /dev/null +++ b/src/test/java/dev/lions/unionflow/server/api/dto/audit/response/AuditTrailOperationResponseTest.java @@ -0,0 +1,67 @@ +package dev.lions.unionflow.server.api.dto.audit.response; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.LocalDateTime; +import java.util.UUID; +import org.junit.jupiter.api.Test; + +class AuditTrailOperationResponseTest { + + @Test + void testBuilder_AllFields() { + UUID id = UUID.randomUUID(); + UUID userId = UUID.randomUUID(); + UUID orgId = UUID.randomUUID(); + UUID entityId = UUID.randomUUID(); + UUID requestId = UUID.randomUUID(); + LocalDateTime now = LocalDateTime.now(); + + AuditTrailOperationResponse r = AuditTrailOperationResponse.builder() + .id(id).userId(userId).userEmail("a@b.com").roleActif("TRESORIER") + .organisationActiveId(orgId) + .actionType("PAYMENT_INITIATED").entityType("Paiement").entityId(entityId) + .description("Paiement initié") + .ipAddress("192.168.1.1").userAgent("Mozilla").requestId(requestId) + .payloadAvant("{}").payloadApres("{\"k\":1}").metadata("{\"src\":\"web\"}") + .sodCheckPassed(true).sodViolations(null) + .operationAt(now) + .build(); + + assertThat(r.id()).isEqualTo(id); + assertThat(r.userId()).isEqualTo(userId); + assertThat(r.userEmail()).isEqualTo("a@b.com"); + assertThat(r.roleActif()).isEqualTo("TRESORIER"); + assertThat(r.organisationActiveId()).isEqualTo(orgId); + assertThat(r.actionType()).isEqualTo("PAYMENT_INITIATED"); + assertThat(r.entityType()).isEqualTo("Paiement"); + assertThat(r.entityId()).isEqualTo(entityId); + assertThat(r.description()).isEqualTo("Paiement initié"); + assertThat(r.ipAddress()).isEqualTo("192.168.1.1"); + assertThat(r.userAgent()).isEqualTo("Mozilla"); + assertThat(r.requestId()).isEqualTo(requestId); + assertThat(r.payloadAvant()).isEqualTo("{}"); + assertThat(r.payloadApres()).isEqualTo("{\"k\":1}"); + assertThat(r.metadata()).isEqualTo("{\"src\":\"web\"}"); + assertThat(r.sodCheckPassed()).isTrue(); + assertThat(r.sodViolations()).isNull(); + assertThat(r.operationAt()).isEqualTo(now); + } + + @Test + void testBuilder_NullFields() { + AuditTrailOperationResponse r = AuditTrailOperationResponse.builder().build(); + assertThat(r.id()).isNull(); + assertThat(r.sodCheckPassed()).isNull(); + } + + @Test + void testEqualsHashCodeToString() { + UUID id = UUID.randomUUID(); + AuditTrailOperationResponse a = AuditTrailOperationResponse.builder().id(id).build(); + AuditTrailOperationResponse b = AuditTrailOperationResponse.builder().id(id).build(); + assertThat(a).isEqualTo(b); + assertThat(a.hashCode()).isEqualTo(b.hashCode()); + assertThat(a.toString()).contains("AuditTrailOperationResponse"); + } +} diff --git a/src/test/java/dev/lions/unionflow/server/api/dto/delegation/request/CreateRoleDelegationRequestTest.java b/src/test/java/dev/lions/unionflow/server/api/dto/delegation/request/CreateRoleDelegationRequestTest.java new file mode 100644 index 0000000..c38c9b3 --- /dev/null +++ b/src/test/java/dev/lions/unionflow/server/api/dto/delegation/request/CreateRoleDelegationRequestTest.java @@ -0,0 +1,106 @@ +package dev.lions.unionflow.server.api.dto.delegation.request; + +import static org.assertj.core.api.Assertions.assertThat; + +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; +import java.time.LocalDateTime; +import java.util.Set; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class CreateRoleDelegationRequestTest { + + private Validator validator; + + @BeforeEach + void setUp() { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + validator = factory.getValidator(); + } + + private CreateRoleDelegationRequest.CreateRoleDelegationRequestBuilder valide() { + return CreateRoleDelegationRequest.builder() + .organisationId(UUID.randomUUID()) + .delegantUserId(UUID.randomUUID()) + .delegataireUserId(UUID.randomUUID()) + .roleDelegue("TRESORIER") + .dateDebut(LocalDateTime.now().plusHours(1)) + .dateFin(LocalDateTime.now().plusDays(14)); + } + + @Test + void testBuilder_AllFields() { + UUID org = UUID.randomUUID(); + UUID delegant = UUID.randomUUID(); + UUID delegataire = UUID.randomUUID(); + LocalDateTime debut = LocalDateTime.of(2026, 5, 1, 9, 0); + LocalDateTime fin = LocalDateTime.of(2026, 5, 15, 18, 0); + + CreateRoleDelegationRequest req = CreateRoleDelegationRequest.builder() + .organisationId(org).delegantUserId(delegant).delegataireUserId(delegataire) + .roleDelegue("TRESORIER").dateDebut(debut).dateFin(fin).motif("Congé") + .build(); + + assertThat(req.organisationId()).isEqualTo(org); + assertThat(req.delegantUserId()).isEqualTo(delegant); + assertThat(req.delegataireUserId()).isEqualTo(delegataire); + assertThat(req.roleDelegue()).isEqualTo("TRESORIER"); + assertThat(req.dateDebut()).isEqualTo(debut); + assertThat(req.dateFin()).isEqualTo(fin); + assertThat(req.motif()).isEqualTo("Congé"); + } + + @Test + void testValidation_ChampsObligatoires() { + CreateRoleDelegationRequest req = CreateRoleDelegationRequest.builder().build(); + Set> v = validator.validate(req); + assertThat(v).anyMatch(x -> x.getPropertyPath().toString().equals("organisationId")); + assertThat(v).anyMatch(x -> x.getPropertyPath().toString().equals("delegantUserId")); + assertThat(v).anyMatch(x -> x.getPropertyPath().toString().equals("delegataireUserId")); + assertThat(v).anyMatch(x -> x.getPropertyPath().toString().equals("roleDelegue")); + assertThat(v).anyMatch(x -> x.getPropertyPath().toString().equals("dateDebut")); + assertThat(v).anyMatch(x -> x.getPropertyPath().toString().equals("dateFin")); + } + + @Test + void testValidation_RoleFormatInvalide() { + CreateRoleDelegationRequest req = valide().roleDelegue("admin-org").build(); + assertThat(validator.validate(req)) + .anyMatch(v -> v.getPropertyPath().toString().equals("roleDelegue")); + } + + @Test + void testValidation_DateFinPassee() { + CreateRoleDelegationRequest req = valide() + .dateFin(LocalDateTime.now().minusDays(1)).build(); + assertThat(validator.validate(req)) + .anyMatch(v -> v.getPropertyPath().toString().equals("dateFin")); + } + + @Test + void testValidation_Valide() { + assertThat(validator.validate(valide().motif("OK").build())).isEmpty(); + } + + @Test + void testEqualsHashCodeToString() { + UUID org = UUID.randomUUID(); + UUID d1 = UUID.randomUUID(); + UUID d2 = UUID.randomUUID(); + LocalDateTime debut = LocalDateTime.now().plusHours(1); + LocalDateTime fin = LocalDateTime.now().plusDays(7); + CreateRoleDelegationRequest a = CreateRoleDelegationRequest.builder() + .organisationId(org).delegantUserId(d1).delegataireUserId(d2) + .roleDelegue("TRESORIER").dateDebut(debut).dateFin(fin).build(); + CreateRoleDelegationRequest b = CreateRoleDelegationRequest.builder() + .organisationId(org).delegantUserId(d1).delegataireUserId(d2) + .roleDelegue("TRESORIER").dateDebut(debut).dateFin(fin).build(); + assertThat(a).isEqualTo(b); + assertThat(a.hashCode()).isEqualTo(b.hashCode()); + assertThat(a.toString()).contains("CreateRoleDelegationRequest"); + } +} diff --git a/src/test/java/dev/lions/unionflow/server/api/dto/delegation/response/RoleDelegationResponseTest.java b/src/test/java/dev/lions/unionflow/server/api/dto/delegation/response/RoleDelegationResponseTest.java new file mode 100644 index 0000000..710b275 --- /dev/null +++ b/src/test/java/dev/lions/unionflow/server/api/dto/delegation/response/RoleDelegationResponseTest.java @@ -0,0 +1,59 @@ +package dev.lions.unionflow.server.api.dto.delegation.response; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.LocalDateTime; +import java.util.UUID; +import org.junit.jupiter.api.Test; + +class RoleDelegationResponseTest { + + @Test + void testBuilder_AllFields() { + UUID id = UUID.randomUUID(); + UUID org = UUID.randomUUID(); + UUID d1 = UUID.randomUUID(); + UUID d2 = UUID.randomUUID(); + LocalDateTime debut = LocalDateTime.of(2026, 5, 1, 9, 0); + LocalDateTime fin = LocalDateTime.of(2026, 5, 15, 18, 0); + LocalDateTime revoc = LocalDateTime.of(2026, 5, 10, 12, 0); + LocalDateTime cree = LocalDateTime.of(2026, 4, 25, 12, 0); + + RoleDelegationResponse r = RoleDelegationResponse.builder() + .id(id).organisationId(org).delegantUserId(d1).delegataireUserId(d2) + .roleDelegue("TRESORIER").dateDebut(debut).dateFin(fin).motif("Congé") + .statut("REVOQUEE").dateRevocation(revoc).dateCreation(cree).estActive(false) + .build(); + + assertThat(r.id()).isEqualTo(id); + assertThat(r.organisationId()).isEqualTo(org); + assertThat(r.delegantUserId()).isEqualTo(d1); + assertThat(r.delegataireUserId()).isEqualTo(d2); + assertThat(r.roleDelegue()).isEqualTo("TRESORIER"); + assertThat(r.dateDebut()).isEqualTo(debut); + assertThat(r.dateFin()).isEqualTo(fin); + assertThat(r.motif()).isEqualTo("Congé"); + assertThat(r.statut()).isEqualTo("REVOQUEE"); + assertThat(r.dateRevocation()).isEqualTo(revoc); + assertThat(r.dateCreation()).isEqualTo(cree); + assertThat(r.estActive()).isFalse(); + } + + @Test + void testBuilder_NullFields() { + RoleDelegationResponse r = RoleDelegationResponse.builder().build(); + assertThat(r.id()).isNull(); + assertThat(r.statut()).isNull(); + assertThat(r.estActive()).isFalse(); + } + + @Test + void testEqualsHashCodeToString() { + UUID id = UUID.randomUUID(); + RoleDelegationResponse a = RoleDelegationResponse.builder().id(id).build(); + RoleDelegationResponse b = RoleDelegationResponse.builder().id(id).build(); + assertThat(a).isEqualTo(b); + assertThat(a.hashCode()).isEqualTo(b.hashCode()); + assertThat(a.toString()).contains("RoleDelegationResponse"); + } +} diff --git a/src/test/java/dev/lions/unionflow/server/api/dto/kyc/request/CreateBeneficiaireEffectifRequestTest.java b/src/test/java/dev/lions/unionflow/server/api/dto/kyc/request/CreateBeneficiaireEffectifRequestTest.java new file mode 100644 index 0000000..46deebe --- /dev/null +++ b/src/test/java/dev/lions/unionflow/server/api/dto/kyc/request/CreateBeneficiaireEffectifRequestTest.java @@ -0,0 +1,133 @@ +package dev.lions.unionflow.server.api.dto.kyc.request; + +import static org.assertj.core.api.Assertions.assertThat; + +import dev.lions.unionflow.server.api.enums.membre.TypePieceIdentite; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.Set; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class CreateBeneficiaireEffectifRequestTest { + + private Validator validator; + + @BeforeEach + void setUp() { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + validator = factory.getValidator(); + } + + private CreateBeneficiaireEffectifRequest.CreateBeneficiaireEffectifRequestBuilder valide() { + return CreateBeneficiaireEffectifRequest.builder() + .kycDossierId(UUID.randomUUID()) + .nom("Dupont") + .prenoms("Jean Pierre") + .dateNaissance(LocalDate.of(1980, 5, 15)) + .nationalite("CIV") + .natureControle("DETENTION_CAPITAL"); + } + + @Test + void testBuilder_AllFields() { + UUID kyc = UUID.randomUUID(); + UUID org = UUID.randomUUID(); + UUID membre = UUID.randomUUID(); + CreateBeneficiaireEffectifRequest req = CreateBeneficiaireEffectifRequest.builder() + .kycDossierId(kyc).organisationCibleId(org).membreId(membre) + .nom("Doe").prenoms("John") + .dateNaissance(LocalDate.of(1980, 1, 1)) + .lieuNaissance("Abidjan") + .nationalite("CIV").paysResidence("FRA") + .typePieceIdentite(TypePieceIdentite.PASSEPORT) + .numeroPieceIdentite("AB123") + .dateExpirationPiece(LocalDate.of(2030, 1, 1)) + .pourcentageCapital(new BigDecimal("30")) + .pourcentageDroitsVote(new BigDecimal("25")) + .natureControle("BENEFICIAIRE_ULTIME") + .estPep(true).pepCategorie("MINISTRE").pepPays("CIV").pepFonction("Min Finance") + .presenceListesSanctions(true).detailsListesSanctions("Liste UN 2024") + .build(); + assertThat(req.kycDossierId()).isEqualTo(kyc); + assertThat(req.organisationCibleId()).isEqualTo(org); + assertThat(req.membreId()).isEqualTo(membre); + assertThat(req.nom()).isEqualTo("Doe"); + assertThat(req.prenoms()).isEqualTo("John"); + assertThat(req.lieuNaissance()).isEqualTo("Abidjan"); + assertThat(req.paysResidence()).isEqualTo("FRA"); + assertThat(req.typePieceIdentite()).isEqualTo(TypePieceIdentite.PASSEPORT); + assertThat(req.numeroPieceIdentite()).isEqualTo("AB123"); + assertThat(req.dateExpirationPiece()).isEqualTo(LocalDate.of(2030, 1, 1)); + assertThat(req.pourcentageCapital()).isEqualByComparingTo("30"); + assertThat(req.pourcentageDroitsVote()).isEqualByComparingTo("25"); + assertThat(req.natureControle()).isEqualTo("BENEFICIAIRE_ULTIME"); + assertThat(req.estPep()).isTrue(); + assertThat(req.pepCategorie()).isEqualTo("MINISTRE"); + assertThat(req.pepPays()).isEqualTo("CIV"); + assertThat(req.pepFonction()).isEqualTo("Min Finance"); + assertThat(req.presenceListesSanctions()).isTrue(); + assertThat(req.detailsListesSanctions()).isEqualTo("Liste UN 2024"); + } + + @Test + void testValidation_ChampsObligatoires() { + CreateBeneficiaireEffectifRequest req = CreateBeneficiaireEffectifRequest.builder().build(); + Set> v = validator.validate(req); + assertThat(v).anyMatch(x -> x.getPropertyPath().toString().equals("nom")); + assertThat(v).anyMatch(x -> x.getPropertyPath().toString().equals("prenoms")); + assertThat(v).anyMatch(x -> x.getPropertyPath().toString().equals("dateNaissance")); + assertThat(v).anyMatch(x -> x.getPropertyPath().toString().equals("nationalite")); + assertThat(v).anyMatch(x -> x.getPropertyPath().toString().equals("natureControle")); + } + + @Test + void testValidation_NationaliteFormatInvalide() { + CreateBeneficiaireEffectifRequest req = valide().nationalite("FR").build(); + assertThat(validator.validate(req)) + .anyMatch(v -> v.getPropertyPath().toString().equals("nationalite")); + } + + @Test + void testValidation_NatureControleInvalide() { + CreateBeneficiaireEffectifRequest req = valide().natureControle("AUTRE").build(); + assertThat(validator.validate(req)) + .anyMatch(v -> v.getPropertyPath().toString().equals("natureControle")); + } + + @Test + void testValidation_PourcentageHorsBornes() { + CreateBeneficiaireEffectifRequest req = valide().pourcentageCapital(new BigDecimal("150")).build(); + assertThat(validator.validate(req)) + .anyMatch(v -> v.getPropertyPath().toString().equals("pourcentageCapital")); + } + + @Test + void testValidation_PaysResidenceVideAccepte() { + CreateBeneficiaireEffectifRequest req = valide().paysResidence("").build(); + assertThat(validator.validate(req)) + .noneMatch(v -> v.getPropertyPath().toString().equals("paysResidence")); + } + + @Test + void testValidation_Valide() { + assertThat(validator.validate(valide().build())).isEmpty(); + } + + @Test + void testEqualsHashCodeToString() { + CreateBeneficiaireEffectifRequest a = valide().build(); + CreateBeneficiaireEffectifRequest b = CreateBeneficiaireEffectifRequest.builder() + .kycDossierId(a.kycDossierId()).nom(a.nom()).prenoms(a.prenoms()) + .dateNaissance(a.dateNaissance()).nationalite(a.nationalite()) + .natureControle(a.natureControle()).build(); + assertThat(a).isEqualTo(b); + assertThat(a.hashCode()).isEqualTo(b.hashCode()); + assertThat(a.toString()).contains("CreateBeneficiaireEffectifRequest"); + } +} diff --git a/src/test/java/dev/lions/unionflow/server/api/dto/kyc/request/UpdateBeneficiaireEffectifRequestTest.java b/src/test/java/dev/lions/unionflow/server/api/dto/kyc/request/UpdateBeneficiaireEffectifRequestTest.java new file mode 100644 index 0000000..38f9b32 --- /dev/null +++ b/src/test/java/dev/lions/unionflow/server/api/dto/kyc/request/UpdateBeneficiaireEffectifRequestTest.java @@ -0,0 +1,104 @@ +package dev.lions.unionflow.server.api.dto.kyc.request; + +import static org.assertj.core.api.Assertions.assertThat; + +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.Set; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class UpdateBeneficiaireEffectifRequestTest { + + private Validator validator; + + @BeforeEach + void setUp() { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + validator = factory.getValidator(); + } + + @Test + void testBuilder_AllFields() { + UpdateBeneficiaireEffectifRequest req = UpdateBeneficiaireEffectifRequest.builder() + .nom("Doe").prenoms("Jane") + .dateNaissance(LocalDate.of(1990, 6, 1)) + .lieuNaissance("Dakar") + .nationalite("SEN").paysResidence("USA") + .pourcentageCapital(new BigDecimal("45")) + .pourcentageDroitsVote(new BigDecimal("50")) + .natureControle("DROITS_VOTE") + .estPep(false).pepCategorie("EX-PEP").pepPays("SEN").pepFonction("Ex-député") + .presenceListesSanctions(false).detailsListesSanctions("RAS") + .build(); + assertThat(req.nom()).isEqualTo("Doe"); + assertThat(req.prenoms()).isEqualTo("Jane"); + assertThat(req.dateNaissance()).isEqualTo(LocalDate.of(1990, 6, 1)); + assertThat(req.lieuNaissance()).isEqualTo("Dakar"); + assertThat(req.nationalite()).isEqualTo("SEN"); + assertThat(req.paysResidence()).isEqualTo("USA"); + assertThat(req.pourcentageCapital()).isEqualByComparingTo("45"); + assertThat(req.pourcentageDroitsVote()).isEqualByComparingTo("50"); + assertThat(req.natureControle()).isEqualTo("DROITS_VOTE"); + assertThat(req.estPep()).isFalse(); + assertThat(req.pepCategorie()).isEqualTo("EX-PEP"); + assertThat(req.pepPays()).isEqualTo("SEN"); + assertThat(req.pepFonction()).isEqualTo("Ex-député"); + assertThat(req.presenceListesSanctions()).isFalse(); + assertThat(req.detailsListesSanctions()).isEqualTo("RAS"); + } + + @Test + void testBuilder_VideValide() { + UpdateBeneficiaireEffectifRequest req = UpdateBeneficiaireEffectifRequest.builder().build(); + Set> v = validator.validate(req); + assertThat(v).isEmpty(); + } + + @Test + void testValidation_PourcentageDepasse100() { + UpdateBeneficiaireEffectifRequest req = UpdateBeneficiaireEffectifRequest.builder() + .pourcentageCapital(new BigDecimal("110")).build(); + assertThat(validator.validate(req)) + .anyMatch(v -> v.getPropertyPath().toString().equals("pourcentageCapital")); + } + + @Test + void testValidation_NationaliteFormatInvalide() { + UpdateBeneficiaireEffectifRequest req = UpdateBeneficiaireEffectifRequest.builder() + .nationalite("FR").build(); + assertThat(validator.validate(req)) + .anyMatch(v -> v.getPropertyPath().toString().equals("nationalite")); + } + + @Test + void testValidation_NatureControleInvalide() { + UpdateBeneficiaireEffectifRequest req = UpdateBeneficiaireEffectifRequest.builder() + .natureControle("INVALIDE").build(); + assertThat(validator.validate(req)) + .anyMatch(v -> v.getPropertyPath().toString().equals("natureControle")); + } + + @Test + void testValidation_NatureControleVideAccepte() { + UpdateBeneficiaireEffectifRequest req = UpdateBeneficiaireEffectifRequest.builder() + .natureControle("").build(); + assertThat(validator.validate(req)) + .noneMatch(v -> v.getPropertyPath().toString().equals("natureControle")); + } + + @Test + void testEqualsHashCodeToString() { + UpdateBeneficiaireEffectifRequest a = UpdateBeneficiaireEffectifRequest.builder() + .nom("X").build(); + UpdateBeneficiaireEffectifRequest b = UpdateBeneficiaireEffectifRequest.builder() + .nom("X").build(); + assertThat(a).isEqualTo(b); + assertThat(a.hashCode()).isEqualTo(b.hashCode()); + assertThat(a.toString()).contains("UpdateBeneficiaireEffectifRequest"); + } +} diff --git a/src/test/java/dev/lions/unionflow/server/api/dto/kyc/response/BeneficiaireEffectifResponseTest.java b/src/test/java/dev/lions/unionflow/server/api/dto/kyc/response/BeneficiaireEffectifResponseTest.java new file mode 100644 index 0000000..fdb3e6c --- /dev/null +++ b/src/test/java/dev/lions/unionflow/server/api/dto/kyc/response/BeneficiaireEffectifResponseTest.java @@ -0,0 +1,80 @@ +package dev.lions.unionflow.server.api.dto.kyc.response; + +import static org.assertj.core.api.Assertions.assertThat; + +import dev.lions.unionflow.server.api.enums.membre.TypePieceIdentite; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.UUID; +import org.junit.jupiter.api.Test; + +class BeneficiaireEffectifResponseTest { + + @Test + void testBuilder_AllFields() { + UUID id = UUID.randomUUID(); + UUID kyc = UUID.randomUUID(); + UUID org = UUID.randomUUID(); + UUID membre = UUID.randomUUID(); + LocalDateTime now = LocalDateTime.now(); + + BeneficiaireEffectifResponse r = BeneficiaireEffectifResponse.builder() + .id(id).kycDossierId(kyc).organisationCibleId(org).membreId(membre) + .nom("Test").prenoms("User") + .dateNaissance(LocalDate.of(1990, 1, 1)).lieuNaissance("Abidjan") + .nationalite("CIV").paysResidence("FRA") + .typePieceIdentite(TypePieceIdentite.PASSEPORT) + .numeroPieceIdentite("AB123").dateExpirationPiece(LocalDate.of(2030, 1, 1)) + .pourcentageCapital(new BigDecimal("25")) + .pourcentageDroitsVote(new BigDecimal("30")) + .natureControle("DETENTION_CAPITAL") + .estPep(true).pepCategorie("MIN").pepPays("CIV").pepFonction("Min") + .presenceListesSanctions(false).detailsListesSanctions("") + .dateCreation(now).dateModification(now).actif(true) + .build(); + + assertThat(r.id()).isEqualTo(id); + assertThat(r.kycDossierId()).isEqualTo(kyc); + assertThat(r.organisationCibleId()).isEqualTo(org); + assertThat(r.membreId()).isEqualTo(membre); + assertThat(r.nom()).isEqualTo("Test"); + assertThat(r.prenoms()).isEqualTo("User"); + assertThat(r.dateNaissance()).isEqualTo(LocalDate.of(1990, 1, 1)); + assertThat(r.lieuNaissance()).isEqualTo("Abidjan"); + assertThat(r.nationalite()).isEqualTo("CIV"); + assertThat(r.paysResidence()).isEqualTo("FRA"); + assertThat(r.typePieceIdentite()).isEqualTo(TypePieceIdentite.PASSEPORT); + assertThat(r.numeroPieceIdentite()).isEqualTo("AB123"); + assertThat(r.dateExpirationPiece()).isEqualTo(LocalDate.of(2030, 1, 1)); + assertThat(r.pourcentageCapital()).isEqualByComparingTo("25"); + assertThat(r.pourcentageDroitsVote()).isEqualByComparingTo("30"); + assertThat(r.natureControle()).isEqualTo("DETENTION_CAPITAL"); + assertThat(r.estPep()).isTrue(); + assertThat(r.pepCategorie()).isEqualTo("MIN"); + assertThat(r.pepPays()).isEqualTo("CIV"); + assertThat(r.pepFonction()).isEqualTo("Min"); + assertThat(r.presenceListesSanctions()).isFalse(); + assertThat(r.detailsListesSanctions()).isEqualTo(""); + assertThat(r.dateCreation()).isEqualTo(now); + assertThat(r.dateModification()).isEqualTo(now); + assertThat(r.actif()).isTrue(); + } + + @Test + void testBuilder_NullFields() { + BeneficiaireEffectifResponse r = BeneficiaireEffectifResponse.builder().build(); + assertThat(r.id()).isNull(); + assertThat(r.actif()).isNull(); + } + + @Test + void testEqualsHashCodeToString() { + UUID id = UUID.randomUUID(); + BeneficiaireEffectifResponse a = BeneficiaireEffectifResponse.builder().id(id).build(); + BeneficiaireEffectifResponse b = BeneficiaireEffectifResponse.builder().id(id).build(); + assertThat(a).isEqualTo(b); + assertThat(a.hashCode()).isEqualTo(b.hashCode()); + assertThat(a.toString()).contains("BeneficiaireEffectifResponse"); + } +} diff --git a/src/test/java/dev/lions/unionflow/server/api/dto/organisation/request/UpdateOrganisationRequestTest.java b/src/test/java/dev/lions/unionflow/server/api/dto/organisation/request/UpdateOrganisationRequestTest.java index 0e6a01c..d3ad85b 100644 --- a/src/test/java/dev/lions/unionflow/server/api/dto/organisation/request/UpdateOrganisationRequestTest.java +++ b/src/test/java/dev/lions/unionflow/server/api/dto/organisation/request/UpdateOrganisationRequestTest.java @@ -255,4 +255,49 @@ class UpdateOrganisationRequestTest { assertThat(toString).contains("TTO"); assertThat(toString).contains("INACTIF"); } + + // ────────────────────────────────────────────────────────────────────── + // Sprint 10 — referentielComptable + complianceOfficerId + // ────────────────────────────────────────────────────────────────────── + + @Test + void testReferentielComptable_ValeursValides() { + for (String r : new String[] {"SYSCOHADA", "SYCEBNL", "PCSFD_UMOA"}) { + UpdateOrganisationRequest req = UpdateOrganisationRequest.builder() + .nom("Org").email("x@y.z").referentielComptable(r).build(); + Set> violations = validator.validate(req); + assertThat(violations).noneMatch( + v -> v.getPropertyPath().toString().equals("referentielComptable")); + } + } + + @Test + void testReferentielComptable_VideAccepte() { + UpdateOrganisationRequest req = UpdateOrganisationRequest.builder() + .nom("Org").email("x@y.z").referentielComptable("").build(); + Set> violations = validator.validate(req); + assertThat(violations).noneMatch( + v -> v.getPropertyPath().toString().equals("referentielComptable")); + } + + @Test + void testReferentielComptable_Invalide() { + UpdateOrganisationRequest req = UpdateOrganisationRequest.builder() + .nom("Org").email("x@y.z").referentielComptable("IFRS").build(); + Set> violations = validator.validate(req); + assertThat(violations).anyMatch( + v -> v.getPropertyPath().toString().equals("referentielComptable")); + } + + @Test + void testComplianceOfficerId_Optionnel() { + java.util.UUID id = java.util.UUID.randomUUID(); + UpdateOrganisationRequest req = UpdateOrganisationRequest.builder() + .nom("Org").email("x@y.z").complianceOfficerId(id).build(); + assertThat(req.complianceOfficerId()).isEqualTo(id); + + UpdateOrganisationRequest reqNull = UpdateOrganisationRequest.builder() + .nom("Org").email("x@y.z").build(); + assertThat(reqNull.complianceOfficerId()).isNull(); + } }