package dev.lions.unionflow.server.api.dto.organisation;

import static org.assertj.core.api.Assertions.assertThat;

import dev.lions.unionflow.server.api.enums.organisation.StatutOrganisation;
import dev.lions.unionflow.server.api.enums.organisation.TypeOrganisation;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.UUID;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

/**
 * Tests unitaires pour OrganisationDTO
 *
 * @author UnionFlow Team
 * @version 2.0
 * @since 2025-01-16
 */
@DisplayName("Tests OrganisationDTO")
class OrganisationDTOTest {

  private OrganisationDTO organisation;

  @BeforeEach
  void setUp() {
    organisation = new OrganisationDTO();
    organisation.setNom("Lions Club Dakar");
    organisation.setNomCourt("LCD");
    organisation.setTypeOrganisation(TypeOrganisation.LIONS_CLUB);
    organisation.setStatut(StatutOrganisation.ACTIVE);
    organisation.setVille("Dakar");
    organisation.setPays("Sénégal");
    organisation.setDateCreation(LocalDateTime.now().minusYears(5));
    organisation.setNombreMembres(150);
    organisation.setNombreAdministrateurs(10);
    organisation.setLatitude(new BigDecimal("14.6937"));
    organisation.setLongitude(new BigDecimal("-17.4441"));
  }

  @Test
  @DisplayName("Test de base - classe peut être instanciée")
  void testClasseInstanciable() {
    assertThat(organisation).isNotNull();
  }

  @Nested
  @DisplayName("Tests de Construction")
  class ConstructionTests {

    @Test
    @DisplayName("Test constructeur par défaut")
    void testConstructeurParDefaut() {
      OrganisationDTO newOrganisation = new OrganisationDTO();

      assertThat(newOrganisation.getId()).isNotNull();
      assertThat(newOrganisation.getDateCreation()).isNotNull();
      assertThat(newOrganisation.isActif()).isTrue();
      assertThat(newOrganisation.getVersion()).isEqualTo(0L);
      assertThat(newOrganisation.getStatut()).isEqualTo(StatutOrganisation.ACTIVE);
      assertThat(newOrganisation.getTypeOrganisation()).isEqualTo(TypeOrganisation.ASSOCIATION);
      assertThat(newOrganisation.getDevise()).isEqualTo("XOF");
      assertThat(newOrganisation.getNiveauHierarchique()).isEqualTo(0);
      assertThat(newOrganisation.getNombreMembres()).isEqualTo(0);
      assertThat(newOrganisation.getNombreAdministrateurs()).isEqualTo(0);
      assertThat(newOrganisation.getOrganisationPublique()).isTrue();
      assertThat(newOrganisation.getAccepteNouveauxMembres()).isTrue();
      assertThat(newOrganisation.getCotisationObligatoire()).isFalse();
    }

    @Test
    @DisplayName("Test constructeur avec paramètres")
    void testConstructeurAvecParametres() {
      String nom = "Association des Jeunes";
      TypeOrganisation type = TypeOrganisation.ASSOCIATION;

      OrganisationDTO newOrganisation = new OrganisationDTO(nom, type);

      assertThat(newOrganisation.getNom()).isEqualTo(nom);
      assertThat(newOrganisation.getTypeOrganisation()).isEqualTo(type);
      assertThat(newOrganisation.getStatut()).isEqualTo(StatutOrganisation.ACTIVE);
    }
  }

  @Nested
  @DisplayName("Tests des Méthodes de Statut")
  class MethodesStatutTests {

    @Test
    @DisplayName("Test estActive")
    void testEstActive() {
      organisation.setStatut(StatutOrganisation.ACTIVE);
      assertThat(organisation.estActive()).isTrue();

      organisation.setStatut(StatutOrganisation.INACTIVE);
      assertThat(organisation.estActive()).isFalse();
    }

    @Test
    @DisplayName("Test estInactive")
    void testEstInactive() {
      organisation.setStatut(StatutOrganisation.INACTIVE);
      assertThat(organisation.estInactive()).isTrue();

      organisation.setStatut(StatutOrganisation.ACTIVE);
      assertThat(organisation.estInactive()).isFalse();
    }

    @Test
    @DisplayName("Test estSuspendue")
    void testEstSuspendue() {
      organisation.setStatut(StatutOrganisation.SUSPENDUE);
      assertThat(organisation.estSuspendue()).isTrue();

      organisation.setStatut(StatutOrganisation.ACTIVE);
      assertThat(organisation.estSuspendue()).isFalse();
    }

    @Test
    @DisplayName("Test estEnCreation")
    void testEstEnCreation() {
      organisation.setStatut(StatutOrganisation.EN_CREATION);
      assertThat(organisation.estEnCreation()).isTrue();

      organisation.setStatut(StatutOrganisation.ACTIVE);
      assertThat(organisation.estEnCreation()).isFalse();
    }

    @Test
    @DisplayName("Test estDissoute")
    void testEstDissoute() {
      organisation.setStatut(StatutOrganisation.DISSOUTE);
      assertThat(organisation.estDissoute()).isTrue();

      organisation.setStatut(StatutOrganisation.ACTIVE);
      assertThat(organisation.estDissoute()).isFalse();
    }
  }

  @Nested
  @DisplayName("Tests des Méthodes Utilitaires")
  class MethodesUtilitairesTests {

    @Test
    @DisplayName("Test getAncienneteAnnees")
    void testGetAncienneteAnnees() {
      organisation.setDateFondation(LocalDate.now().minusYears(5));
      assertThat(organisation.getAncienneteAnnees()).isEqualTo(5);

      organisation.setDateFondation(LocalDate.now().minusMonths(6));
      assertThat(organisation.getAncienneteAnnees()).isEqualTo(0);

      organisation.setDateFondation(null);
      assertThat(organisation.getAncienneteAnnees()).isEqualTo(0);
    }

    @Test
    @DisplayName("Test getAncienneteMois")
    void testGetAncienneteMois() {
      organisation.setDateFondation(LocalDate.now().minusYears(2).minusMonths(3));
      assertThat(organisation.getAncienneteMois()).isEqualTo(27); // 2 ans * 12 + 3 mois

      organisation.setDateFondation(LocalDate.now().minusMonths(6));
      assertThat(organisation.getAncienneteMois()).isEqualTo(6);

      organisation.setDateFondation(LocalDate.now().minusYears(1));
      assertThat(organisation.getAncienneteMois()).isEqualTo(12);

      organisation.setDateFondation(null);
      assertThat(organisation.getAncienneteMois()).isEqualTo(0);
    }

    @Test
    @DisplayName("Test possedGeolocalisation")
    void testPossedGeolocalisation() {
      organisation.setLatitude(new BigDecimal("14.6937"));
      organisation.setLongitude(new BigDecimal("-17.4441"));
      assertThat(organisation.possedGeolocalisation()).isTrue();

      organisation.setLatitude(null);
      assertThat(organisation.possedGeolocalisation()).isFalse();

      organisation.setLatitude(new BigDecimal("14.6937"));
      organisation.setLongitude(null);
      assertThat(organisation.possedGeolocalisation()).isFalse();
    }

    @Test
    @DisplayName("Test estOrganisationRacine")
    void testEstOrganisationRacine() {
      organisation.setOrganisationParenteId(null);
      assertThat(organisation.estOrganisationRacine()).isTrue();

      organisation.setOrganisationParenteId(UUID.randomUUID());
      assertThat(organisation.estOrganisationRacine()).isFalse();
    }

    @Test
    @DisplayName("Test possedeSousOrganisations")
    void testPossedeSousOrganisations() {
      organisation.setNiveauHierarchique(2);
      assertThat(organisation.possedeSousOrganisations()).isTrue();

      organisation.setNiveauHierarchique(0);
      assertThat(organisation.possedeSousOrganisations()).isFalse();

      organisation.setNiveauHierarchique(null);
      assertThat(organisation.possedeSousOrganisations()).isFalse();
    }

    @Test
    @DisplayName("Test getNomAffichage")
    void testGetNomAffichage() {
      organisation.setNom("Lions Club Dakar");
      organisation.setNomCourt("LCD");
      assertThat(organisation.getNomAffichage()).isEqualTo("LCD");

      organisation.setNomCourt(null);
      assertThat(organisation.getNomAffichage()).isEqualTo("Lions Club Dakar");

      organisation.setNomCourt("");
      assertThat(organisation.getNomAffichage()).isEqualTo("Lions Club Dakar");
    }

    @Test
    @DisplayName("Test getStatutLibelle")
    void testGetStatutLibelle() {
      organisation.setStatut(StatutOrganisation.ACTIVE);
      assertThat(organisation.getStatutLibelle()).isEqualTo("Active");

      organisation.setStatut(null);
      assertThat(organisation.getStatutLibelle()).isEqualTo("Non défini");
    }

    @Test
    @DisplayName("Test getTypeLibelle")
    void testGetTypeLibelle() {
      organisation.setTypeOrganisation(TypeOrganisation.LIONS_CLUB);
      assertThat(organisation.getTypeLibelle()).isEqualTo("Lions Club");

      organisation.setTypeOrganisation(null);
      assertThat(organisation.getTypeLibelle()).isEqualTo("Non défini");
    }

    @Test
    @DisplayName("Test getRatioAdministrateurs")
    void testGetRatioAdministrateurs() {
      organisation.setNombreMembres(100);
      organisation.setNombreAdministrateurs(10);
      assertThat(organisation.getRatioAdministrateurs()).isEqualTo(10.0);

      organisation.setNombreMembres(0);
      assertThat(organisation.getRatioAdministrateurs()).isEqualTo(0.0);

      organisation.setNombreMembres(null);
      assertThat(organisation.getRatioAdministrateurs()).isEqualTo(0.0);

      organisation.setNombreMembres(100);
      organisation.setNombreAdministrateurs(null);
      assertThat(organisation.getRatioAdministrateurs()).isEqualTo(0.0);
    }

    @Test
    @DisplayName("Test getAdresseComplete - tous les champs")
    void testGetAdresseCompleteTousChamps() {
      organisation.setAdresse("123 Rue de la République");
      organisation.setVille("Dakar");
      organisation.setCodePostal("12345");
      organisation.setRegion("Dakar");
      organisation.setPays("Sénégal");

      String adresse = organisation.getAdresseComplete();
      assertThat(adresse).contains("123 Rue de la République");
      assertThat(adresse).contains("Dakar");
      assertThat(adresse).contains("12345");
      assertThat(adresse).contains("Sénégal");
    }

    @Test
    @DisplayName("Test getAdresseComplete - seulement adresse")
    void testGetAdresseCompleteSeulementAdresse() {
      organisation.setAdresse("123 Rue de la République");
      organisation.setVille(null);
      organisation.setCodePostal(null);
      organisation.setRegion(null);
      organisation.setPays(null);

      assertThat(organisation.getAdresseComplete()).isEqualTo("123 Rue de la République");
    }

    @Test
    @DisplayName("Test getAdresseComplete - adresse et ville")
    void testGetAdresseCompleteAdresseEtVille() {
      organisation.setAdresse("123 Rue de la République");
      organisation.setVille("Dakar");
      organisation.setCodePostal(null);
      organisation.setRegion(null);
      organisation.setPays(null);

      assertThat(organisation.getAdresseComplete()).isEqualTo("123 Rue de la République, Dakar");
    }

    @Test
    @DisplayName("Test getAdresseComplete - adresse, ville et code postal")
    void testGetAdresseCompleteAvecCodePostal() {
      organisation.setAdresse("123 Rue de la République");
      organisation.setVille("Dakar");
      organisation.setCodePostal("12345");
      organisation.setRegion(null);
      organisation.setPays(null);

      assertThat(organisation.getAdresseComplete()).isEqualTo("123 Rue de la République, Dakar 12345");
    }

    @Test
    @DisplayName("Test getAdresseComplete - tous les champs sauf adresse")
    void testGetAdresseCompleteSansAdresse() {
      organisation.setAdresse(null);
      organisation.setVille("Dakar");
      organisation.setCodePostal("12345");
      organisation.setRegion("Dakar");
      organisation.setPays("Sénégal");

      String adresse = organisation.getAdresseComplete();
      assertThat(adresse).contains("Dakar");
      assertThat(adresse).contains("12345");
      assertThat(adresse).contains("Sénégal");
      assertThat(adresse).doesNotContain("null");
    }

    @Test
    @DisplayName("Test getAdresseComplete - champs vides")
    void testGetAdresseCompleteChampsVides() {
      organisation.setAdresse("   ");
      organisation.setVille("   ");
      organisation.setCodePostal("   ");
      organisation.setRegion("   ");
      organisation.setPays("   ");

      assertThat(organisation.getAdresseComplete()).isEmpty();
    }

    @Test
    @DisplayName("Test getAdresseComplete - tous null")
    void testGetAdresseCompleteTousNull() {
      organisation.setAdresse(null);
      organisation.setVille(null);
      organisation.setCodePostal(null);
      organisation.setRegion(null);
      organisation.setPays(null);

      assertThat(organisation.getAdresseComplete()).isEmpty();
    }

    @Test
    @DisplayName("Test hasBudget - budget défini")
    void testHasBudgetDefini() {
      organisation.setBudgetAnnuel(new BigDecimal("100000.00"));
      assertThat(organisation.hasBudget()).isTrue();
    }

    @Test
    @DisplayName("Test hasBudget - budget null")
    void testHasBudgetNull() {
      organisation.setBudgetAnnuel(null);
      assertThat(organisation.hasBudget()).isFalse();
    }

    @Test
    @DisplayName("Test hasBudget - budget zéro")
    void testHasBudgetZero() {
      organisation.setBudgetAnnuel(BigDecimal.ZERO);
      assertThat(organisation.hasBudget()).isFalse();
    }

    @Test
    @DisplayName("Test hasBudget - budget négatif")
    void testHasBudgetNegatif() {
      organisation.setBudgetAnnuel(new BigDecimal("-100.00"));
      // Note: hasBudget() vérifie > 0, donc négatif retourne false
      assertThat(organisation.hasBudget()).isFalse();
    }
  }

  @Nested
  @DisplayName("Tests des Méthodes d'Action")
  class MethodesActionTests {

    @Test
    @DisplayName("Test activer")
    void testActiver() {
      String utilisateur = "admin";
      organisation.activer(utilisateur);

      assertThat(organisation.getStatut()).isEqualTo(StatutOrganisation.ACTIVE);
      assertThat(organisation.getModifiePar()).isEqualTo(utilisateur);
    }

    @Test
    @DisplayName("Test suspendre")
    void testSuspendre() {
      String utilisateur = "admin";

      organisation.suspendre(utilisateur);

      assertThat(organisation.getStatut()).isEqualTo(StatutOrganisation.SUSPENDUE);
      assertThat(organisation.getModifiePar()).isEqualTo(utilisateur);
    }

    @Test
    @DisplayName("Test dissoudre")
    void testDissoudre() {
      String utilisateur = "admin";

      organisation.dissoudre(utilisateur);

      assertThat(organisation.getStatut()).isEqualTo(StatutOrganisation.DISSOUTE);
      assertThat(organisation.getModifiePar()).isEqualTo(utilisateur);
    }

    @Test
    @DisplayName("Test desactiver")
    void testDesactiver() {
      String utilisateur = "admin";
      organisation.desactiver(utilisateur);

      assertThat(organisation.getStatut()).isEqualTo(StatutOrganisation.INACTIVE);
      assertThat(organisation.getAccepteNouveauxMembres()).isFalse();
      assertThat(organisation.getModifiePar()).isEqualTo(utilisateur);
    }

    @Test
    @DisplayName("Test ajouterMembre")
    void testAjouterMembre() {
      String utilisateur = "secretaire";
      organisation.setNombreMembres(100);

      organisation.ajouterMembre(utilisateur);

      assertThat(organisation.getNombreMembres()).isEqualTo(101);
      assertThat(organisation.getModifiePar()).isEqualTo(utilisateur);
    }

    @Test
    @DisplayName("Test ajouterMembre - nombreMembres null")
    void testAjouterMembreNull() {
      String utilisateur = "secretaire";
      organisation.setNombreMembres(null);

      organisation.ajouterMembre(utilisateur);

      assertThat(organisation.getNombreMembres()).isEqualTo(1);
      assertThat(organisation.getModifiePar()).isEqualTo(utilisateur);
    }

    @Test
    @DisplayName("Test retirerMembre")
    void testRetirerMembre() {
      String utilisateur = "secretaire";
      organisation.setNombreMembres(100);

      organisation.retirerMembre(utilisateur);

      assertThat(organisation.getNombreMembres()).isEqualTo(99);
      assertThat(organisation.getModifiePar()).isEqualTo(utilisateur);

      // Test avec 0 membres
      organisation.setNombreMembres(0);
      organisation.retirerMembre(utilisateur);
      assertThat(organisation.getNombreMembres()).isEqualTo(0);
    }

    @Test
    @DisplayName("Test retirerMembre - nombreMembres null")
    void testRetirerMembreNull() {
      String utilisateur = "secretaire";
      organisation.setNombreMembres(null);

      organisation.retirerMembre(utilisateur);

      assertThat(organisation.getNombreMembres()).isNull();
    }

    @Test
    @DisplayName("Test ajouterAdministrateur")
    void testAjouterAdministrateur() {
      String utilisateur = "president";
      organisation.setNombreAdministrateurs(5);

      organisation.ajouterAdministrateur(utilisateur);

      assertThat(organisation.getNombreAdministrateurs()).isEqualTo(6);
      assertThat(organisation.getModifiePar()).isEqualTo(utilisateur);
    }

    @Test
    @DisplayName("Test ajouterAdministrateur - nombreAdministrateurs null")
    void testAjouterAdministrateurNull() {
      String utilisateur = "president";
      organisation.setNombreAdministrateurs(null);

      organisation.ajouterAdministrateur(utilisateur);

      assertThat(organisation.getNombreAdministrateurs()).isEqualTo(1);
      assertThat(organisation.getModifiePar()).isEqualTo(utilisateur);
    }

    @Test
    @DisplayName("Test retirerAdministrateur")
    void testRetirerAdministrateur() {
      String utilisateur = "president";
      organisation.setNombreAdministrateurs(5);

      organisation.retirerAdministrateur(utilisateur);

      assertThat(organisation.getNombreAdministrateurs()).isEqualTo(4);
      assertThat(organisation.getModifiePar()).isEqualTo(utilisateur);

      // Test avec 0 administrateurs
      organisation.setNombreAdministrateurs(0);
      organisation.retirerAdministrateur(utilisateur);
      assertThat(organisation.getNombreAdministrateurs()).isEqualTo(0);
    }

    @Test
    @DisplayName("Test retirerAdministrateur - nombreAdministrateurs null")
    void testRetirerAdministrateurNull() {
      String utilisateur = "president";
      organisation.setNombreAdministrateurs(null);

      organisation.retirerAdministrateur(utilisateur);

      assertThat(organisation.getNombreAdministrateurs()).isNull();
    }

    @Test
    @DisplayName("Test mettreAJourNombreMembres")
    void testMettreAJourNombreMembres() {
      String utilisateur = "secretaire";
      organisation.setNombreMembres(100);

      organisation.mettreAJourNombreMembres(150, utilisateur);

      assertThat(organisation.getNombreMembres()).isEqualTo(150);
      assertThat(organisation.getModifiePar()).isEqualTo(utilisateur);
    }
  }

  @Nested
  @DisplayName("Tests de Validation")
  class ValidationTests {

    @Test
    @DisplayName("Test toString")
    void testToString() {
      organisation.setDateFondation(LocalDate.now().minusYears(5));
      String result = organisation.toString();

      assertThat(result).contains("Lions Club Dakar");
      assertThat(result).contains("LCD");
      assertThat(result).contains("LIONS_CLUB");
      assertThat(result).contains("ACTIVE");
      assertThat(result).contains("Dakar");
      assertThat(result).contains("Sénégal");
      assertThat(result).contains("150");
      assertThat(result).contains("5 ans");
    }
  }

  @Nested
  @DisplayName("Tests Getters/Setters complets")
  class GettersSettersTests {

    @Test
    @DisplayName("Test tous les getters/setters")
    void testTousLesGettersSetters() {
      OrganisationDTO dto = new OrganisationDTO();

      // Test des champs de base
      dto.setNom("Test Organisation");
      assertThat(dto.getNom()).isEqualTo("Test Organisation");

      dto.setNomCourt("TO");
      assertThat(dto.getNomCourt()).isEqualTo("TO");

      dto.setDescription("Description test");
      assertThat(dto.getDescription()).isEqualTo("Description test");

      LocalDate dateFondation = LocalDate.of(2020, 1, 1);
      dto.setDateFondation(dateFondation);
      assertThat(dto.getDateFondation()).isEqualTo(dateFondation);

      dto.setNumeroEnregistrement("REG-12345");
      assertThat(dto.getNumeroEnregistrement()).isEqualTo("REG-12345");

      // Test des champs d'adresse
      dto.setAdresse("123 Rue Test");
      assertThat(dto.getAdresse()).isEqualTo("123 Rue Test");

      dto.setVille("Ville Test");
      assertThat(dto.getVille()).isEqualTo("Ville Test");

      dto.setRegion("Région Test");
      assertThat(dto.getRegion()).isEqualTo("Région Test");

      dto.setPays("Pays Test");
      assertThat(dto.getPays()).isEqualTo("Pays Test");

      dto.setCodePostal("12345");
      assertThat(dto.getCodePostal()).isEqualTo("12345");

      BigDecimal latitude = new BigDecimal("14.6937");
      dto.setLatitude(latitude);
      assertThat(dto.getLatitude()).isEqualTo(latitude);

      BigDecimal longitude = new BigDecimal("-17.4441");
      dto.setLongitude(longitude);
      assertThat(dto.getLongitude()).isEqualTo(longitude);

      // Test des champs de contact
      dto.setTelephone("+221 77 123 45 67");
      assertThat(dto.getTelephone()).isEqualTo("+221 77 123 45 67");

      dto.setTelephoneSecondaire("+221 77 123 45 68");
      assertThat(dto.getTelephoneSecondaire()).isEqualTo("+221 77 123 45 68");

      dto.setEmail("test@example.com");
      assertThat(dto.getEmail()).isEqualTo("test@example.com");

      dto.setEmailSecondaire("test2@example.com");
      assertThat(dto.getEmailSecondaire()).isEqualTo("test2@example.com");

      dto.setSiteWeb("https://example.com");
      assertThat(dto.getSiteWeb()).isEqualTo("https://example.com");

      dto.setLogo("logo.png");
      assertThat(dto.getLogo()).isEqualTo("logo.png");

      // Test des champs hiérarchiques
      UUID parentId = UUID.randomUUID();
      dto.setOrganisationParenteId(parentId);
      assertThat(dto.getOrganisationParenteId()).isEqualTo(parentId);

      dto.setNomOrganisationParente("Organisation Parente");
      assertThat(dto.getNomOrganisationParente()).isEqualTo("Organisation Parente");

      dto.setNiveauHierarchique(2);
      assertThat(dto.getNiveauHierarchique()).isEqualTo(2);

      // Test des champs financiers
      BigDecimal budget = new BigDecimal("1000000.00");
      dto.setBudgetAnnuel(budget);
      assertThat(dto.getBudgetAnnuel()).isEqualTo(budget);

      dto.setDevise("EUR");
      assertThat(dto.getDevise()).isEqualTo("EUR");

      BigDecimal cotisation = new BigDecimal("5000.00");
      dto.setMontantCotisationAnnuelle(cotisation);
      assertThat(dto.getMontantCotisationAnnuelle()).isEqualTo(cotisation);

      // Test des champs textuels
      dto.setObjectifs("Objectifs de l'organisation");
      assertThat(dto.getObjectifs()).isEqualTo("Objectifs de l'organisation");

      dto.setActivitesPrincipales("Activités principales");
      assertThat(dto.getActivitesPrincipales()).isEqualTo("Activités principales");

      dto.setReseauxSociaux("{\"facebook\": \"url\"}");
      assertThat(dto.getReseauxSociaux()).isEqualTo("{\"facebook\": \"url\"}");

      dto.setCertifications("ISO 9001");
      assertThat(dto.getCertifications()).isEqualTo("ISO 9001");

      dto.setPartenaires("Partenaires principaux");
      assertThat(dto.getPartenaires()).isEqualTo("Partenaires principaux");

      dto.setNotes("Notes administratives");
      assertThat(dto.getNotes()).isEqualTo("Notes administratives");

      // Test des champs booléens
      dto.setOrganisationPublique(false);
      assertThat(dto.getOrganisationPublique()).isFalse();

      dto.setAccepteNouveauxMembres(false);
      assertThat(dto.getAccepteNouveauxMembres()).isFalse();

      dto.setCotisationObligatoire(true);
      assertThat(dto.getCotisationObligatoire()).isTrue();
    }

    @Test
    @DisplayName("Test getters/setters avec valeurs null")
    void testGettersSettersAvecNull() {
      OrganisationDTO dto = new OrganisationDTO();

      dto.setNom(null);
      assertThat(dto.getNom()).isNull();

      dto.setNomCourt(null);
      assertThat(dto.getNomCourt()).isNull();

      dto.setDescription(null);
      assertThat(dto.getDescription()).isNull();

      dto.setDateFondation(null);
      assertThat(dto.getDateFondation()).isNull();

      dto.setAdresse(null);
      assertThat(dto.getAdresse()).isNull();

      dto.setVille(null);
      assertThat(dto.getVille()).isNull();

      dto.setCodePostal(null);
      assertThat(dto.getCodePostal()).isNull();

      dto.setLatitude(null);
      assertThat(dto.getLatitude()).isNull();

      dto.setLongitude(null);
      assertThat(dto.getLongitude()).isNull();

      dto.setTelephone(null);
      assertThat(dto.getTelephone()).isNull();

      dto.setEmail(null);
      assertThat(dto.getEmail()).isNull();

      dto.setSiteWeb(null);
      assertThat(dto.getSiteWeb()).isNull();

      dto.setOrganisationParenteId(null);
      assertThat(dto.getOrganisationParenteId()).isNull();

      dto.setBudgetAnnuel(null);
      assertThat(dto.getBudgetAnnuel()).isNull();

      dto.setMontantCotisationAnnuelle(null);
      assertThat(dto.getMontantCotisationAnnuelle()).isNull();

      dto.setOrganisationPublique(null);
      assertThat(dto.getOrganisationPublique()).isNull();

      dto.setAccepteNouveauxMembres(null);
      assertThat(dto.getAccepteNouveauxMembres()).isNull();

      dto.setCotisationObligatoire(null);
      assertThat(dto.getCotisationObligatoire()).isNull();
    }
  }
}
