package dev.lions.unionflow.server.entity; import dev.lions.unionflow.server.api.enums.abonnement.StatutSouscription; import dev.lions.unionflow.server.api.enums.abonnement.StatutValidationSouscription; import dev.lions.unionflow.server.api.enums.abonnement.TypePeriodeAbonnement; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.lang.reflect.Method; import java.time.LocalDate; import static org.assertj.core.api.Assertions.assertThat; /** * Tests de couverture pour SouscriptionOrganisation. * Couvre les branches manquantes de onCreate() et decrementerQuota(). */ @DisplayName("SouscriptionOrganisation - branches manquantes") class SouscriptionOrganisationBranchTest { // ── onCreate() ──────────────────────────────────────────────────────────── /** * Branch manquante : formule != null mais quotaMax est déjà renseigné * → la ligne `quotaMax = formule.getMaxMembres()` n'est PAS exécutée. */ @Test @DisplayName("onCreate: formule présente mais quotaMax déjà défini → quotaMax conservé") void onCreate_formuleNonNull_quotaMaxDejaDefini_conserveQuotaMax() throws Exception { FormuleAbonnement formule = new FormuleAbonnement(); formule.setMaxMembres(50); SouscriptionOrganisation s = new SouscriptionOrganisation(); s.setDateDebut(LocalDate.now()); s.setDateFin(LocalDate.now().plusMonths(1)); s.setFormule(formule); s.setQuotaMax(100); // déjà défini → ne doit PAS être écrasé Method onCreate = SouscriptionOrganisation.class.getDeclaredMethod("onCreate"); onCreate.setAccessible(true); onCreate.invoke(s); // quotaMax reste 100, pas remplacé par formule.getMaxMembres() (50) assertThat(s.getQuotaMax()).isEqualTo(100); // les autres defaults sont positionnés assertThat(s.getStatut()).isEqualTo(StatutSouscription.ACTIVE); assertThat(s.getTypePeriode()).isEqualTo(TypePeriodeAbonnement.MENSUEL); assertThat(s.getQuotaUtilise()).isEqualTo(0); } /** * Branch manquante : statutValidation == null → la valeur par défaut EN_ATTENTE_PAIEMENT est affectée. */ @Test @DisplayName("onCreate: statutValidation null → initialisé à EN_ATTENTE_PAIEMENT") void onCreate_statutValidationNull_setsDefault() throws Exception { SouscriptionOrganisation s = new SouscriptionOrganisation(); s.setDateDebut(LocalDate.now()); s.setDateFin(LocalDate.now().plusMonths(1)); s.setStatutValidation(null); // forcer null pour couvrir le then-branch de L168 Method onCreate = SouscriptionOrganisation.class.getDeclaredMethod("onCreate"); onCreate.setAccessible(true); onCreate.invoke(s); assertThat(s.getStatutValidation()).isEqualTo(StatutValidationSouscription.EN_ATTENTE_PAIEMENT); } // ── decrementerQuota() ──────────────────────────────────────────────────── /** * Branch manquante : quotaUtilise == 0 → la condition * `quotaUtilise != null && quotaUtilise > 0` est false, le quota ne change pas. */ @Test @DisplayName("decrementerQuota: quotaUtilise=0 → reste 0 (pas de décrément)") void decrementerQuota_quotaUtiliseZero_resterAZero() { SouscriptionOrganisation s = new SouscriptionOrganisation(); s.setDateDebut(LocalDate.now()); s.setDateFin(LocalDate.now().plusMonths(1)); s.setQuotaUtilise(0); s.decrementerQuota(); assertThat(s.getQuotaUtilise()).isEqualTo(0); } /** * Branche couverte pour référence : quotaUtilise null → décrement ignoré. */ @Test @DisplayName("decrementerQuota: quotaUtilise=null → reste null") void decrementerQuota_quotaUtiliseNull_resterNull() { SouscriptionOrganisation s = new SouscriptionOrganisation(); s.setDateDebut(LocalDate.now()); s.setDateFin(LocalDate.now().plusMonths(1)); s.setQuotaUtilise(null); s.decrementerQuota(); assertThat(s.getQuotaUtilise()).isNull(); } }