PD-84 -- Revue des Tests¶
Story : PD-84 -- Encadrement contractuel offre gratuite B2C-MINEURS Date : 2026-02-24 Reviewer : ChatGPT (gpt-5.3-codex, agent factual, temperature 0.1) Fichiers analyses : 17 fichiers, 2955 lignes
Resume¶
| Critere | Statut |
|---|---|
| Couverture TC-* | 29/30 |
| Qualite assertions | ✅ CONFORME |
| Isolation | ✅ CONFORME |
| Edge cases | ⚠️ RESERVES |
Verdict : ⚠️ RESERVES
Justification : La couverture contractuelle est quasi-complete (29/30 TC couverts). Un seul TC manquant (TC-09 : isolation quotas multi-comptes) est de gravite MAJEUR car il valide INV-84-10 et CA-84-09. Les assertions sont precises et typees (pas de toBeTruthy() generique). L'isolation entre tests est correcte (beforeEach systematique, mocks reinitialises). Deux points mineurs de renforcement identifies.
Matrice de couverture¶
| TC-ID | Implemente | Fichier(s) | Commentaire |
|---|---|---|---|
| TC-01 | ✅ | folder.service.spec.ts | Creation FREE sous quota testee (0 et borne 2->3). Advisory lock verifie. |
| TC-02 | ✅ | folder.service.spec.ts | Refus 4e dossier + QUOTA_FOLDER_LIMIT_REACHED + HTTP 422 + upgrade_cta. |
| TC-03 | ✅ | folder-document.service.spec.ts | Borne 99->100 couverte. Attributs de scellement verifies (seal_ref, integrity, anchoring). |
| TC-04 | ✅ | folder-document.service.spec.ts | Refus 101e document + QUOTA_DOCUMENT_LIMIT_REACHED + upgrade_cta. Audit verifie. |
| TC-05 | ✅ | export.controller.spec.ts | FREE -> PREMIUM_REQUIRED (422) sur composite ET archive. PREMIUM -> 501 (stub PD-85). |
| TC-06 | ✅ | folder-response.dto.spec.ts, folder.service.spec.ts, freemium-nonreg.spec.ts | CTA "Disponible en Premium" + action=upgrade. Capabilities false pour FREE. Test API (pas UI visuel). |
| TC-07 | ✅ | folder.service.spec.ts, freemium-scenarios.spec.ts | Cloture ACTIVE->CLOSED_READ_ONLY + closedAt. Liberation slot via TC-LIM-03. |
| TC-08 | ✅ | folder-document.service.spec.ts | Ajout document sur dossier clos -> FOLDER_CLOSED_READ_ONLY (422). |
| TC-09 | ❌ | — | Pas de test explicite d'isolation quotas entre 2 comptes distincts (userId A sature, userId B cree librement). |
| TC-10 | ✅ | plan.service.spec.ts, freemium-scenarios.spec.ts | Upgrade FREE->PREMIUM : capabilities all true, premiumActivatedAt set, duration_ms. |
| TC-11 | ✅ | folder-document.service.spec.ts | Parite FREE/PREMIUM : meme structure, meme integrity_state, meme anchoring_state. |
| TC-12 | ✅ | freemium-scenarios.spec.ts | Quotas cumulatifs, pas de reset mensuel. Filtre par status=ACTIVE prouve. |
| TC-12-bis | ✅ | freemium-scenarios.spec.ts | closedAt immutable apres cloture (save non appele sur re-close). |
| TC-13 | ✅ | freemium-scenarios.spec.ts | 5 types d'audit verifies : FOLDER_CREATE, QUOTA_FOLDER_REFUSED, QUOTA_DOCUMENT_REFUSED, FOLDER_CLOSE, PLAN_CHANGE. |
| TC-14 | ✅ | freemium-scenarios.spec.ts | Parcours nominal 5 etapes : creer dossier, ajouter 2 docs, cloturer, relire. 0 erreur. |
| TC-15 | ✅ | freemium-scenarios.spec.ts | it.each parametrique MINOR/LEGAL_GUARDIAN/OTHER : meme quota FREE, meme bypass PREMIUM. |
| TC-16 | ✅ | create-folder.dto.spec.ts | Categorie invalide rejetee (validation class-validator). |
| TC-17 | ✅ | folder.service.spec.ts | Idempotence cloture : FOLDER_ALREADY_CLOSED (409). |
| TC-18 | ✅ | capability.service.spec.ts, freemium-scenarios.spec.ts | Capability calculee a la volee (objets differents), downgrade PREMIUM->FREE : all false. |
| TC-19 | ✅ | freemium-scenarios.spec.ts | Downgrade conserve 3 dossiers + documents. Refus creation 4e post-downgrade. Audit correct. |
| TC-LIM-01 | ✅ | folder.service.spec.ts | pg_advisory_xact_lock appele pour serialisation creation dossier. |
| TC-LIM-02 | ✅ | folder-document.service.spec.ts | pg_advisory_xact_lock appele pour serialisation ajout document. |
| TC-LIM-03 | ✅ | freemium-scenarios.spec.ts | Cloture au plafond (3 actifs) + reallocation slot (creation reussie apres). |
| TC-LIM-04 | ✅ | freemium-scenarios.spec.ts | FREE refus export -> upgrade PREMIUM -> export autorise (pas d'etat intermediaire). |
| TC-SLA-01 | ✅ | plan.service.spec.ts, freemium-scenarios.spec.ts | N=50 iterations, p95 mesure, < 1000ms en mocks. duration_ms tracke dans chaque resultat. |
| TC-SEC-01 | ✅ | folder-document.service.spec.ts | Parite cryptographique FREE/PREMIUM : meme structure de scellement. |
| TC-SEC-02 | ✅ | folder-owner.guard.spec.ts | Proprietaire autorise, non-proprietaire rejete 404 (neutre). |
| TC-SEC-03 | ✅ | folder-response.dto.spec.ts | Pas de champ content/proof/encrypted_data dans le DTO. |
| TC-SEC-04 | ✅ | freemium-scenarios.spec.ts | Audit evenements sensibles couvert via TC-13. |
| TC-SEC-05 | ✅ | folder.service.spec.ts, freemium-scenarios.spec.ts | Flux minimal FREE (creer + ajouter) realise sans erreur. |
| TC-10-bis | ✅ | plan-stub.guard.spec.ts | ENABLE_PLAN_STUB: undefined/false/1/TRUE -> 404. "true" -> autorise. |
Points a ameliorer¶
| ID | Description | Gravite | TC-ID |
|---|---|---|---|
| T-01 | Ajouter un test d'isolation quotas multi-comptes : creer un scenario avec 2 userId distincts (A sature a 3 dossiers actifs, B en cree librement). Valide INV-84-10 et CA-84-09. | MAJEUR | TC-09 |
| T-02 | Renforcer TC-11/TC-SEC-01 : les assertions de parite sont structurelles (meme cles, memes valeurs integrity/anchoring). Ajouter une verification que l'algorithme de hash est identique (ex: expect(freeResult.hash_algo).toBe(premiumResult.hash_algo)) si le champ est expose par le service. | MINEUR | TC-11 |
| T-03 | TC-06 test UI : le test couvre le contrat API (JSON capabilities + export_cta). Le rendu visuel (bouton grise, CTA) releve de ProbatioVault-app (hors perimetre backend). Non bloquant. | MINEUR | TC-06 |
Tests manquants¶
- TC-09 : Test explicite d'isolation quotas entre comptes (2 userId distincts, actions de l'un n'affectent pas les compteurs de l'autre). INV-84-10, CA-84-09.
Analyse qualitative¶
Qualite des assertions¶
Les assertions sont precises et typees dans l'ensemble de la suite :
- Pas de
toBeTruthy()generique. Les tests utilisenttoBe(),toEqual(),toBeInstanceOf(),toMatch(). - Les codes d'erreur sont verifies via
getCode()(string exact), pas seulement l'exception. - Les statuts HTTP sont verifies explicitement (422, 409, 404, 500, 501).
- Les metadata d'audit sont verifiees en detail (actorId, actionType, entityType, metadata.plan, metadata.active_count, etc.).
- Les CTA sont verifiees jusqu'au champ
actionettext.
Isolation et independance¶
- Chaque
describeutilisebeforeEachavec reinitialisation complete des mocks. - Pas de dependance inter-tests observee.
- Les scenarios (
freemium-scenarios.spec.ts) reinitialise les mocks entre chaque etape viamockResolvedValue/mockClear. - Le
dataSource.transactionest mocke proprement avec callback synchrone.
Edge cases couverts¶
- Bornes : 0, 2, 3 dossiers actifs ; 99, 100 documents.
- Cas negatifs : user not found, folder not found, closed folder, quota atteint.
- Idempotence : cloture double -> 409.
- Enum strictness : PlanStubGuard rejette "1", "TRUE", accepte uniquement "true".
- Display_name : 255 chars (borne exacte), 256 chars (rejete), vide (rejete).
- Plan_type : "INVALID" rejete, missing rejete.
- Unknown plan -> non-premium (degradation gracieuse).
Non-regression¶
Le fichier freemium-nonreg.spec.ts couvre : - Stabilite des enums (valeurs exactes + cardinalite). - Completude des 8 codes d'erreur + mapping HTTP + messages. - Contrat CTA frontend (texte exact "Disponible en Premium"). - Unidirectionnalite des etats (2 etats seulement).
Points forts¶
- Tracabilite : chaque test est annote avec le TC-ID contractuel en commentaire.
- Parametrique :
it.eachpour tester les 3 accountRole (TC-15). - Performance : TC-SLA-01 mesure reellement le p95 sur N=50.
- Defense en profondeur : PLAN_STATE_INCONSISTENT teste avec timeout 0ms + audit sla_breach.
- Non-regression : fichier dedie pour invariants structurels (enums, codes, contrats).