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
43 lines
1.4 KiB
TypeScript
43 lines
1.4 KiB
TypeScript
import { expect, test, type Page } from '@playwright/test';
|
|
|
|
import { comptes } from '../support/comptes';
|
|
import { fermerSession, ouvrirSession } from '../support/session';
|
|
|
|
test.describe.configure({ mode: 'serial' });
|
|
let page: Page;
|
|
|
|
const fil = () => page.getByRole('complementary', { name: 'Alertes actives' });
|
|
const alertes = () => fil().locator('li.alert-feed__item');
|
|
|
|
test.beforeAll(async ({ browser }) => {
|
|
page = await ouvrirSession(browser, comptes.lecteur);
|
|
});
|
|
test.afterAll(async () => fermerSession(page));
|
|
|
|
test('affiche dix alertes, puis les suivantes à la demande', async () => {
|
|
await expect(alertes()).toHaveCount(10);
|
|
const plus = fil().getByTestId('show-more');
|
|
await expect(plus).toBeVisible();
|
|
|
|
await plus.click();
|
|
|
|
await expect.poll(async () => alertes().count()).toBeGreaterThan(10);
|
|
});
|
|
|
|
test('filtre par sévérité', async () => {
|
|
await fil().getByTestId('severity-filter').selectOption('critical');
|
|
|
|
await expect(alertes().first()).toBeVisible();
|
|
const severites = await alertes().evaluateAll((items) =>
|
|
items.map((item) => item.className.includes('alert-feed__item--critical')),
|
|
);
|
|
expect(severites.every(Boolean)).toBe(true);
|
|
});
|
|
|
|
test('annonce un fil vide quand aucun critère ne correspond', async () => {
|
|
await fil().getByTestId('site-filter').selectOption('demo-ecole');
|
|
|
|
await expect(fil().getByText('Aucune alerte pour ces critères.')).toBeVisible();
|
|
await expect(alertes()).toHaveCount(0);
|
|
});
|