- 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>
66 lines
2.7 KiB
TypeScript
66 lines
2.7 KiB
TypeScript
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()
|
|
})
|
|
})
|