Files
ENI-projet-piscine/tests/e2e/specs/roles.spec.ts
T
Johan LEROY a197af91ff test(e2e): joue les parcours utilisateur avec Playwright contre la stack déployée
Aucun parcours n'était vérifié de bout en bout : les tests unitaires du frontend simulent l'API,
ceux du backend n'ouvrent jamais de navigateur.

tests/e2e, paquet npm autonome, 18 parcours dans Chromium :
- authentification, premier login, réinitialisation du mot de passe par Mailpit ;
- rôles : lecteur, opérateur, administrateur ;
- sites, recommandations, fil d'alertes.

e2e.yml, appelé par ci.yml, démarre db, mailpit, backend, frontend et proxy avec
docker-compose.prod.yml sur https://localhost, sème demo.sql, crée les comptes et joue la suite.
Il construit au passage les images backend et frontend, que la CI ne construisait jamais.

Un seul worker et une session par fichier : la zone auth de nginx admet 30 connexions par
minute, et rejouer un cookie de refresh dans un second contexte révoque toute la session.

make e2e-install, e2e-prepare et e2e pour le poste ; make help affiche désormais les cibles
dont le nom contient un chiffre.

Closes #46
2026-09-23 09:25:37 +02:00

58 lines
2.2 KiB
TypeScript

import { expect, test, type Page } from '@playwright/test';
import { comptes } from '../support/comptes';
import { fermerSession, ouvrirSession } from '../support/session';
test.describe('lecteur', () => {
test.describe.configure({ mode: 'serial' });
let page: Page;
test.beforeAll(async ({ browser }) => {
page = await ouvrirSession(browser, comptes.lecteur);
});
test.afterAll(async () => fermerSession(page));
test('ne voit ni la supervision des capteurs ni la génération', async () => {
await expect(page.getByRole('link', { name: 'Voir les sites' })).toBeVisible();
await expect(page.getByRole('link', { name: 'Supervision des capteurs' })).toHaveCount(0);
await page.getByRole('link', { name: 'Recommandations', exact: true }).click();
await expect(page.getByRole('heading', { name: 'Recommandations' })).toBeVisible();
await expect(page.getByTestId('generate')).toHaveCount(0);
});
test('est renvoyé vers la connexion sur la page réservée aux administrateurs', async () => {
await page.goto('/monitoring/sensors');
await expect(page).toHaveURL(/\/login$/);
});
});
test.describe('opérateur', () => {
test('voit le tableau de bord sans la supervision des capteurs', async ({ browser }) => {
const page = await ouvrirSession(browser, comptes.operateur);
await expect(page.getByRole('heading', { name: "Vue d'ensemble" })).toBeVisible();
await expect(page.getByRole('link', { name: 'Supervision des capteurs' })).toHaveCount(0);
await fermerSession(page);
});
});
test.describe('administrateur', () => {
test('suit la santé des capteurs de chaque site', async ({ browser }) => {
const page = await ouvrirSession(browser, comptes.admin);
await page.getByRole('link', { name: 'Supervision des capteurs' }).click();
await expect(page.getByRole('heading', { name: 'Supervision des capteurs' })).toBeVisible();
const cartes = page.getByTestId('site-card');
await expect(cartes.filter({ hasText: 'Siège Part-Dieu' })).toContainText('ok');
await expect(cartes.filter({ hasText: 'Groupe scolaire Gratte-Ciel' })).toContainText(
'degraded',
);
await fermerSession(page);
});
});