corentin_wakdo/docs/TESTING.md
Imugiii 7197be6f96
All checks were successful
CI / secret-scan (pull_request) Successful in 8s
CI / php-lint (pull_request) Successful in 24s
CI / static-tests (pull_request) Successful in 51s
CI / js-tests (pull_request) Successful in 30s
docs: strategie de test (niveaux, couverture, decision E2E hors CI) (P3 finition)
2026-06-22 07:17:25 +00:00

104 lines
4.3 KiB
Markdown

# Strategie de test — Wakdo
> Comment le projet est teste, comment lancer chaque niveau, ce qui tourne en CI,
> comment mesurer la couverture, et pourquoi les tests E2E ne tournent pas en CI.
> Priorite : Unit > Integration > E2E. Cote PHP, aucune dependance Composer
> (PHPUnit en `.phar` autonome).
---
## 1. Niveaux de test
| Niveau | Outil | Perimetre | Ou |
|---|---|---|---|
| Unitaire PHP | PHPUnit (`.phar`) | logique (Auth, RBAC, PIN, throttle, calcul commande, controleurs via doubles) | CI + local |
| Integration PHP | PHPUnit + vraie MariaDB | requetes SQL preparees, contraintes, RBAC `is_active`, audit, FK | CI + local |
| Analyse statique | PHPStan niveau 6 | typage, erreurs potentielles sur `src/` + `tests/` | CI + local |
| Unitaire JS | `node:test` + jsdom | modules du front borne (panier, composeur, checkout, allergenes, a11y, validation) | CI + local |
| E2E | Playwright | parcours borne + admin de bout en bout | **local / manuel** (voir section 5) |
---
## 2. Lancer les tests PHP (sans Composer)
Le binaire `php` n'est pas requis sur l'hote : on passe par l'image applicative.
```bash
# Unitaire + integration (la vraie base est utilisee si WAKDO_DB_TESTS=1) :
docker run --rm -v "$PWD":/app -w /app wakdo-wakdo-app php phpunit.phar -c phpunit.xml
# Integration DB explicite (vraie MariaDB du reseau interne) :
docker run --rm --network wakdo_wakdo_internal --env-file .env -e WAKDO_DB_TESTS=1 \
-v "$PWD":/app -w /app wakdo-wakdo-app php phpunit.phar -c phpunit.xml
# Analyse statique :
docker run --rm -v "$PWD":/app -w /app wakdo-wakdo-app \
php -d memory_limit=-1 phpstan.phar analyse --no-progress
```
Les `*.phar` (phpunit 11.5.2, phpstan 1.12.27) sont gitignores ; les retelecharger si absents.
Les tests d'integration s'auto-skippent hors `WAKDO_DB_TESTS=1` ; la CI force `--fail-on-skipped`
pour qu'aucun test de securite (throttle, RBAC, audit, FK) ne soit silencieusement saute.
---
## 3. Lancer les tests JS
```bash
npm run test:js # node --test tests/js/ (jsdom en devDependency)
```
---
## 4. Couverture de code
Le pilote de couverture (pcov ou Xdebug) n'est **pas** embarque dans l'image de
production (surcout au runtime, sans interet en prod). La couverture se mesure en
dev/CI, avec un PHP equipe d'un pilote de couverture :
```bash
# avec pcov ou xdebug actif dans le PHP utilise :
php -d pcov.enabled=1 phpunit.phar -c phpunit.xml --coverage-text --coverage-html var/coverage
```
`phpunit.xml` declare deja la source a mesurer (`<source><include><directory>src`).
A ce stade, la couverture est produite **a la demande** : aucun seuil n'est impose
en CI (pas de gate de pourcentage). L'ajout d'un pilote de couverture a l'etape CI
`static-tests` et d'un seuil minimal est une evolution identifiee (decision exploitant :
elle suppose un PHP de CI equipe de pcov).
---
## 5. E2E (Playwright) — execution manuelle, hors CI
Les parcours E2E (borne : accueil -> commande -> chevalet -> confirmation ; admin :
login -> dashboard -> logout) se lancent **a la main**, contre une stack jetable :
```bash
tests/e2e/run.sh
```
Le script monte une stack isolee (`docker-compose.yml` + `tests/e2e/docker-compose.e2e.yml`),
attend migrate + healthcheck, puis lance Playwright dans le conteneur officiel.
**Pourquoi pas en CI ?** Decision assumee : le runner Forgejo de production execute les
jobs sans acces au socket Docker (pas de docker-in-docker), et les jobs sont repartis sur
plusieurs runners. Monter une stack Docker complete + Playwright dans ce contexte n'est pas
fiable. Les E2E restent donc un filet **manuel** (lance avant une livraison sensible), tandis
que la CI couvre l'unitaire, l'integration DB, l'analyse statique, le lint et le scan de secrets.
A l'oral, c'est la position a defendre : E2E reels et reproductibles, mais declenches a la main.
---
## 6. Ce que la CI execute (Forgejo Actions, sur PR)
`.forgejo/workflows/ci.yml`, sur `pull_request` vers `dev`/`main` :
| Job | Verifie |
|---|---|
| `secret-scan` | gitleaks (aucun secret dans le diff/historique) |
| `php-lint` | `php -l` sur tous les fichiers `.php` |
| `static-tests` | PHPStan niveau 6 + PHPUnit (unit + integration sur service MariaDB, `--fail-on-skipped`) |
| `js-tests` | `node --test tests/js/` (jsdom) |
L'auto-merge ne se declenche que lorsque ces checks requis sont verts (branch protection).