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