Files
Starseed/frontend/tests/e2e/_fixtures/personas.ts
matthieu 4603ab2832 test(e2e) : initialise la suite Playwright (login + sidebar RBAC)
- 11 tests couvrant le login (3) et la visibilite sidebar par RBAC (8)
- 6 personas seedes via la commande app:seed-e2e, miroir cote front
  dans frontend/tests/e2e/_fixtures/personas.ts
- Page Objects (LoginPage, SidebarComponent) avec selecteurs stables
  par href + loginAs programmatique via cookie BEARER
- Targets Makefile : seed-e2e, test-e2e, test-e2e-ui, install-e2e-deps
- CLAUDE.md + README.md : workflow E2E + regle d'or "un E2E par bug
  prod uniquement" pour garder la suite maintenable dans la duree

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 17:27:05 +02:00

113 lines
3.5 KiB
TypeScript

/**
* 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/<slug>`), volontairement stables quand
// la copie/i18n change.
expectedAdminLinks: Array<'users' | 'roles' | 'sites' | 'audit-log'>
}
const SHARED_PASSWORD = 'e2e-secret'
export const personas: Record<PersonaKey, Persona> = {
'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