import { expect, test } from '@playwright/test' import { LoginPage } from '../helpers/pages/LoginPage' import { getPersona } from '../_fixtures/personas' /** * Tests du flow login/logout via l'UI. * * C'est le SEUL fichier qui traverse le formulaire pour de vrai. Les autres * specs utilisent `loginAs()` qui pose directement le cookie BEARER via API, * 10x plus rapide et decouple du form HTML. */ test.describe('Login', () => { test('login valide pose le cookie BEARER et redirige vers /', async ({ page, context }) => { const superAdmin = getPersona('super-admin') const loginPage = new LoginPage(page) await loginPage.goto() await loginPage.fillAndSubmit(superAdmin.username, superAdmin.password) // La redirection se fait apres un `navigateTo('/')` dans login.vue. await page.waitForURL('/') await expect(page).toHaveURL('/') // Le cookie BEARER (HTTP-only) doit etre pose par Symfony. const cookies = await context.cookies() const bearer = cookies.find(c => c.name === 'BEARER') expect(bearer, 'Le cookie BEARER doit etre pose apres un login valide').toBeDefined() expect(bearer?.httpOnly).toBe(true) }) test('login invalide reste sur /login et n\'emet pas de cookie', async ({ page, context }) => { const loginPage = new LoginPage(page) await loginPage.goto() await loginPage.fillAndSubmit('e2e.super-admin', 'wrong-password') // On ne doit PAS etre redirige — le handleSubmit swallow la 401 via toast, // le user reste sur /login pour corriger. await page.waitForTimeout(500) await expect(page).toHaveURL(/\/login$/) const cookies = await context.cookies() const bearer = cookies.find(c => c.name === 'BEARER') expect(bearer, 'Aucun cookie BEARER ne doit etre pose apres un login invalide').toBeUndefined() }) test('logout efface le cookie et redirige vers /login', async ({ page, context }) => { const superAdmin = getPersona('super-admin') const loginPage = new LoginPage(page) // 1. Login d'abord await loginPage.goto() await loginPage.fillAndSubmit(superAdmin.username, superAdmin.password) await page.waitForURL('/') // 2. Navigation vers /logout (il y a un lien "Deconnexion" dans la sidebar) await page.goto('/logout') await page.waitForURL(/\/login$/) // 3. Le cookie BEARER doit avoir ete supprime par le firewall de logout const cookies = await context.cookies() const bearer = cookies.find(c => c.name === 'BEARER') expect(bearer, 'Le cookie BEARER doit etre supprime apres logout').toBeUndefined() }) })