58cbfe4437
Auto Tag Develop / tag (push) Successful in 6s
ERP-90 — Étape 3/7 M2 fournisseurs (stack sur ERP-89). ## Périmètre - **5 permissions** `commercial.suppliers.*` (view / manage / accounting.view / accounting.manage / archive) dans `CommercialModule::permissions()`. - **3 sources RBAC synchronisées** (règle ABSOLUE n°8, même commit) : - `config/sidebar.php` — item `/suppliers` + `commercial.suppliers.view` - `frontend/tests/e2e/_fixtures/personas.ts` — persona `user-full` - `SeedE2ECommand.php` — miroir back - **Assignation par rôle** dans `RbacSeeder::MATRIX` (§ 2.9, idempotent) : - Bureau : view + manage - Compta : view + accounting.view + accounting.manage - Commerciale : view + manage - Usine : aucune - archive : Admin seul - **Sécurité des référentiels** (`tva_modes` / `payment_delays` / `payment_types` / `banks`) élargie : `view client OR view fournisseur` (§ 4.7). ## Vérifications - `app:sync-permissions` (+5) et `app:seed-rbac --with-demo-users` (idempotent) OK - `make test` : 499 tests verts - `make php-cs-fixer-allow-risky` : 0 fix - `make nuxt-test` : 234 tests verts --------- Co-authored-by: Matthieu <contact@malio.fr> Reviewed-on: #69 Co-authored-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr> Co-committed-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr>
134 lines
4.8 KiB
TypeScript
134 lines
4.8 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' | 'categories'>
|
|
}
|
|
|
|
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', 'categories', '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',
|
|
'catalog.categories.view',
|
|
'catalog.categories.manage',
|
|
// Commercial — Repertoire clients (M1). Mappe ici sur le persona
|
|
// "tout" en attendant les vrais roles metier (bureau/compta/
|
|
// commerciale/usine) seedes par ERP-74. Pas de nouveau persona
|
|
// (regle ABSOLUE n°7). commercial.clients.view n'ajoute pas de lien
|
|
// dans la section Administration, donc expectedAdminLinks reste inchange.
|
|
'commercial.clients.view',
|
|
'commercial.clients.manage',
|
|
'commercial.clients.accounting.view',
|
|
'commercial.clients.accounting.manage',
|
|
'commercial.clients.archive',
|
|
// Commercial — Repertoire fournisseurs (M2, ERP-90). Meme logique que
|
|
// les clients : mappe sur le persona "tout", pas de nouveau persona
|
|
// (regle ABSOLUE n°7). commercial.suppliers.view n'ajoute pas de lien
|
|
// dans la section Administration, donc expectedAdminLinks reste inchange.
|
|
'commercial.suppliers.view',
|
|
'commercial.suppliers.manage',
|
|
'commercial.suppliers.accounting.view',
|
|
'commercial.suppliers.accounting.manage',
|
|
'commercial.suppliers.archive',
|
|
],
|
|
expectedAdminLinks: ['users', 'roles', 'sites', 'categories', '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', 'categories', 'audit-log'] as const
|