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)
259 lines
9.6 KiB
Markdown
259 lines
9.6 KiB
Markdown
# 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 :
|
|
```typescript
|
|
// 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 /interventions` cree bien une row dans Baserow, recalcule rollups
|
|
- `Webhook row.created` declenche 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) :
|
|
1. **Admin cree formation → blocs → modules** (UC-01 + UC-02)
|
|
2. **Admin attribue module a un formateur** (UC-03)
|
|
3. **Formateur saisit heures realisees via mobile** (UC-13)
|
|
4. **Admin cree client → projet → taches** (UCA-01 + UCA-02 + UCA-03)
|
|
5. **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 :
|
|
|
|
```gherkin
|
|
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 :
|
|
|
|
1. Run full test suite (unit + integration + E2E sur staging)
|
|
2. UX checklist manuel (cf section 3.4)
|
|
3. Smoke test post-deploy prod (verifier 3 endpoints critiques)
|
|
4. 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) :
|
|
|
|
1. **Dry-run** : mapping CSV → Baserow rows en memoire, validation schema, rapport ecarts
|
|
2. **Test import** sur env staging avec subset (10 rows)
|
|
3. **Verification** integrite : rollups calcules correctement, FK liees
|
|
4. **Import prod** apres validation
|
|
5. **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
|