Files
ENI-projet-piscine/tests/e2e/README.md
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

62 lines
3.1 KiB
Markdown

# Tests de bout en bout (Playwright)
Parcours utilisateur joués dans Chromium contre une stack qui tourne : frontend, API, base et,
en CI, le reverse proxy TLS. Issue #46, décisions dans l'ADR 0015.
## Ce qui est couvert
| Fichier | Parcours |
|---|---|
| `authentification.spec.ts` | Redirection sans session, identifiants refusés, connexion, session conservée au rechargement, déconnexion |
| `premiere-connexion.spec.ts` | Compte neuf : changement du mot de passe temporaire imposé avant le tableau de bord |
| `roles.spec.ts` | Lecteur et opérateur sans supervision ni génération, page admin refusée ; admin sur la santé des capteurs |
| `sites.spec.ts` | Liste des sites, détail (mesure instantanée, historique), recommandations filtrées sur le site |
| `recommandations.spec.ts` | Génération par l'admin, bilan, isolement d'une alerte (`?alert=`) |
| `alertes.spec.ts` | Pagination du fil (« Afficher plus »), filtres par sévérité et par site, fil vide |
| `mot-de-passe-oublie.spec.ts` | Lien invalide refusé ; réinitialisation par le lien reçu dans Mailpit |
Les parcours s'appuient sur le jeu `db/seeds/demo.sql` (sites `demo-*`) et sur les comptes créés
par `scripts/comptes-test.sh`.
## Lancer en local, contre `make dev`
```bash
make e2e-install # une fois : dépendances et Chromium
make dev # dans un autre terminal
make e2e-prepare # sème demo.sql et crée les comptes test-* dans la base de dev
make e2e # joue les parcours contre http://localhost:4200
```
`make e2e-prepare` écrit dans la base de `make dev` : trois sites `demo-*`, quatorze alertes et
des comptes `test-*`, dont un administrateur supplémentaire. Ne jamais le lancer contre la
recette ou la prod.
Rapport HTML : `cd tests/e2e && npx playwright show-report`.
## En CI
Le workflow `e2e.yml`, appelé par `ci.yml` dès que le frontend, l'API, le proxy, les fichiers
Compose ou ces tests changent :
1. construit et démarre `db`, `mailpit`, `backend`, `frontend` et `proxy` avec
`docker-compose.prod.yml`, sur `https://localhost` et un certificat auto-signé ;
2. migre, sème `demo.sql`, crée les comptes ;
3. joue les parcours, puis publie `playwright-report` en artefact (traces au premier réessai).
## Règles d'écriture
- Sélecteurs par rôle, libellé ou `data-testid`, jamais par classe CSS de mise en page.
- Une session par fichier (`ouvrirSession` dans `beforeAll`, mode `serial`). Rejouer un cookie
de refresh dans un autre contexte révoque la famille de session, donc pas de `storageState`
partagé.
- Un seul worker : la zone `auth` de nginx admet 30 connexions par minute.
- Un parcours qui consomme un compte (premier login, réinitialisation) le crée lui-même par
l'API (`creerCompteTemporaire`), pour qu'un nouvel essai ne retombe pas sur un compte déjà
activé.
| Variable | Défaut | Rôle |
|---|---|---|
| `E2E_BASE_URL` | `http://localhost:4200` | Origine du frontend. Doit figurer dans `APP_CORS_ORIGINS` |
| `E2E_COMPTES` | aucun, requis | JSON écrit par `scripts/comptes-test.sh` |
| `E2E_MAILPIT_URL` | `http://localhost:8025` | API de Mailpit, pour le lien de réinitialisation |