Files
Coltura/frontend/tests/e2e/helpers/loginAs.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

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()
}