/** * Definition des 6 personas utilises dans les tests E2E. * * Source de verite unique partagee entre : * - le seed backend (`bin/console app:seed-e2e`) * - les tests Playwright (via `loginAs`) * * Regle : chaque persona cible une case precise de la matrice RBAC. * Si tu ajoutes une permission au domaine, tu NE crees pas un nouveau * persona par reflexe — tu ajustes un persona existant si possible. * L'objectif est de garder ce set petit et comprehensible a 6 mois. * * IMPORTANT : ces personas sont recrees a chaque `app:seed-e2e`. Ne jamais * reutiliser les users dev (admin/alice/bob) dans les tests : ils evoluent * au gre des fixtures de demo et casseraient la suite E2E. */ export type PersonaKey = | 'super-admin' | 'user-full' | 'user-readonly' | 'user-users-only' | 'user-audit-only' | 'user-nothing' export interface Persona { key: PersonaKey username: string password: string isAdmin: boolean // Permissions directes attribuees en dur (on bypasse les roles pour // garder le seed simple et la correspondance test<->permission directe). permissions: string[] // Contenu attendu de la sidebar (admin links). Utilise par le test // sidebar-visibility pour driver la matrice. Les valeurs correspondent // aux slugs de route (`/admin/`), volontairement stables quand // la copie/i18n change. expectedAdminLinks: Array<'users' | 'roles' | 'sites' | 'audit-log'> } const SHARED_PASSWORD = 'e2e-secret' export const personas: Record = { 'super-admin': { key: 'super-admin', username: 'e2e.super-admin', password: SHARED_PASSWORD, isAdmin: true, permissions: [], expectedAdminLinks: ['users', 'roles', 'sites', 'audit-log'], }, 'user-full': { key: 'user-full', username: 'e2e.user-full', password: SHARED_PASSWORD, isAdmin: false, permissions: [ 'core.users.view', 'core.users.manage', 'core.roles.view', 'core.roles.manage', 'core.audit_log.view', 'sites.view', 'sites.manage', 'sites.bypass_scope', ], expectedAdminLinks: ['users', 'roles', 'sites', 'audit-log'], }, 'user-readonly': { key: 'user-readonly', username: 'e2e.user-readonly', password: SHARED_PASSWORD, isAdmin: false, permissions: [ 'core.users.view', 'core.roles.view', 'core.audit_log.view', 'sites.view', ], expectedAdminLinks: ['users', 'roles', 'sites', 'audit-log'], }, 'user-users-only': { key: 'user-users-only', username: 'e2e.user-users-only', password: SHARED_PASSWORD, isAdmin: false, permissions: ['core.users.view', 'core.users.manage'], expectedAdminLinks: ['users'], }, 'user-audit-only': { key: 'user-audit-only', username: 'e2e.user-audit-only', password: SHARED_PASSWORD, isAdmin: false, permissions: ['core.audit_log.view'], expectedAdminLinks: ['audit-log'], }, 'user-nothing': { key: 'user-nothing', username: 'e2e.user-nothing', password: SHARED_PASSWORD, isAdmin: false, permissions: [], expectedAdminLinks: [], }, } export function getPersona(key: PersonaKey): Persona { return personas[key] } export const ALL_ADMIN_LINKS = ['users', 'roles', 'sites', 'audit-log'] as const