Refactoring

This commit is contained in:
dahoud
2026-02-05 18:09:30 +00:00
parent 2a794523b6
commit 806efeb074
24 changed files with 2261 additions and 123 deletions

View File

@@ -0,0 +1,163 @@
package com.lions.dev.resource;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.security.TestSecurity;
import io.restassured.http.ContentType;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.UUID;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.*;
/**
* Tests d'intégration pour BookingResource.
*
* @since 2.0 - Tests production-ready
*/
@QuarkusTest
class BookingResourceTest {
// =========================================================================
// Tests d'accès sans authentification
// =========================================================================
@Test
@DisplayName("GET /bookings - Sans authentification devrait retourner 401")
void testGetAllBookingsWithoutAuth() {
given()
.when()
.get("/afterwork/bookings")
.then()
.statusCode(401);
}
@Test
@DisplayName("POST /bookings - Sans authentification devrait retourner 401")
void testCreateBookingWithoutAuth() {
given()
.contentType(ContentType.JSON)
.body("""
{
"eventId": "00000000-0000-0000-0000-000000000001",
"userId": "00000000-0000-0000-0000-000000000002",
"seats": 2
}
""")
.when()
.post("/afterwork/bookings")
.then()
.statusCode(401);
}
// =========================================================================
// Tests avec authentification USER
// =========================================================================
@Test
@TestSecurity(user = "user@test.com", roles = {"USER"})
@DisplayName("GET /bookings/user/{userId} - Accès aux propres réservations")
void testGetOwnBookings() {
UUID userId = UUID.randomUUID();
given()
.when()
.get("/afterwork/bookings/user/" + userId)
.then()
.statusCode(anyOf(is(200), is(403))); // 403 si userId ne correspond pas
}
@Test
@TestSecurity(user = "user@test.com", roles = {"USER"})
@DisplayName("GET /bookings/{id} - Réservation inexistante devrait retourner 404")
void testGetNonExistentBooking() {
UUID randomId = UUID.randomUUID();
given()
.when()
.get("/afterwork/bookings/" + randomId)
.then()
.statusCode(404);
}
@Test
@TestSecurity(user = "user@test.com", roles = {"USER"})
@DisplayName("DELETE /bookings/{id} - Réservation inexistante devrait retourner 404")
void testCancelNonExistentBooking() {
UUID randomId = UUID.randomUUID();
given()
.when()
.delete("/afterwork/bookings/" + randomId)
.then()
.statusCode(404);
}
// =========================================================================
// Tests avec authentification ADMIN
// =========================================================================
@Test
@TestSecurity(user = "admin@test.com", roles = {"ADMIN"})
@DisplayName("GET /bookings - ADMIN peut voir toutes les réservations")
void testAdminCanViewAllBookings() {
given()
.when()
.get("/afterwork/bookings")
.then()
.statusCode(200)
.body("$", instanceOf(java.util.List.class));
}
@Test
@TestSecurity(user = "admin@test.com", roles = {"ADMIN"})
@DisplayName("GET /bookings/event/{eventId} - ADMIN peut voir les réservations d'un événement")
void testAdminCanViewEventBookings() {
UUID eventId = UUID.randomUUID();
given()
.when()
.get("/afterwork/bookings/event/" + eventId)
.then()
.statusCode(anyOf(is(200), is(404)));
}
// =========================================================================
// Tests avec authentification OWNER/MANAGER
// =========================================================================
@Test
@TestSecurity(user = "owner@test.com", roles = {"OWNER"})
@DisplayName("GET /bookings/establishment/{id} - OWNER peut voir les réservations de son établissement")
void testOwnerCanViewEstablishmentBookings() {
UUID establishmentId = UUID.randomUUID();
given()
.when()
.get("/afterwork/bookings/establishment/" + establishmentId)
.then()
.statusCode(anyOf(is(200), is(404), is(403)));
}
// =========================================================================
// Tests de validation
// =========================================================================
@Test
@TestSecurity(user = "user@test.com", roles = {"USER"})
@DisplayName("POST /bookings - Données invalides devrait retourner 400")
void testCreateBookingWithInvalidData() {
given()
.contentType(ContentType.JSON)
.body("""
{
"seats": -1
}
""")
.when()
.post("/afterwork/bookings")
.then()
.statusCode(400);
}
}

View File

@@ -0,0 +1,223 @@
package com.lions.dev.resource;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.security.TestSecurity;
import io.restassured.http.ContentType;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.UUID;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.*;
/**
* Tests d'intégration pour EstablishmentResource.
*
* @since 2.0 - Tests production-ready
*/
@QuarkusTest
class EstablishmentResourceTest {
// =========================================================================
// Tests endpoints publics (lecture)
// =========================================================================
@Test
@DisplayName("GET /establishments - Liste des établissements (public)")
void testGetAllEstablishments() {
given()
.when()
.get("/afterwork/establishments")
.then()
.statusCode(200)
.body("$", instanceOf(java.util.List.class));
}
@Test
@DisplayName("GET /establishments/{id} - Établissement inexistant devrait retourner 404")
void testGetNonExistentEstablishment() {
UUID randomId = UUID.randomUUID();
given()
.when()
.get("/afterwork/establishments/" + randomId)
.then()
.statusCode(404);
}
@Test
@DisplayName("GET /establishments/search - Recherche d'établissements")
void testSearchEstablishments() {
given()
.queryParam("q", "bar")
.when()
.get("/afterwork/establishments/search")
.then()
.statusCode(200)
.body("$", instanceOf(java.util.List.class));
}
@Test
@DisplayName("GET /establishments/nearby - Recherche par proximité")
void testGetNearbyEstablishments() {
given()
.queryParam("lat", 5.3600)
.queryParam("lng", -3.9400)
.queryParam("radius", 10)
.when()
.get("/afterwork/establishments/nearby")
.then()
.statusCode(200)
.body("$", instanceOf(java.util.List.class));
}
// =========================================================================
// Tests endpoints protégés (création, modification)
// =========================================================================
@Test
@DisplayName("POST /establishments - Sans authentification devrait retourner 401")
void testCreateEstablishmentWithoutAuth() {
given()
.contentType(ContentType.JSON)
.body("""
{
"name": "Test Bar",
"description": "Un bar de test",
"address": "123 Rue Test",
"city": "Abidjan"
}
""")
.when()
.post("/afterwork/establishments")
.then()
.statusCode(401);
}
@Test
@TestSecurity(user = "user@test.com", roles = {"USER"})
@DisplayName("POST /establishments - USER ne peut pas créer d'établissement")
void testCreateEstablishmentWithUserRole() {
given()
.contentType(ContentType.JSON)
.body("""
{
"name": "Test Bar",
"description": "Un bar de test",
"address": "123 Rue Test",
"city": "Abidjan"
}
""")
.when()
.post("/afterwork/establishments")
.then()
.statusCode(403);
}
@Test
@TestSecurity(user = "owner@test.com", roles = {"OWNER"})
@DisplayName("POST /establishments - OWNER peut créer un établissement")
void testCreateEstablishmentWithOwnerRole() {
given()
.contentType(ContentType.JSON)
.body("""
{
"name": "Test Bar",
"description": "Un bar de test",
"address": "123 Rue Test",
"city": "Abidjan",
"phone": "+22501234567",
"email": "testbar@test.com",
"latitude": 5.3600,
"longitude": -3.9400
}
""")
.when()
.post("/afterwork/establishments")
.then()
.statusCode(anyOf(is(201), is(200), is(400))); // 400 si validation échoue
}
@Test
@TestSecurity(user = "owner@test.com", roles = {"OWNER"})
@DisplayName("PUT /establishments/{id} - OWNER peut modifier un établissement")
void testUpdateEstablishmentWithOwnerRole() {
UUID randomId = UUID.randomUUID();
given()
.contentType(ContentType.JSON)
.body("""
{
"name": "Updated Bar Name",
"description": "Description mise à jour"
}
""")
.when()
.put("/afterwork/establishments/" + randomId)
.then()
.statusCode(anyOf(is(200), is(404), is(403))); // 404 si n'existe pas, 403 si pas propriétaire
}
@Test
@TestSecurity(user = "owner@test.com", roles = {"OWNER"})
@DisplayName("DELETE /establishments/{id} - Établissement inexistant devrait retourner 404")
void testDeleteNonExistentEstablishment() {
UUID randomId = UUID.randomUUID();
given()
.when()
.delete("/afterwork/establishments/" + randomId)
.then()
.statusCode(404);
}
// =========================================================================
// Tests endpoints admin
// =========================================================================
@Test
@TestSecurity(user = "admin@test.com", roles = {"ADMIN"})
@DisplayName("GET /establishments/pending - ADMIN peut voir les établissements en attente")
void testGetPendingEstablishments() {
given()
.when()
.get("/afterwork/establishments/pending")
.then()
.statusCode(anyOf(is(200), is(404)));
}
@Test
@TestSecurity(user = "admin@test.com", roles = {"ADMIN"})
@DisplayName("PATCH /establishments/{id}/approve - ADMIN peut approuver un établissement")
void testApproveEstablishment() {
UUID randomId = UUID.randomUUID();
given()
.when()
.patch("/afterwork/establishments/" + randomId + "/approve")
.then()
.statusCode(anyOf(is(200), is(404)));
}
// =========================================================================
// Tests de validation
// =========================================================================
@Test
@TestSecurity(user = "owner@test.com", roles = {"OWNER"})
@DisplayName("POST /establishments - Données invalides devrait retourner 400")
void testCreateEstablishmentWithInvalidData() {
given()
.contentType(ContentType.JSON)
.body("""
{
"name": ""
}
""")
.when()
.post("/afterwork/establishments")
.then()
.statusCode(400);
}
}

View File

@@ -0,0 +1,215 @@
package com.lions.dev.resource;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.security.TestSecurity;
import io.restassured.http.ContentType;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.UUID;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.*;
/**
* Tests d'intégration pour UsersResource.
*
* @since 2.0 - Tests production-ready
*/
@QuarkusTest
class UsersResourceTest {
// =========================================================================
// Tests endpoints publics (authentification, inscription)
// =========================================================================
@Test
@DisplayName("POST /users/authenticate - Identifiants invalides devrait retourner 401")
void testAuthenticateWithInvalidCredentials() {
given()
.contentType(ContentType.JSON)
.body("""
{
"email": "invalid@test.com",
"password": "wrongpassword"
}
""")
.when()
.post("/afterwork/users/authenticate")
.then()
.statusCode(anyOf(is(401), is(404)));
}
@Test
@DisplayName("POST /users/authenticate - Email manquant devrait retourner 400")
void testAuthenticateWithMissingEmail() {
given()
.contentType(ContentType.JSON)
.body("""
{
"password": "somepassword"
}
""")
.when()
.post("/afterwork/users/authenticate")
.then()
.statusCode(400);
}
@Test
@DisplayName("POST /users/register - Email invalide devrait retourner 400")
void testRegisterWithInvalidEmail() {
given()
.contentType(ContentType.JSON)
.body("""
{
"email": "invalidemail",
"password": "ValidPassword123!",
"firstName": "Test",
"lastName": "User"
}
""")
.when()
.post("/afterwork/users/register")
.then()
.statusCode(400);
}
@Test
@DisplayName("POST /users/forgot-password - Email inexistant devrait retourner 404 ou 200 (sécurité)")
void testForgotPasswordWithNonExistentEmail() {
// Pour des raisons de sécurité, certaines implémentations retournent 200
// même si l'email n'existe pas (pour ne pas divulguer d'informations)
given()
.contentType(ContentType.JSON)
.body("""
{
"email": "nonexistent@test.com"
}
""")
.when()
.post("/afterwork/users/forgot-password")
.then()
.statusCode(anyOf(is(200), is(404)));
}
// =========================================================================
// Tests endpoints protégés (profil utilisateur)
// =========================================================================
@Test
@DisplayName("GET /users/me - Sans authentification devrait retourner 401")
void testGetProfileWithoutAuth() {
given()
.when()
.get("/afterwork/users/me")
.then()
.statusCode(401);
}
@Test
@TestSecurity(user = "testuser@test.com", roles = {"USER"})
@DisplayName("GET /users/me - Avec authentification devrait retourner le profil")
void testGetProfileWithAuth() {
given()
.when()
.get("/afterwork/users/me")
.then()
.statusCode(anyOf(is(200), is(404))); // 404 si l'utilisateur de test n'existe pas en BDD
}
@Test
@DisplayName("PUT /users/{id} - Sans authentification devrait retourner 401")
void testUpdateProfileWithoutAuth() {
UUID randomId = UUID.randomUUID();
given()
.contentType(ContentType.JSON)
.body("""
{
"firstName": "Updated",
"lastName": "User"
}
""")
.when()
.put("/afterwork/users/" + randomId)
.then()
.statusCode(401);
}
// =========================================================================
// Tests endpoints admin
// =========================================================================
@Test
@DisplayName("GET /users - Sans authentification devrait retourner 401")
void testGetAllUsersWithoutAuth() {
given()
.when()
.get("/afterwork/users")
.then()
.statusCode(401);
}
@Test
@TestSecurity(user = "user@test.com", roles = {"USER"})
@DisplayName("GET /users - Avec rôle USER devrait retourner 403")
void testGetAllUsersWithUserRole() {
given()
.when()
.get("/afterwork/users")
.then()
.statusCode(403);
}
@Test
@TestSecurity(user = "admin@test.com", roles = {"ADMIN"})
@DisplayName("GET /users - Avec rôle ADMIN devrait retourner 200")
void testGetAllUsersWithAdminRole() {
given()
.when()
.get("/afterwork/users")
.then()
.statusCode(200)
.body("$", instanceOf(java.util.List.class));
}
@Test
@TestSecurity(user = "admin@test.com", roles = {"ADMIN"})
@DisplayName("DELETE /users/{id} - Suppression d'un utilisateur inexistant devrait retourner 404")
void testDeleteNonExistentUser() {
UUID randomId = UUID.randomUUID();
given()
.when()
.delete("/afterwork/users/" + randomId)
.then()
.statusCode(404);
}
// =========================================================================
// Tests de validation
// =========================================================================
@Test
@DisplayName("POST /users/register - Données complètes valides")
void testRegisterValidation() {
String uniqueEmail = "test_" + System.currentTimeMillis() + "@test.com";
given()
.contentType(ContentType.JSON)
.body(String.format("""
{
"email": "%s",
"password": "ValidPassword123!",
"firstName": "Test",
"lastName": "User",
"phone": "+33612345678"
}
""", uniqueEmail))
.when()
.post("/afterwork/users/register")
.then()
.statusCode(anyOf(is(201), is(200), is(409))); // 409 si l'email existe déjà
}
}

View File

@@ -0,0 +1,113 @@
package com.lions.dev.service;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.security.TestSecurity;
import jakarta.inject.Inject;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.UUID;
import static org.junit.jupiter.api.Assertions.*;
/**
* Tests unitaires pour MessageService.
*
* @since 2.0 - Tests production-ready
*/
@QuarkusTest
class MessageServiceTest {
@Inject
MessageService messageService;
// =========================================================================
// Tests de base
// =========================================================================
@Test
@DisplayName("Service devrait être injecté")
void testServiceInjection() {
assertNotNull(messageService, "MessageService devrait être injecté");
}
@Test
@DisplayName("getUserConversations devrait retourner une liste vide pour un utilisateur sans conversations")
void testGetUserConversationsEmpty() {
UUID randomUserId = UUID.randomUUID();
var conversations = messageService.getUserConversations(randomUserId);
assertNotNull(conversations, "La liste ne devrait pas être null");
assertTrue(conversations.isEmpty(), "La liste devrait être vide pour un nouvel utilisateur");
}
@Test
@DisplayName("getConversation devrait retourner null pour une conversation inexistante")
void testGetNonExistentConversation() {
UUID randomConvId = UUID.randomUUID();
var conversation = messageService.getConversation(randomConvId);
assertNull(conversation, "Devrait retourner null pour une conversation inexistante");
}
@Test
@DisplayName("getConversationMessages devrait retourner une liste vide pour une conversation inexistante")
void testGetMessagesForNonExistentConversation() {
UUID randomConvId = UUID.randomUUID();
var messages = messageService.getConversationMessages(randomConvId, 0, 50);
assertNotNull(messages, "La liste ne devrait pas être null");
assertTrue(messages.isEmpty(), "La liste devrait être vide");
}
@Test
@DisplayName("getTotalUnreadCount devrait retourner 0 pour un utilisateur sans messages")
void testGetUnreadCountForNewUser() {
UUID randomUserId = UUID.randomUUID();
long count = messageService.getTotalUnreadCount(randomUserId);
assertEquals(0, count, "Le compte de messages non lus devrait être 0");
}
@Test
@DisplayName("deleteMessage devrait retourner false pour un message inexistant")
void testDeleteNonExistentMessage() {
UUID randomMessageId = UUID.randomUUID();
boolean deleted = messageService.deleteMessage(randomMessageId);
assertFalse(deleted, "Devrait retourner false pour un message inexistant");
}
@Test
@DisplayName("deleteConversation devrait retourner false pour une conversation inexistante")
void testDeleteNonExistentConversation() {
UUID randomConvId = UUID.randomUUID();
boolean deleted = messageService.deleteConversation(randomConvId);
assertFalse(deleted, "Devrait retourner false pour une conversation inexistante");
}
// =========================================================================
// Tests de pagination
// =========================================================================
@Test
@DisplayName("getConversationMessages devrait respecter les paramètres de pagination")
void testMessagesPagination() {
UUID randomConvId = UUID.randomUUID();
// Page 0, size 10
var page1 = messageService.getConversationMessages(randomConvId, 0, 10);
assertNotNull(page1);
// Page 1, size 10
var page2 = messageService.getConversationMessages(randomConvId, 1, 10);
assertNotNull(page2);
}
}

View File

@@ -0,0 +1,164 @@
package com.lions.dev.service;
import com.lions.dev.security.Permission;
import com.lions.dev.security.Role;
import com.lions.dev.security.RolePermissionConfig;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.security.TestSecurity;
import jakarta.inject.Inject;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.Set;
import java.util.UUID;
import static org.junit.jupiter.api.Assertions.*;
/**
* Tests unitaires pour le SecurityService.
* Utilise @TestSecurity pour simuler différents contextes de sécurité.
*
* @since 2.0 - Tests production-ready
*/
@QuarkusTest
class SecurityServiceTest {
@Inject
SecurityService securityService;
// =========================================================================
// Tests des permissions par rôle
// =========================================================================
@Test
@DisplayName("Role USER devrait avoir les permissions de base")
void testUserRoleHasBasicPermissions() {
Set<Permission> userPermissions = RolePermissionConfig.getPermissions(Role.USER);
// Vérifier les permissions de profil
assertTrue(userPermissions.contains(Permission.PROFILE_READ), "USER devrait pouvoir lire son profil");
assertTrue(userPermissions.contains(Permission.PROFILE_UPDATE), "USER devrait pouvoir modifier son profil");
// Vérifier les permissions de lecture
assertTrue(userPermissions.contains(Permission.EVENTS_READ), "USER devrait pouvoir lire les événements");
assertTrue(userPermissions.contains(Permission.ESTABLISHMENTS_READ), "USER devrait pouvoir lire les établissements");
// Vérifier les permissions de participation
assertTrue(userPermissions.contains(Permission.EVENTS_PARTICIPATE), "USER devrait pouvoir participer aux événements");
assertTrue(userPermissions.contains(Permission.RESERVATIONS_CREATE), "USER devrait pouvoir créer des réservations");
// Vérifier l'absence de permissions admin
assertFalse(userPermissions.contains(Permission.SUPER_ADMIN_ACCESS), "USER ne devrait pas avoir accès super admin");
assertFalse(userPermissions.contains(Permission.USERS_DELETE_ANY), "USER ne devrait pas pouvoir supprimer d'autres utilisateurs");
}
@Test
@DisplayName("Role OWNER devrait avoir les permissions d'établissement")
void testOwnerRoleHasEstablishmentPermissions() {
Set<Permission> ownerPermissions = RolePermissionConfig.getPermissions(Role.OWNER);
// Permissions de gestion d'établissement
assertTrue(ownerPermissions.contains(Permission.ESTABLISHMENTS_CREATE), "OWNER devrait pouvoir créer un établissement");
assertTrue(ownerPermissions.contains(Permission.ESTABLISHMENTS_UPDATE_OWN), "OWNER devrait pouvoir modifier son établissement");
assertTrue(ownerPermissions.contains(Permission.ESTABLISHMENTS_DELETE_OWN), "OWNER devrait pouvoir supprimer son établissement");
assertTrue(ownerPermissions.contains(Permission.ESTABLISHMENTS_MANAGE_STAFF), "OWNER devrait pouvoir gérer le personnel");
assertTrue(ownerPermissions.contains(Permission.ESTABLISHMENTS_VIEW_ANALYTICS), "OWNER devrait voir les analytics");
// Permissions de promotions
assertTrue(ownerPermissions.contains(Permission.PROMOTIONS_CREATE), "OWNER devrait pouvoir créer des promotions");
assertTrue(ownerPermissions.contains(Permission.PROMOTIONS_UPDATE_OWN), "OWNER devrait pouvoir modifier ses promotions");
assertTrue(ownerPermissions.contains(Permission.PROMOTIONS_DELETE_OWN), "OWNER devrait pouvoir supprimer ses promotions");
}
@Test
@DisplayName("Role SUPER_ADMIN devrait avoir toutes les permissions")
void testSuperAdminHasAllPermissions() {
Set<Permission> superAdminPermissions = RolePermissionConfig.getPermissions(Role.SUPER_ADMIN);
// SUPER_ADMIN devrait avoir accès à tout
assertTrue(superAdminPermissions.contains(Permission.SUPER_ADMIN_ACCESS), "SUPER_ADMIN devrait avoir accès super admin");
assertTrue(superAdminPermissions.contains(Permission.USERS_DELETE_ANY), "SUPER_ADMIN devrait pouvoir supprimer tout utilisateur");
assertTrue(superAdminPermissions.contains(Permission.EVENTS_DELETE_ANY), "SUPER_ADMIN devrait pouvoir supprimer tout événement");
assertTrue(superAdminPermissions.contains(Permission.ESTABLISHMENTS_DELETE_ANY), "SUPER_ADMIN devrait pouvoir supprimer tout établissement");
assertTrue(superAdminPermissions.contains(Permission.ADMIN_SETTINGS), "SUPER_ADMIN devrait pouvoir modifier les paramètres système");
}
@Test
@DisplayName("Role MODERATOR devrait avoir les permissions de modération")
void testModeratorRoleHasModerationPermissions() {
Set<Permission> modPermissions = RolePermissionConfig.getPermissions(Role.MODERATOR);
assertTrue(modPermissions.contains(Permission.MODERATION_VIEW_REPORTS), "MODERATOR devrait voir les signalements");
assertTrue(modPermissions.contains(Permission.MODERATION_HANDLE_REPORTS), "MODERATOR devrait traiter les signalements");
assertTrue(modPermissions.contains(Permission.MODERATION_HIDE_CONTENT), "MODERATOR devrait pouvoir masquer du contenu");
assertTrue(modPermissions.contains(Permission.POSTS_MODERATE), "MODERATOR devrait pouvoir modérer les posts");
assertTrue(modPermissions.contains(Permission.REVIEWS_MODERATE), "MODERATOR devrait pouvoir modérer les avis");
}
// =========================================================================
// Tests du contexte de sécurité avec @TestSecurity
// =========================================================================
@Test
@TestSecurity(user = "testuser@test.com", roles = {"USER"})
@DisplayName("Utilisateur authentifié avec rôle USER")
void testAuthenticatedUserRole() {
assertTrue(securityService.hasAnyRole("USER"), "Devrait avoir le rôle USER");
assertFalse(securityService.hasAnyRole("ADMIN"), "Ne devrait pas avoir le rôle ADMIN");
assertFalse(securityService.hasAnyRole("SUPER_ADMIN"), "Ne devrait pas avoir le rôle SUPER_ADMIN");
}
@Test
@TestSecurity(user = "admin@test.com", roles = {"ADMIN"})
@DisplayName("Utilisateur authentifié avec rôle ADMIN")
void testAuthenticatedAdminRole() {
assertTrue(securityService.hasAnyRole("ADMIN"), "Devrait avoir le rôle ADMIN");
assertTrue(securityService.hasAnyRole("USER", "ADMIN"), "Devrait avoir USER ou ADMIN");
}
@Test
@TestSecurity(user = "superadmin@test.com", roles = {"SUPER_ADMIN"})
@DisplayName("Utilisateur authentifié avec rôle SUPER_ADMIN")
void testAuthenticatedSuperAdminRole() {
assertTrue(securityService.hasAnyRole("SUPER_ADMIN"), "Devrait avoir le rôle SUPER_ADMIN");
}
// =========================================================================
// Tests des utilitaires de rôle
// =========================================================================
@Test
@DisplayName("Test conversion String vers Role")
void testRoleFromString() {
assertEquals(Role.USER, Role.valueOf("USER"));
assertEquals(Role.OWNER, Role.valueOf("OWNER"));
assertEquals(Role.MANAGER, Role.valueOf("MANAGER"));
assertEquals(Role.ADMIN, Role.valueOf("ADMIN"));
assertEquals(Role.SUPER_ADMIN, Role.valueOf("SUPER_ADMIN"));
assertEquals(Role.MODERATOR, Role.valueOf("MODERATOR"));
assertEquals(Role.SUPPORT, Role.valueOf("SUPPORT"));
assertEquals(Role.FINANCE, Role.valueOf("FINANCE"));
}
@Test
@DisplayName("Test que chaque rôle a au moins une permission")
void testAllRolesHavePermissions() {
for (Role role : Role.values()) {
Set<Permission> permissions = RolePermissionConfig.getPermissions(role);
assertFalse(permissions.isEmpty(), "Le rôle " + role + " devrait avoir au moins une permission");
}
}
// =========================================================================
// Tests des permissions
// =========================================================================
@Test
@DisplayName("Test que toutes les permissions ont une description")
void testAllPermissionsHaveDescription() {
for (Permission permission : Permission.values()) {
assertNotNull(permission.getDescription(), "La permission " + permission + " devrait avoir une description");
assertFalse(permission.getDescription().isBlank(), "La description de " + permission + " ne devrait pas être vide");
}
}
}