diff --git a/pom.xml b/pom.xml
index 1bdcf44..1bf414f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -152,6 +152,29 @@
quarkus-test-h2
test
+
+ io.quarkus
+ quarkus-junit5-mockito
+ test
+
+
+ org.mockito
+ mockito-core
+ 5.7.0
+ test
+
+
+ org.mockito
+ mockito-junit-jupiter
+ 5.7.0
+ test
+
+
+ org.assertj
+ assertj-core
+ 3.24.2
+ test
+
@@ -177,6 +200,76 @@
org.apache.maven.plugins
maven-surefire-plugin
3.1.2
+
+
+ org.jboss.logmanager.LogManager
+ ${maven.home}
+
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+ 3.1.2
+
+
+
+ integration-test
+ verify
+
+
+
+
+
+ ${project.build.directory}/${project.build.finalName}-runner
+ org.jboss.logmanager.LogManager
+ ${maven.home}
+
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.8.11
+
+
+
+ prepare-agent
+
+
+
+ report
+ test
+
+ report
+
+
+
+ check
+
+ check
+
+
+
+
+ BUNDLE
+
+
+ INSTRUCTION
+ COVEREDRATIO
+ 1.00
+
+
+ BRANCH
+ COVEREDRATIO
+ 1.00
+
+
+
+
+
+
+
diff --git a/src/test/java/com/gbcm/server/impl/SimpleTest.java b/src/test/java/com/gbcm/server/impl/SimpleTest.java
new file mode 100644
index 0000000..41ae555
--- /dev/null
+++ b/src/test/java/com/gbcm/server/impl/SimpleTest.java
@@ -0,0 +1,177 @@
+package com.gbcm.server.impl;
+
+import io.quarkus.test.junit.QuarkusTest;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.*;
+
+/**
+ * Tests simples pour vérifier que l'environnement de test fonctionne.
+ *
+ * @author GBCM Team
+ * @version 1.0.0
+ * @since 2024-01-01
+ */
+@QuarkusTest
+@DisplayName("Tests simples - Environnement de test")
+class SimpleTest {
+
+ /**
+ * Test basique pour vérifier que JUnit fonctionne.
+ */
+ @Test
+ @DisplayName("Test basique JUnit")
+ void testBasicJUnit() {
+ // Given
+ String expected = "Hello GBCM";
+
+ // When
+ String actual = "Hello GBCM";
+
+ // Then
+ assertThat(actual).isEqualTo(expected);
+ }
+
+ /**
+ * Test pour vérifier que AssertJ fonctionne.
+ */
+ @Test
+ @DisplayName("Test AssertJ")
+ void testAssertJ() {
+ // Given
+ int number = 42;
+
+ // When & Then
+ assertThat(number)
+ .isPositive()
+ .isEqualTo(42)
+ .isGreaterThan(40)
+ .isLessThan(50);
+ }
+
+ /**
+ * Test pour vérifier que Quarkus Test fonctionne.
+ */
+ @Test
+ @DisplayName("Test Quarkus Test")
+ void testQuarkusTest() {
+ // Given
+ String applicationName = "gbcm-server";
+
+ // When & Then
+ assertThat(applicationName)
+ .isNotNull()
+ .isNotBlank()
+ .contains("gbcm");
+ }
+
+ /**
+ * Test pour vérifier les exceptions.
+ */
+ @Test
+ @DisplayName("Test gestion des exceptions")
+ void testExceptions() {
+ // When & Then
+ assertThatThrownBy(() -> {
+ throw new IllegalArgumentException("Test exception");
+ })
+ .isInstanceOf(IllegalArgumentException.class)
+ .hasMessage("Test exception");
+ }
+
+ /**
+ * Test pour vérifier les collections.
+ */
+ @Test
+ @DisplayName("Test collections")
+ void testCollections() {
+ // Given
+ java.util.List roles = java.util.Arrays.asList("ADMIN", "COACH", "CLIENT");
+
+ // When & Then
+ assertThat(roles)
+ .isNotEmpty()
+ .hasSize(3)
+ .contains("ADMIN", "COACH", "CLIENT")
+ .doesNotContain("UNKNOWN");
+ }
+
+ /**
+ * Test pour vérifier les objets null.
+ */
+ @Test
+ @DisplayName("Test objets null")
+ void testNullObjects() {
+ // Given
+ String nullString = null;
+ String notNullString = "GBCM";
+
+ // When & Then
+ assertThat(nullString).isNull();
+ assertThat(notNullString).isNotNull();
+ }
+
+ /**
+ * Test pour vérifier les booléens.
+ */
+ @Test
+ @DisplayName("Test booléens")
+ void testBooleans() {
+ // Given
+ boolean isActive = true;
+ boolean isDeleted = false;
+
+ // When & Then
+ assertThat(isActive).isTrue();
+ assertThat(isDeleted).isFalse();
+ }
+
+ /**
+ * Test pour vérifier les chaînes de caractères.
+ */
+ @Test
+ @DisplayName("Test chaînes de caractères")
+ void testStrings() {
+ // Given
+ String email = "admin@gbcm.com";
+
+ // When & Then
+ assertThat(email)
+ .isNotBlank()
+ .contains("@")
+ .startsWith("admin")
+ .endsWith(".com")
+ .hasSize(14);
+ }
+
+ /**
+ * Test pour vérifier les nombres.
+ */
+ @Test
+ @DisplayName("Test nombres")
+ void testNumbers() {
+ // Given
+ int userId = 1;
+ double price = 99.99;
+
+ // When & Then
+ assertThat(userId).isPositive().isEqualTo(1);
+ assertThat(price).isPositive().isBetween(90.0, 100.0);
+ }
+
+ /**
+ * Test pour vérifier les dates.
+ */
+ @Test
+ @DisplayName("Test dates")
+ void testDates() {
+ // Given
+ java.time.LocalDateTime now = java.time.LocalDateTime.now();
+ java.time.LocalDateTime future = now.plusDays(1);
+
+ // When & Then
+ assertThat(now).isBefore(future);
+ assertThat(future).isAfter(now);
+ }
+}
diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties
new file mode 100644
index 0000000..4dba345
--- /dev/null
+++ b/src/test/resources/application.properties
@@ -0,0 +1,139 @@
+# Configuration de test pour GBCM Server
+# Optimisée pour l'exécution rapide des tests
+
+# Application
+quarkus.application.name=gbcm-server-test
+quarkus.application.version=1.0.0-SNAPSHOT
+
+# Base de données H2 en mémoire pour les tests
+quarkus.datasource.db-kind=h2
+quarkus.datasource.jdbc.url=jdbc:h2:mem:gbcm_test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
+quarkus.datasource.username=sa
+quarkus.datasource.password=
+
+# Hibernate - Création automatique du schéma pour les tests
+quarkus.hibernate-orm.database.generation=drop-and-create
+quarkus.hibernate-orm.sql-load-script=import.sql
+
+# Flyway désactivé pour les tests (on utilise Hibernate)
+quarkus.flyway.migrate-at-start=false
+
+# Logs optimisés pour les tests
+quarkus.log.level=WARN
+quarkus.log.category."com.gbcm".level=INFO
+quarkus.log.category."org.hibernate".level=WARN
+quarkus.log.category."io.quarkus".level=WARN
+
+# Configuration JWT pour les tests
+gbcm.security.jwt.access-token.duration=PT1H
+gbcm.security.jwt.refresh-token.duration=P1D
+gbcm.security.jwt.reset-token.duration=PT1H
+gbcm.security.jwt.secret=test-secret-key-for-unit-tests-only
+
+# Configuration de sécurité allégée pour les tests
+gbcm.security.password.bcrypt-cost=4
+gbcm.security.password.min-length=6
+gbcm.security.password.require-uppercase=false
+gbcm.security.password.require-lowercase=false
+gbcm.security.password.require-digit=false
+gbcm.security.password.require-special=false
+
+# Configuration de compte pour les tests
+gbcm.security.account.max-failed-attempts=10
+gbcm.security.account.lockout-duration=PT1M
+gbcm.security.password.max-age=P365D
+
+# Configuration email pour les tests (simulation)
+quarkus.mailer.mock=true
+
+# Configuration OpenAPI pour les tests
+quarkus.smallrye-openapi.path=/openapi
+quarkus.swagger-ui.path=/swagger-ui
+quarkus.swagger-ui.always-include=true
+
+# Configuration de santé pour les tests
+quarkus.smallrye-health.root-path=/health
+
+# Configuration des métriques pour les tests
+quarkus.micrometer.enabled=false
+
+# Configuration du cache pour les tests
+quarkus.cache.caffeine."qute-cache".initial-capacity=10
+quarkus.cache.caffeine."qute-cache".maximum-size=100
+
+# Configuration de sécurité JPA pour les tests
+quarkus.security.jpa.enabled=true
+quarkus.security.jpa.principal-query=SELECT u.email, u.password_hash, u.role FROM users u WHERE u.email=? AND u.active=true AND u.deleted=false
+quarkus.security.jpa.roles-query=SELECT r.role FROM users r WHERE r.email=?
+
+# Configuration HTTP pour les tests
+quarkus.http.port=8081
+quarkus.http.test-port=8081
+
+# Configuration de développement désactivée pour les tests
+quarkus.live-reload.instrumentation=false
+
+# Configuration des tests
+quarkus.test.hang-detection-timeout=60s
+quarkus.test.display-test-output=true
+
+# Configuration JaCoCo
+quarkus.jacoco.enabled=true
+quarkus.jacoco.data-file=target/jacoco.exec
+quarkus.jacoco.report-location=target/site/jacoco
+
+# Configuration des transactions pour les tests
+quarkus.transaction-manager.enable-recovery=false
+
+# Configuration de la validation pour les tests
+quarkus.hibernate-validator.fail-fast=false
+
+# Configuration REST pour les tests
+quarkus.resteasy-reactive.fail-on-duplicate=false
+
+# Configuration de sérialisation pour les tests
+quarkus.jackson.fail-on-unknown-properties=false
+quarkus.jackson.write-dates-as-timestamps=false
+
+# Configuration de contexte pour les tests
+quarkus.smallrye-context-propagation.enabled=true
+
+# Configuration de scheduling désactivée pour les tests
+quarkus.scheduler.enabled=false
+
+# Configuration de développement
+%test.quarkus.log.console.enable=true
+%test.quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n
+%test.quarkus.log.console.level=INFO
+
+# Configuration spécifique aux tests d'intégration
+%test.quarkus.http.auth.basic=false
+%test.quarkus.http.cors=true
+%test.quarkus.http.cors.origins=*
+%test.quarkus.http.cors.methods=GET,PUT,POST,DELETE,OPTIONS
+%test.quarkus.http.cors.headers=accept,authorization,content-type,x-requested-with
+
+# Configuration de la base de données pour les tests d'intégration
+%test.quarkus.datasource.devservices.enabled=false
+
+# Configuration des conteneurs de test (Testcontainers)
+%testcontainer.quarkus.datasource.db-kind=postgresql
+%testcontainer.quarkus.datasource.username=test
+%testcontainer.quarkus.datasource.password=test
+%testcontainer.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/test
+
+# Configuration de performance pour les tests
+%test.quarkus.hibernate-orm.jdbc.statement-batch-size=20
+%test.quarkus.hibernate-orm.fetch-size=100
+%test.quarkus.hibernate-orm.jdbc.statement-fetch-size=100
+
+# Configuration de pool de connexions pour les tests
+%test.quarkus.datasource.jdbc.initial-size=1
+%test.quarkus.datasource.jdbc.min-size=1
+%test.quarkus.datasource.jdbc.max-size=5
+
+# Configuration de timeout pour les tests
+%test.quarkus.datasource.jdbc.acquisition-timeout=5
+%test.quarkus.datasource.jdbc.background-validation-interval=2M
+%test.quarkus.datasource.jdbc.idle-removal-interval=5M
+%test.quarkus.datasource.jdbc.max-lifetime=10M