- 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>
46 lines
1.9 KiB
TypeScript
46 lines
1.9 KiB
TypeScript
import type { BrowserContext, Page } from '@playwright/test'
|
|
import { type PersonaKey, getPersona } from '../_fixtures/personas'
|
|
|
|
/**
|
|
* Login programmatique : pose le cookie BEARER via l'API sans passer par le
|
|
* formulaire de login.
|
|
*
|
|
* Utilise ce helper dans TOUS les tests qui ne testent pas le flow login
|
|
* lui-meme (sidebar visibility, route guards, etc.). Ca evite de payer 2s
|
|
* par test sur le form HTML et ca isole les tests : si le form login casse,
|
|
* seul `login.spec.ts` est rouge, pas toute la suite.
|
|
*
|
|
* Impl : on issue une requete POST /api/login_check avec les creds du persona.
|
|
* Nginx reecrit vers /login_check, Symfony pose le cookie BEARER sur le
|
|
* context du browser. Apres ca, n'importe quelle navigation est authentifiee.
|
|
*/
|
|
export async function loginAs(context: BrowserContext, persona: PersonaKey, baseURL?: string): Promise<void> {
|
|
const { username, password } = getPersona(persona)
|
|
const base = baseURL ?? 'http://localhost:3004'
|
|
|
|
const response = await context.request.post(`${base}/api/login_check`, {
|
|
data: { username, password },
|
|
})
|
|
|
|
if (!response.ok()) {
|
|
const body = await response.text()
|
|
throw new Error(
|
|
`loginAs(${persona}) a echoue : ${response.status()} ${body}. `
|
|
+ 'Verifier que le backend tourne et que `make seed-e2e` a ete lance.',
|
|
)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Helper d'appoint quand on veut tester VIA l'UI (login.spec.ts uniquement).
|
|
* Passe par le formulaire rendu, clique sur le bouton. A ne PAS utiliser
|
|
* dans les autres tests — preferer `loginAs()`.
|
|
*/
|
|
export async function loginViaForm(page: Page, persona: PersonaKey): Promise<void> {
|
|
const { username, password } = getPersona(persona)
|
|
await page.goto('/login')
|
|
await page.getByLabel("Nom d'utilisateur").fill(username)
|
|
await page.getByLabel('Mot de passe').fill(password)
|
|
await page.getByRole('button', { name: 'Se connecter' }).click()
|
|
}
|