Conception complete (Phase 0) pour formation-hub Acadenice : - 19 docs Merise Agile + UML + GitOps + plans (tests/deploy/ops/api) cf docs/00-readme.md pour l'index complet - Stack Docker compose (Docmost + Baserow + Postgres + Redis + MinIO local FS) compose.yml + compose.staging.yml + compose.prod.yml - CI/CD GitHub Actions skeleton (ci, deploy-staging, deploy-prod) - Bridge service skeleton (Hono + TS + Biome + Vitest + zod + pino) - Templates GitHub : PR + 3 issue types + CODEOWNERS + dependabot.yml - Scripts ops : healthcheck, backup quotidien, smoke-test post-deploy - LICENSE AGPL-3.0 + SECURITY.md + CONTRIBUTING.md + CHANGELOG.md - Diagramme drawIO archi infra (XML importable dans diagrams.net) Decisions structurelles enregistrees : - Scope CFA + Agence avec entite PERSONNE pivot multi-roles (ADR-001) - Stack composite Docmost AGPL + Baserow MIT + bridge custom (ADR-001) - Path B : UX quasi-unified via Tiptap node-views custom (ADR-002) - Monorepo trunk-based development (ADR-003) - Postgres separe Docmost/Baserow (ADR-004) - Bridge stack Node 22 + Hono (ADR-005) - Repo neuf prefere a fork Docmost - Prod-like des le jour 1 (pas MVP)
9.6 KiB
Plan de tests
Strategie de qualite : niveaux de tests, outils, coverage, criteres d'acceptance, regression. Audience : Corentin + freelance ponctuel (Phase 2 bridge).
1. Strategie globale — Pyramide
/\
/E2E\ peu nombreux, lents, fragiles, hauts dans la stack
/------\
/ INT \ middle — verifie les contrats Baserow/Docmost/bridge
/----------\
/ UNIT \ nombreux, rapides, isoles — bridge service uniquement
/--------------\
- Unit tests : 70% du volume, sur le code custom (bridge)
- Integration tests : 25%, sur les vrais clients Baserow/Docmost (containers de test)
- E2E tests : 5%, parcours utilisateur complet sur staging
- UX manuel + NFR : checklist par release
2. Scope du test
Ce qui se teste :
- Bridge service (notre seul code custom) : 100% obligatoire
- Configurations Baserow (formules, vues) : tests manuels checklist
- Configurations Docmost (perms, share links) : tests manuels checklist
- Workflows metier : tests E2E des parcours principaux
Ce qui ne se teste pas :
- Code upstream Docmost/Baserow (deja teste par eux)
- Postgres/Redis (assume fonctionnel)
3. Niveaux de tests
3.1 Unit tests (bridge)
| Aspect | Spec |
|---|---|
| Outil | Vitest |
| Cible | bridge/src/** — domain models, formulas, utils, validators |
| Mock | Pas de Baserow/Docmost reels, mocks via vi.mock() |
| Coverage minimum | 80% sur bridge/src/domain/ et bridge/src/lib/, 70% global |
| Exemples a tester | Personne.heuresRestantesTotal(), Module.creerAttribution() validations RG, parsers d'entree |
| Run | npm run test:unit |
| CI | A chaque push + PR |
Pattern :
// bridge/src/domain/personne.test.ts
import { describe, it, expect } from 'vitest';
import { Personne } from './personne';
import { Decimal } from 'decimal.js';
describe('Personne.heuresRestantesTotal', () => {
it('returns capacity - allocated', () => {
const p = new Personne({
capaciteAnnuelle: new Decimal(1500),
heuresAttribueesFormation: new Decimal(400),
heuresAttribueesAgence: new Decimal(600),
// ...
});
expect(p.heuresRestantesTotal().toNumber()).toBe(500);
});
it('handles overflow (negative result)', () => {
// ...
});
});
3.2 Integration tests (bridge ↔ services)
| Aspect | Spec |
|---|---|
| Outil | Vitest + testcontainers (Postgres + Redis reels) |
| Cible | Adapters Baserow/Docmost, webhook handlers, cache Redis |
| Setup | Docker compose compose.test.yml lance Baserow et Docmost containers ephemeres |
| Coverage | Tous les endpoints du bridge |
| Run | npm run test:integration |
| CI | A chaque push (utilise services Postgres/Redis du runner GitHub Actions) |
| Duree max | 5 min (sinon a optimiser ou move vers nightly) |
Exemples :
POST /interventionscree bien une row dans Baserow, recalcule rollupsWebhook row.createddeclenche cache invalidation Redis- Auth
Authorization: Bearer <token>valide ou refuse correctement
3.3 E2E tests (workflows complets)
| Aspect | Spec |
|---|---|
| Outil | Playwright |
| Cible | Parcours metier complets sur env staging |
| Browsers | Chromium + Firefox (mobile WebKit pour saisie heures) |
| Run | npm run test:e2e |
| CI | Apres deploy staging reussi (pas a chaque push) |
| Duree max | 15 min |
Parcours E2E a couvrir (top 5 priorite) :
- Admin cree formation → blocs → modules (UC-01 + UC-02)
- Admin attribue module a un formateur (UC-03)
- Formateur saisit heures realisees via mobile (UC-13)
- Admin cree client → projet → taches (UCA-01 + UCA-02 + UCA-03)
- Dev saisit intervention sur tache (UCA-07)
3.4 UX manuel — checklist
Pas automatisable (parle de feel, intuitivite). Pour chaque release :
[ ] Login Docmost et Baserow OK
[ ] Saisie d'une formation prend < 30s
[ ] Saisie heures realisees mobile prend < 15s sur smartphone
[ ] Diagrammes Mermaid/Drawio/Excalidraw rendent OK dans une page Docmost
[ ] Share link client fonctionne sans compte
[ ] Recherche full-text Docmost trouve une page recente
[ ] Filtres Baserow sur les vues principales fonctionnent
[ ] Pas de regression visible sur les 3 vues kanban (modules / projets / taches)
3.5 NFR — tests non-fonctionnels
| Categorie | Test | Cible |
|---|---|---|
| Performance | Latence saisie intervention (UCA-07) | p95 < 2s |
| Performance | Recherche full-text Docmost | p95 < 500ms |
| Performance | Recalcul rollup Baserow apres saisie | < 5s |
| Securite | Secret scanning (TruffleHog) | Zero hit |
| Securite | SAST (Semgrep) | Zero finding error severity |
| Securite | Dependency CVE (npm audit) | Zero high/critical |
| Securite | Auth bypass tentative (pentest leger) | 401 sur endpoints proteges |
| Accessibility | Lighthouse a11y score | >= 90 sur pages publiques |
| Charge | 30 users simultanes (k6) | Latence p95 < 3s, error rate < 1% |
| Backup | Restore depuis backup recent | RTO < 4h, integrity 100% |
4. Donnees de test (fixtures)
4.1 Strategie
- Unit tests : objects in-memory crees ad-hoc dans le test
- Integration tests : seed Baserow ephemere via API a chaque test (fast)
- E2E tests : staging environment avec data realiste anonymisee + reset post-test
4.2 Fixtures versionnees
bridge/tests/fixtures/
personnes.json: 5 personnes types (admin pur, formateur seul, dev seul, formateur+dev, inactif)formations.json: 2 formations (1 active, 1 archivee)clients.json: 3 clients (prospect, actif, archive)- ...
Chargement : helper loadFixture('personnes') dans tests.
5. Test environments
| Env | Donnees | Usage |
|---|---|---|
local (dev) |
Fixtures seedees a chaque make up |
Dev quotidien |
test (CI) |
Containers ephemeres + fixtures | Integration tests CI |
staging |
Data realiste anonymisee | E2E + UX manuel |
prod |
Data reelle | Pas de tests destructifs |
6. Quality gates
A chaque PR, bloquant pour merge si rouge :
| Check | Tool | Critere |
|---|---|---|
| Lint | Biome | Zero error |
| Type check | tsc | Zero error |
| Unit tests | Vitest | 100% pass |
| Integration tests | Vitest + testcontainers | 100% pass |
| Coverage unit | Vitest | >= 70% global, 80% sur domain |
| Secret scan | TruffleHog | Zero hit |
| SAST | Semgrep | Zero error severity |
| Dep audit | npm audit | Zero high/critical |
| Docker build | docker compose | OK |
E2E tests non bloquants pour merge mais bloquants pour deploy prod (run apres deploy staging).
7. Acceptance criteria par feature
Format Gherkin pour les UC principaux :
Feature: Saisir heures realisees (UC-13)
As a Formateur
I want to log my actual hours per attribution
So that the rollups update and admin sees real progress
Scenario: Formateur saisit ses heures dans la limite
Given une attribution "Module JS / Pierre" en statut planifie avec 10h attribuees
When Pierre saisit 3h realisees
Then attribution.heures_realisees = 3h
And module.heures_realisees est recalcule
And personne.heures_attribuees_formation reste a 10h
And no warning displayed
Scenario: Formateur saisit en depassement
Given une attribution avec 10h attribuees, deja 8h realisees
When Pierre saisit 4h supplementaires (total 12h, depasse de 2h)
Then warning "Depassement detecte, justification requise"
And attribution.heures_realisees = 12h apres confirmation justification
A faire pour chaque UC critique (UC-01, UC-03, UC-13, UCA-02, UCA-07).
8. Plan de regression
Avant chaque release vers prod :
- Run full test suite (unit + integration + E2E sur staging)
- UX checklist manuel (cf section 3.4)
- Smoke test post-deploy prod (verifier 3 endpoints critiques)
- Verification monitoring (logs / metriques 30 min apres deploy)
Si une regression majeure est detectee : rollback (cf doc 14 section 12).
9. Test de migration data
Lors de l'import data initial (formations existantes / formateurs / clients) :
- Dry-run : mapping CSV → Baserow rows en memoire, validation schema, rapport ecarts
- Test import sur env staging avec subset (10 rows)
- Verification integrite : rollups calcules correctement, FK liees
- Import prod apres validation
- Reconciliation : compare nb rows attendus vs imported
10. Outils — recap
| Outil | Role | Where |
|---|---|---|
| Vitest | Unit + integration tests | bridge/ |
| testcontainers | Postgres/Redis containers ephemeres | bridge/tests/integration |
| Playwright | E2E sur staging | bridge/tests/e2e |
| k6 | Load testing | scripts/load-test.js |
| Lighthouse | A11y + perf web | nightly via CI ou manuel |
| TruffleHog | Secret scanning | CI |
| Semgrep | SAST | CI |
| npm audit / Dependabot | Dep CVE | CI + auto |
| Biome | Lint + format | CI |
11. Roadmap tests
| Phase | Couverture |
|---|---|
| Phase 1 (vanilla) | Tests manuels checklist UX, smoke tests, validation post-import data |
| Phase 2 (bridge code) | Unit + integration obligatoires sur le code bridge des le jour 1 |
| Phase 3 (maturite) | Ajouter E2E Playwright sur staging, NFR (perf + a11y), load tests |
| Phase 4 | Test de DR (restauration backup) mensuel |
12. Questions ouvertes
- Coverage minimum exacte ? Le doc 14 propose 70% — a confirmer avec Yan/Ludo
- Tests d'accessibilite obligatoires ou nice-to-have ? (RGAA conformance pour les pages publiques etudiants ?)
- Tests de charge : a partir de quelle Phase ? (proba pas avant Phase 3)
- Outils de monitoring synthetic (UptimeRobot pour healthchecks) — a definir doc 18