TEST_ROADMAP.md
Rama main · réplica de lectura del repositorio original.
# 🧪 Jambo API — Feuille de Route Complète des Tests (Test Roadmap)
> **Version cible du document :** Jambo API v1.20.0+ (Cycle v1.x Enterprise)
> **Dernière mise à jour :** Octobre 2026
> **Statut global :** En cours d'exécution — 503 tests PHPUnit répertoriés, suites E2E Playwright intégrées.
---
## 📑 Sommaire
1. [Vision & Philosophie de Test](#1-vision--philosophie-de-test)
2. [Matrice Pyramidale & Objectifs de Couverture](#2-matrice-pyramidale--objectifs-de-couverture)
3. [État des Lieux & Audit de Couverture Actuel](#3-état-des-lieux--audit-de-couverture-actuel)
4. [Stratégie de Versionnement Git (v1.*.*) & Triggers de Push](#4-stratégie-de-versionnement-git-v1---triggers-de-push)
5. [Phasage Détaillé du Test Roadmap & Tags Associés](#5-phasage-détaillé-du-test-roadmap--tags-associés)
- [Phase T1 (v1.20.1) : Moteur EAV & Intégrité du Contenu](#phase-t1-v1201--moteur-eav--intégrité-du-contenu)
- [Phase T2 (v1.21.0) : Sécurité, Authentification & Autorisations](#phase-t2-v1210--sécurité-authentification--autorisations)
- [Phase T3 (v1.21.1) : Admin REST API & Public REST API](#phase-t3-v1211--admin-rest-api--public-rest-api)
- [Phase T4 (v1.22.0) : Moteur GraphQL Dynamique & Temps Réel (Mercure)](#phase-t4-v1220--moteur-graphql-dynamique--temps-réel-mercure)
- [Phase T5 (v1.23.0) : Médias, Upload Direct S3/R2 & Stockage](#phase-t5-v1230--médias-upload-direct-s3r2--stockage)
- [Phase T6 (v1.24.0) : Moteur Flow, Automations & Assistant IA SSE](#phase-t6-v1240--moteur-flow-automations--assistant-ia-sse)
- [Phase T7 (v1.24.1) : Formulaires, SEO, Redirections & Blueprints](#phase-t7-v1241--formulaires-seo-redirections--blueprints)
- [Phase T8 (v1.25.0) : Tests E2E Interface Studio (Playwright)](#phase-t8-v1250--tests-e2e-interface-studio-playwright)
- [Phase T9 (v1.25.1) : Performance, Concurrence & Audit de Sécurité](#phase-t9-v1251--performance-concurrence--audit-de-sécurité)
- [Phase T10 (v1.26.0) : Pipeline CI/CD & Smoke Tests Production](#phase-t10-v1260--pipeline-cicd--smoke-tests-production)
6. [Cahier de Recette Exécutable & Commandes](#6-cahier-de-recette-exécutable--commandes)
- [Procédure Standard de Tagging & Push Git](#procédure-standard-de-tagging--push-git)
7. [Tableau de Bord & Critères de Validation](#7-tableau-de-bord--critères-de-validation)
---
## 1. Vision & Philosophie de Test
Jambo API est un CMS Headless découplé, multi-tenant et composable servant à la fois des API REST critiques, un endpoint GraphQL introspectif dynamique, des flux de streaming IA (SSE), un système de stockage objet S3/R2, et un Studio d'administration React/Inertia.
La résilience de la plateforme repose sur 4 piliers de test fondamentaux :
1. **Intégrité stricte des données EAV** : Aucune corruption de schéma, collision d'unicité (slug, locale) ou régression de relation ne doit survenir lors des opérations CRUD, y compris en cas de soft-delete ou de requêtes partielles `PATCH`.
2. **Cloisonnement multi-tenant & Sécurité hermétique** : Élimination absolue des failles IDOR (*Insecure Direct Object References*) entre projets, contrôle strict des portées de jetons (PAT, ApiToken, OAuth2 PKCE), et protection proactive contre les attaques par force brute.
3. **Parité fonctionnelle REST / GraphQL** : Les règles de validation, filtres, tris et résolutions de relations doivent produire des résultats strictement identiques quel que soit le protocole de consommation.
4. **Non-régression des flux asynchrones & streaming** : Les processus longs (téléversements S3 fragmentés, files Messenger, workflows Flow et SSE IA) doivent disposer de filets de sécurité garantissant une reprise sur incident sans blocage de ressources PHP.
---
## 2. Matrice Pyramidale & Objectifs de Couverture
```
/\
/ \ Tests E2E Studio (Playwright)
/ E2E\ Cible : 100% des parcours critiques d'édition
/------\
/ API \ Tests Fonctionnels d'Intégration (REST & GraphQL)
/ & HTTP \ Cible : > 90% des endpoints et codes HTTP
/------------\
/ Services & \ Tests d'Intégration Métier & ORM
/ Subscribers \ Cible : > 85% de couverture des services
/------------------\
/ Unitaires & \ Tests Unitaires Purs (Entités, Helpers, Enums)
/ Normaliseurs \ Cible : > 95% de couverture
/------------------------\
```
| Niveau | Outil | Rôle Principal | SLA Exécution | Couverture Cible |
| :--- | :--- | :--- | :---: | :---: |
| **Unitaires** | PHPUnit 13 | Entités, Enums, DTOs, Helpers, résolveurs purs | < 5 sec | 95% |
| **Intégration** | PHPUnit + Symfony Kernel | ORM Doctrine, Services métier, Normaliseurs, Flow | < 30 sec | 85% |
| **Fonctionnels API** | PHPUnit BrowserKit / WebTestCase | Endpoints `/admin-api/`, `/api/v1/`, GraphQL | < 60 sec | 90% |
| **E2E UI** | Playwright | Studio React, navigation, formulaires, AI Toolbar | < 3 min | Parcours clés |
| **Sécurité & Fuzzing** | PHPUnit + Scénarios cURL | IDOR, Lockout, CSRF, Injections SQL/JSON, CORS | < 1 min | 100% auth/RBAC |
| **Charge & Stress** | k6 / wrk | Débit REST, requêtes EAV complexes, saturation DB | À la release | > 500 req/s |
---
## 3. État des Lieux & Audit de Couverture Actuel
### 3.1 Inventaire Existant (v1.20.0)
* **Suite PHPUnit :** 503 tests répartis dans 94 classes de tests (`tests/Entity`, `tests/Service`, `tests/Controller`, `tests/Command`, `tests/GraphQL`, `tests/Security`).
* **Suite Playwright :** Spécifications initiales dans `e2e/api.spec.ts`, `e2e/auth.spec.ts`, `e2e/dashboard.spec.ts`.
* **API Documentation :** Spécification OpenAPI / Swagger UI synchronisée pour Public API et Admin API (`/api/docs`).
### 3.2 Vulnérabilités & Écarts Identifiés lors de l'Audit v1.20
* ⚠️ **Gestion des Slugs et Soft Deletes :** L'index d'unicité `UNIQ_COLLECTION_SLUG_LOCALE` porte sur toutes les lignes physiques. La génération automatique doit systématiquement tester l'unicité y compris contre les entrées supprimées (`deleted_at IS NOT NULL`).
* ⚠️ **Validation partielle `PATCH` :** Les champs obligatoires non transmis dans un payload `PATCH` ne doivent pas déclencher d'erreur de validation "requis".
* ⚠️ **Cycle de vie Multipart S3 :** Les phases d'abandon (`abortMultipart`) et de timeout d'expiration d'intent nécessitent des tests d'isolation avec simulation d'échec réseau.
* ⚠️ **Résilience des Workers Messenger & Crons :** Vérification de l'idempotence des commandes de publication planifiée (`jambo:content:publish-scheduled`) en environnement d'hébergement mutualisé.
---
## 4. Stratégie de Versionnement Git (v1.*.*) & Triggers de Push
> ⚠️ **Directive Fondamentale de Versionnement :** Le cycle actuel de Jambo API est strictement borné à la version majeure **v1** (`v1.*.*`). La version 2 n'est **pas encore envisageable** à ce stade du cycle produit. Tous les tags créés et poussés (`git push origin <tag>`) doivent respecter strictement les spécifications SemVer au sein de la branche `v1.x.y` :
> - **Patch releases (`v1.20.x`, `v1.21.x`, `v1.24.x`, etc.) :** Résolution de bugs critiques, corrections de régression, durcissement des validations sans rupture d'API.
> - **Minor releases (`v1.21.0`, `v1.22.0`, `v1.23.0`, `v1.24.0`, `v1.25.0`, `v1.26.0`) :** Livraisons de modules complets testés et stabilisés, ajout de nouvelles suites d'API ou d'intégrations E2E backward-compatible.
### 4.1 Matrice d'Évolution des Tags Git (`v1.*.*`) par Phase de Test
| Phase de Test | Tag Git Cible | Type SemVer | Milestone Fonctionnelle | Quality Gate (Critère de Validation du Tag) | Déclencheur du Push (`git push`) |
| :--- | :---: | :---: | :--- | :--- | :--- |
| **Phase T1** | `v1.20.1` | Patch | Intégrité EAV, Slugs & Patch | 100% tests d'unicité slugs (avec soft-delete), cast EAV et validation `PATCH` au vert | Après validation de la suite `tests/Entity` et `ContentControllerTest` |
| **Phase T2** | `v1.21.0` | Mineure | Sécurité, Auth PAT & OAuth2 | Tests PAT HMAC-SHA256, isolation IDOR, lockout anti-bruteforce et OAuth2 PKCE validés | Après exécution complète de `tests/Security` et `AdminApiSecurityTest` |
| **Phase T3** | `v1.21.1` | Patch | Admin & Public REST API | Swagger UI `/api/docs` synchronisé, formatage RFC 7807 et filtres avancés conformes | Après validation de `tests/Controller/AdminApi` et `Api` |
| **Phase T4** | `v1.22.0` | Mineure | GraphQL Dynamique & Mercure | Pas de requêtes N+1, limiteurs de profondeur/complexité actifs, SSE Mercure opérationnel | Après succès de `SchemaGeneratorTest` et `RealtimeControllerTest` |
| **Phase T5** | `v1.23.0` | Mineure | Upload Direct S3 & Médias | Cycle complet S3 multipart (intent, sign, complete, abort) et assainissement SVG validés | Après succès de `DirectUploadServiceTest` et tests de stockage |
| **Phase T6** | `v1.24.0` | Mineure | Moteur Flow & IA Streaming | DAG sans boucles infinies, streaming SSE sans fuite mémoire, audit des déclencheurs validé | Après validation de `FlowInterpreterTest` et `ContentAiStreamControllerTest` |
| **Phase T7** | `v1.24.1` | Patch | Formulaires, SEO & Blueprints | Pot-de-miel anti-spam, détection de boucles de redirection et roundtrip import/export ZIP parfaits | Après validation de `SubmitHandlerTest`, `RedirectChainDetectorTest` et `BlueprintCommandsTest` |
| **Phase T8** | `v1.25.0` | Mineure | Studio E2E (Playwright) | 100% des scénarios E2E Studio passants (auth, édition de blocs, navigation, publication) | Après validation de `npm run test:e2e` en headless CI |
| **Phase T9** | `v1.25.1` | Patch | Performance & Audit OWASP | Débit REST > 500 req/s (p95 < 120ms), zéro alerte critique sur l'audit de sécurité OWASP | Après benchmark k6 et revue des entêtes de sécurité |
| **Phase T10**| `v1.26.0` | Mineure | CI/CD & Recette Production | Pipeline GitHub Actions automatisé au vert, smoke tests 100% réussis sur `api.jambostack.site` | Déploiement production final et vérification live |
---
## 5. Phasage Détaillé du Test Roadmap & Tags Associés
### Phase T1 (v1.20.1) : Moteur EAV & Intégrité du Contenu
* **Tag Git Associé :** `v1.20.1` (Patch release)
* **Commande de Push :** `git tag -a v1.20.1 -m "release: v1.20.1 - EAV slug uniqueness & partial PATCH validation fixes" && git push origin v1.20.1`
* **Quality Gate :** 0 erreur sur l'unicité des slugs avec soft-deletes, hydratation et validation partielle `PATCH`.
**Objectif :** Garantir que le modèle EAV dynamique préserve l'intégrité relationnelle, le typage des valeurs et l'unicité des accès publics.
#### Périmètre des Classes Cibles
* Entités : `ContentEntry`, `ContentFieldValue`, `ContentFieldGroup`, `Collection`, `Field`, `ContentVersion`.
* Services : `EavDataFormatterService`, `EavFieldHelperService`, `FieldValueHydrator`, `FieldConditionEvaluator`, `VersioningService`.
* Contrôleurs : `App\Controller\Api\ContentController`, `App\Controller\ContentController`.
#### Cas de Test Prioritaires
- [ ] **T1.1 — Collision de Slugs & Soft Delete :**
- Créer une entrée avec slug `mon-article`.
- Supprimer (soft-delete) l'entrée (`deleted_at` renseigné).
- Créer une seconde entrée avec le même titre ou slug `mon-article`.
- *Attendu :* Attribution automatique du slug `mon-article-1` sans lever d'exception SQL 1062.
- [ ] **T1.2 — Validation Partielle sur Requête `PATCH` :**
- Mettre à jour uniquement le statut ou un champ optionnel via `PATCH`.
- *Attendu :* Succès 200 OK même si les autres champs requis ne figurent pas dans le corps de requête.
- [ ] **T1.3 — Groupes de Champs Relationnels (`ContentFieldGroup`) :**
- Enregistrer un repeater contenant 3 blocs avec valeurs imbriquées.
- Réordonner les blocs (`sort_order`).
- *Attendu :* Persistance fidèle des relations `groupInstance` et indexation SQL correcte.
- [ ] **T1.4 — Typage & Cast des Attributs EAV :**
- Vérifier la persistance et l'hydratation des types : `text`, `number`, `boolean`, `date`, `datetime`, `json`, `markdown`, `media`.
- [ ] **T1.5 — Versioning & Restauration :**
- Modifier une entrée 3 fois consécutives.
- Vérifier la création de 3 instances `ContentVersion`.
- Restaurer la version 1 et valider le rétablissement exact des valeurs EAV.
---
### Phase T2 (v1.21.0) : Sécurité, Authentification & Autorisations
* **Tag Git Associé :** `v1.21.0` (Mineure)
* **Commande de Push :** `git tag -a v1.21.0 -m "release: v1.21.0 - Personal Access Tokens HMAC-SHA256, IDOR multi-tenant isolation, anti-bruteforce lockout & OAuth2 PKCE" && git push origin v1.21.0`
* **Quality Gate :** 100% de succès sur `AdminApiSecurityTest`, isolation stricte inter-projets et révocabilité immédiate des sessions.
**Objectif :** Valider l'étanchéité des différents mécanismes d'accès, des jetons administratifs et des sessions utilisateurs.
#### Périmètre des Classes Cibles
* Entités : `User`, `PersonalAccessToken`, `ApiToken`, `ProjectAuthClient`, `ProjectAuthRefreshToken`, `ProjectAuthSession`.
* Services : `ProjectOAuthService`, `EndUserJwtService`, `ProjectAuthLockoutService`, `TwoFactorService`, `SocialLoginService`.
* Sécurité : `AdminApiSecurityTest`, `OidcAuthenticator`.
#### Cas de Test Prioritaires
- [ ] **T2.1 — Personal Access Tokens (PAT) Admin API :**
- Génération via CLI `bin/console jambo:pat:create --user=admin@example.com --scope=admin`.
- Hachage HMAC-SHA256 en base (`token_hash`) ; affichage en clair une seule fois (`jbo_pat_...`).
- Requête `GET /admin-api/projects` avec en-tête `Authorization: Bearer jbo_pat_...`.
- *Attendu :* 200 OK avec payload JSON.
- [ ] **T2.2 — Révocation & Expiration des Jetons PAT :**
- Tester un PAT expiré (`expires_at < NOW()`).
- Tester un PAT révoqué via `DELETE /admin-api/tokens/{id}`.
- *Attendu :* 401 Unauthorized avec message clair `Token expired or revoked`.
- [ ] **T2.3 — Isolation Multi-Tenant (Protection IDOR) :**
- Projet A (Propriétaire Utilisateur 1) et Projet B (Propriétaire Utilisateur 2).
- Tenter d'accéder aux collections du Projet B avec le jeton du Projet A.
- *Attendu :* 403 Forbidden ou 404 Not Found strict. Aucune fuite d'informations.
- [ ] **T2.4 — Protection Anti-Bruteforce & Lockout :**
- Exécuter 5 tentatives consécutives de connexion avec mot de passe erroné.
- *Attendu :* Déclenchement du verrouillage 15 minutes (`429 Too Many Requests` ou rejet avec délai).
- [ ] **T2.5 — Flux OAuth2 Client (RFC 6749 + PKCE) :**
- Échange du code d'autorisation avec vérification du challenge PKCE (`code_verifier` / `code_challenge`).
- Émission et renouvellement du Refresh Token.
- Révocation de session unitaire.
---
### Phase T3 (v1.21.1) : Admin REST API & Public REST API
* **Tag Git Associé :** `v1.21.1` (Patch release)
* **Commande de Push :** `git tag -a v1.21.1 -m "release: v1.21.1 - REST API RFC 7807 compliance, collection filtering & OpenAPI synchronization" && git push origin v1.21.1`
* **Quality Gate :** Swagger UI `/api/docs` 100% aligné, pagination et conformité des codes d'erreurs HTTP (200, 401, 403, 404, 422).
**Objectif :** Assurer la conformité des contrats d'interface, des codes d'état HTTP, du filtrage avancé et de la pagination.
#### Périmètre des Classes Cibles
* Contrôleurs Admin API : `App\Controller\AdminApi\ProjectController`, `CollectionController`, `FieldController`, `TokenController`, `PingController`.
* Contrôleurs Public API : `App\Controller\Api\ContentController`, `CollectionController`, `ProjectInfoController`, `SeoController`.
#### Cas de Test Prioritaires
- [ ] **T3.1 — Endpoint Santé & Diagnostic :**
- `GET /admin-api/_ping` avec PAT valide -> `{"status":"ok","timestamp":...,"version":"1.20.0"}`.
- [ ] **T3.2 — CRUD Complet de Schéma via API :**
- Créer un projet -> Créer une collection -> Créer 5 champs de types distincts.
- Supprimer un champ avec cascade propre sur les valeurs EAV orphelines.
- [ ] **T3.3 — Moteur de Recherche & Filtrage Avancé Public API :**
- `GET /api/v1/projects/{id}/collections/{slug}/content?filter[prix][gte]=100&filter[status]=published&sort=-createdAt&limit=10&page=1`.
- Valider l'exactitude des résultats et des méta-données de pagination (`total`, `page`, `pages`, `limit`).
- [ ] **T3.4 — Accès Direct par Slug :**
- `GET /api/v1/projects/{id}/collections/{slug}/content/by-slug/{entry-slug}`.
- Tester les cas : entrée publiée (200), entrée brouillon (404 sans preview token, 200 avec preview token valide), slug inexistant (404).
- [ ] **T3.5 — Formatage RFC 7807 des Erreurs :**
- Soumettre un JSON invalide ou un champ typé incorrectement.
- *Attendu :* Réponse HTTP 422 avec structure d'erreur standardisée (`type`, `title`, `detail`, `violations`).
---
### Phase T4 (v1.22.0) : Moteur GraphQL Dynamique & Temps Réel (Mercure)
* **Tag Git Associé :** `v1.22.0` (Mineure)
* **Commande de Push :** `git tag -a v1.22.0 -m "release: v1.22.0 - GraphQL dynamic schema security (query depth limits) & Mercure SSE real-time broadcast" && git push origin v1.22.0`
* **Quality Gate :** Aucune régression N+1 requêtes sur les résolutions imbriquées, rejet strict des requêtes cycliques et diffusion Mercure confirmée.
**Objectif :** Valider la génération dynamique du schéma GraphQL typé et la distribution temps réel des mutations de contenu.
#### Périmètre des Classes Cibles
* `App\GraphQL\SchemaGenerator`, `App\Controller\GraphQLController`.
* `App\Service\MercurePublisher`, `App\Controller\RealtimeController`.
#### Cas de Test Prioritaires
- [ ] **T4.1 — Introspection Dynamique du Schéma GraphQL :**
- Définir une collection `Articles` avec des champs spécifiques.
- Exécuter une requête d'introspection `__schema` sur `/api/v1/projects/{id}/graphql`.
- *Attendu :* Types `Article`, `ArticleFilterInput`, `ArticleSortInput` correctement exposés.
- [ ] **T4.2 — Requêtes avec Résolution de Relations Imbriquées :**
- Requête d'un article avec son auteur (relation `User`), ses catégories (relation ManyToMany) et ses images média.
- *Attendu :* Pas de problème N+1 requêtes en base ; résultat JSON structuré conforme.
- [ ] **T4.3 — Protection contre les Requêtes Abusives (Sécurité GraphQL) :**
- Tester la limitation de profondeur de requête (Query Depth Limiter, max 6 niveaux).
- Tester la limitation de complexité (Query Complexity Limiter).
- *Attendu :* Rejet explicite des requêtes circulaires ou récursives.
- [ ] **T4.4 — Diffusion d'Événements Mercure SSE :**
- Mutation d'une entrée de contenu via API.
- *Attendu :* Émission d'un payload vers le Hub Mercure avec le topic `https://jambostack.site/projects/{id}/collections/{name}` et JWT valide.
---
### Phase T5 (v1.23.0) : Médias, Upload Direct S3/R2 & Stockage
* **Tag Git Associé :** `v1.23.0` (Mineure)
* **Commande de Push :** `git tag -a v1.23.0 -m "release: v1.23.0 - Cloudflare R2 / AWS S3 direct multipart upload lifecycle & SVG sanitization" && git push origin v1.23.0`
* **Quality Gate :** Succès du cycle complet (single put, multi-part, abort, complete) et assainissement XSS des fichiers SVG.
**Objectif :** Certifier le pipeline de stockage cloud direct, le découpage multipart et la sécurisation des fichiers téléversés.
#### Périmètre des Classes Cibles
* Entités : `Media`, `MediaFolder`, `AssetUploadIntent`, `ProjectStorageProfile`.
* Services : `DirectUploadService`, `TusServer`, `ImageTransformService`, `StorageDriverFactory`.
* Contrôleurs : `DirectUploadController`, `MediaController`, `TusController`.
#### Cas de Test Prioritaires
- [ ] **T5.1 — Initialisation d'Intent d'Upload Direct (Single PUT) :**
- Appel `POST /api/v1/projects/{id}/media/direct-upload/intent` avec taille < 5MB.
- *Attendu :* Création de l'entité `AssetUploadIntent`, retour de l'URL pré-signée S3 avec expiration 15 min.
- [ ] **T5.2 — Upload Direct Multipart S3 / R2 (Fichiers volumineux > 100MB) :**
- Initialisation multipart -> Récupération de l'ID multipart AWS.
- Signature individuelle des parts 1, 2, 3 via `/multipart/sign-part`.
- Finalisation `/complete` avec vérification de la création de l'entité `Media`.
- [ ] **T5.3 — Abandon & Nettoyage d'Upload :**
- Appel `/abort` en cours de téléversement.
- *Attendu :* Annulation auprès du bucket S3 et suppression de l'intent orphelin.
- [ ] **T5.4 — Sécurité des Téléversements :**
- Tentative de téléversement d'un script malveillant (.php, .phtml, .sh, .phar) déguisé en image.
- Fichier SVG contenant des balises `<script>` (XSS).
- *Attendu :* Rejet 422, assainissement SVG automatique et validation MIME stricte côté serveur.
- [ ] **T5.5 — Redimensionnement & Cache d'Images Dynamique :**
- Requête d'image avec paramètres `?w=300&h=200&fit=crop&fm=webp`.
- *Attendu :* Transformation à la volée, génération du cache optimisé et en-têtes `Cache-Control`.
---
### Phase T6 (v1.24.0) : Moteur Flow, Automations & Assistant IA SSE
* **Tag Git Associé :** `v1.24.0` (Mineure)
* **Commande de Push :** `git tag -a v1.24.0 -m "release: v1.24.0 - Flow DAG interpreter, loop cycle detection & resilient AI inline SSE stream" && git push origin v1.24.0`
* **Quality Gate :** Interdiction des boucles infinies de flux, streaming SSE sans fuite mémoire et audit d'exécution complet.
**Objectif :** Tester la robustesse du moteur d'exécution visuel de flux, la gestion des erreurs de noeuds et le streaming IA.
#### Périmètre des Classes Cibles
* Services Flow : `FlowInterpreter`, `FlowValidator`, `NodeRegistry`, Noeuds (`Trigger`, `Action`, `Logic`, `Ai`, `Transform`).
* Contrôleur IA : `ContentAiStreamController`.
#### Cas de Test Prioritaires
- [ ] **T6.1 — Déclencheur Événementiel `ContentCreated` -> Action `SendEmail` :**
- Création d'une entrée déclenchant un Flow.
- *Attendu :* Interprétation sans blocage, envoi simulé d'email tracé dans `EmailLog`.
- [ ] **T6.2 — Nœuds Logiques Conditionnels (`ConditionHandler`, `SwitchHandler`) :**
- Exécution d'un Flow avec embranchement selon la valeur d'un champ (`status == 'urgent'`).
- *Attendu :* Seule la branche valide est exécutée, sans effets secondaires sur l'autre branche.
- [ ] **T6.3 — Détection des Boucles Infinies dans les Flux :**
- Soumettre un graphe de flux contenant une boucle récursive fermée.
- *Attendu :* Rejet dès la validation par `FlowValidator` avant toute persistance.
- [ ] **T6.4 — Streaming SSE Assistant IA (`ContentAiStreamController`) :**
- Appel `POST /admin/api/content-ai/stream` avec action `summarize`.
- *Attendu :* Flux `text/event-stream` continu avec fragments partiels et événement final `[DONE]`.
- Gestion des coupures de connexion client sans fuite de mémoire PHP.
---
### Phase T7 (v1.24.1) : Formulaires, SEO, Redirections & Blueprints
* **Tag Git Associé :** `v1.24.1` (Patch release)
* **Commande de Push :** `git tag -a v1.24.1 -m "release: v1.24.1 - Anti-spam form protection, redirect loop detection & blueprint import/export roundtrip" && git push origin v1.24.1`
* **Quality Gate :** 0 boucle de redirection non détectée, blocage absolu du spam par pot-de-miel et parité 100% sur les exports/imports ZIP.
**Objectif :** Valider les fonctionnalités publiques front-facing, la détection des boucles de redirection et la portabilité des templates.
#### Périmètre des Classes Cibles
* `FormPublicController`, `AntiSpamService`, `SubmitHandler`.
* `RedirectResolver`, `RedirectChainDetector`.
* `SeoAnalyzer`, `SitemapGenerator`, `StructuredDataGenerator`.
* `ProjectExporter`, `ProjectImporter`, `BlueprintCommandsTest`.
#### Cas de Test Prioritaires
- [ ] **T7.1 — Soumission de Formulaire Public & Anti-Spam :**
- Soumission avec champ pot-de-miel (honeypot) renseigné -> rejet silencieux ou 422.
- Soumission valide -> création d'un `FormSubmission` et notification éventuelle.
- [ ] **T7.2 — Résolution de Redirections & Détection de Boucles :**
- Configurer `/a -> /b`, `/b -> /c`, `/c -> /a`.
- *Attendu :* Détection immédiate du cycle par `RedirectChainDetector` et blocage de la saisie.
- Redirection simple `/old-page` -> 301 Moved Permanently vers `/new-page`.
- [ ] **T7.3 — Génération Sitemap XML & Balises Hreflang :**
- Validation du flux XML généré contre le schéma standard Google Sitemap.
- Vérification de la présence des balises `<xhtml:link rel="alternate" hreflang="..." />` pour les contenus multilingues.
- [ ] **T7.4 — Export / Import de Blueprints & Projets (Roundtrip Test) :**
- Export d'un projet complet avec schémas, validations et profils via `jambo:project:export`.
- Import dans une base neuve via `jambo:project:import`.
- *Attendu :* 100% de concordance structurelle et de métadonnées.
---
### Phase T8 (v1.25.0) : Tests E2E Interface Studio (Playwright)
* **Tag Git Associé :** `v1.25.0` (Mineure)
* **Commande de Push :** `git tag -a v1.25.0 -m "release: v1.25.0 - Studio E2E test suite integration & UI regression suite" && git push origin v1.25.0`
* **Quality Gate :** 100% des tests Playwright passants (aucun échec UI, formulaires et navigation réactifs).
**Objectif :** Vérifier que l'interface utilisateur web (React + Inertia + TypeScript) réagit fidèlement aux interactions utilisateur.
#### Fichiers de Tests Cibles
* `e2e/auth.spec.ts` : Connexion, 2FA, Déconnexion, Réinitialisation mot de passe.
* `e2e/dashboard.spec.ts` : Navigation, sélecteur de projet, statistiques d'utilisation.
* `e2e/content-editor.spec.ts` : Création et modification de contenu, saisie dans l'éditeur de blocs, prévisualisation en direct.
* `e2e/schema-builder.spec.ts` : Ajout de collections, création de champs par glisser-déposer, configuration des validations.
#### Scénarios d'Exécution Playwright
```typescript
// Exemple de flux critique dans e2e/content-editor.spec.ts
test('Création d\'un article complet avec réordonnancement de blocs et publication', async ({ page }) => {
await loginAsAdmin(page);
await page.goto('/projects/demo/collections/articles/new');
await page.fill('input[name="title"]', 'Nouvel article Playwright');
await expect(page.locator('input[name="slug"]')).toHaveValue('nouvel-article-playwright');
// Ajout d'un bloc repeater
await page.click('button:has-text("Ajouter un bloc")');
await page.fill('textarea[name="blocks[0].content"]', 'Contenu du bloc 1');
// Sauvegarde brouillon puis publication
await page.click('button:has-text("Enregistrer")');
await expect(page.locator('.toast-success')).toBeVisible();
await page.click('button:has-text("Publier")');
await expect(page.locator('.badge-published')).toBeVisible();
});
```
---
### Phase T9 (v1.25.1) : Performance, Concurrence & Audit de Sécurité
* **Tag Git Associé :** `v1.25.1` (Patch release)
* **Commande de Push :** `git tag -a v1.25.1 -m "release: v1.25.1 - Performance optimization & OWASP security hardening" && git push origin v1.25.1`
* **Quality Gate :** Débit > 500 req/s sous charge, p95 < 120ms, 0 vulnérabilité OWASP critique.
**Objectif :** Éprouver le système sous forte charge et valider sa résistance aux attaques informatiques.
#### 1. Tests de Charge (Benchmarks k6 / wrk)
* **Scénario Lecture Publique :** 200 utilisateurs virtuels concurrents sur `GET /api/v1/projects/{id}/collections/articles/content`.
- *Seuil de tolérance :* Temps de réponse médian < 40ms, p95 < 120ms, taux d'erreur 0.00%.
* **Scénario Écriture Concurrente :** 50 utilisateurs virtuels injectant du contenu simultanément.
- *Seuil de tolérance :* Aucune collision de verrous base de données (deadlocks) ; gestion sans faille des transactions Doctrine.
#### 2. Audit de Sécurité Automatisé (OWASP Top 10)
- [ ] **Injections SQL & NoSQL :** Fuzzing systématique des paramètres de tri et de filtrage (`order`, `where`, `filter`).
- [ ] **Cross-Site Scripting (XSS) :** Assainissement des champs `rich_text` et des valeurs affichées dans le Studio.
- [ ] **En-têtes de Sécurité HTTP :** Présence systématique de `X-Content-Type-Options: nosniff`, `X-Frame-Options: SAMEORIGIN`, et politique `Content-Security-Policy` adaptée.
- [ ] **Rate Limiting :** Vérification de l'application stricte des quotas sur les routes d'authentification (`/login`, `/oauth/token`).
---
### Phase T10 (v1.26.0) : Pipeline CI/CD & Smoke Tests Production
* **Tag Git Associé :** `v1.26.0` (Mineure de consolidation)
* **Commande de Push :** `git tag -a v1.26.0 -m "release: v1.26.0 - Automated CI/CD pipeline & live production verification suite" && git push origin v1.26.0`
* **Quality Gate :** Pipeline GitHub Actions 100% vert sur PHP 8.4 + MySQL 8.0, smoke tests réussis sur `https://api.jambostack.site`.
**Objectif :** Automatiser les vérifications à chaque commit et disposer d'un scénario de recette immédiat après déploiement.
#### 1. Workflow GitHub Actions (`.github/workflows/ci.yml`)
```yaml
name: Jambo API Quality & Test Suite
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
backend-tests:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.0
env:
MYSQL_DATABASE: jamboapicms_test
MYSQL_ROOT_PASSWORD: root
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3
steps:
- uses: actions/checkout@v4
- name: Setup PHP 8.4
uses: shivammathur/setup-php@v2
with:
php-version: '8.4'
extensions: mbstring, xml, ctype, iconv, intl, pdo_mysql, zip, gd
coverage: none
- name: Install Composer Dependencies
run: composer install --prefer-dist --no-progress -q
- name: Validate Doctrine Schema
run: php bin/console doctrine:schema:validate --skip-sync
- name: Run PHPUnit Test Suite
run: vendor/bin/phpunit --no-progress
```
#### 2. Smoke Tests de Recette Post-Déploiement (Production)
Script exécutable à chaque livraison sur `api.jambostack.site` :
- Vérification du code HTTP 200 sur la racine et le Swagger `/api/docs`.
- Authentification PAT sur `GET /admin-api/_ping`.
- Requête test sur la collection publique de démonstration.
- Vérification de l'état de la file Messenger (`bin/console messenger:failed:show`).
---
## 6. Cahier de Recette Exécutable & Commandes
### 6.1 Commandes d'Exécution Rapide (Développeur)
```bash
# 1. Lancer uniquement les tests unitaires (rapides, sans base)
vendor/bin/phpunit tests/Entity tests/Enum tests/Service/Flow --no-progress
# 2. Lancer les tests d'authentification et de sécurité
vendor/bin/phpunit tests/Security tests/Controller/AdminApiSecurityTest.php --no-progress
# 3. Lancer la validation complète des commandes CLI
vendor/bin/phpunit tests/Command --no-progress
# 4. Lancer les tests E2E Playwright
npm run test:e2e
```
### 6.2 Scénarios cURL de Validation Production
```bash
# 1. Vérification de la disponibilité et version
curl -s -i https://api.jambostack.site/ | grep "HTTP/2 200"
# 2. Test du Ping Admin API avec Personal Access Token
curl -s -X GET https://api.jambostack.site/admin-api/_ping \
-H "Authorization: Bearer jbo_pat_YOUR_SECRET_TOKEN" \
-H "Accept: application/json"
# 3. Test de récupération de contenu par Slug
curl -s -X GET "https://api.jambostack.site/api/v1/projects/YOUR_PROJECT_ID/collections/articles/content/by-slug/bienvenue" \
-H "Accept: application/json"
```
### 6.3 Procédure Standard de Tagging & Push Git (Cycle v1.*.*)
Pour chaque phase de test complétée, le processus de versionnement et de livraison doit suivre ce protocole strict :
```bash
# Étape 1 : S'assurer que le working tree est 100% propre
git status --short
# Étape 2 : Exécuter la suite de tests requise par la phase
vendor/bin/phpunit --no-progress
# Étape 3 : Créer le tag Git annoté correspondant strictement au cycle v1.*.*
# Exemple pour la Phase T1 :
git tag -a v1.20.1 -m "release: v1.20.1 - EAV slug uniqueness & partial PATCH validation fixes"
# Étape 4 : Pousser les commits et le nouveau tag sur le dépôt distant GitHub
git push origin main
git push origin v1.20.1
# Étape 5 : Répercuter sur le serveur de production (o2switch)
ssh gupi7723@folina.o2switch.net "cd ~/api.jambostack.site && git pull origin main && git checkout v1.20.1"
```
---
## 7. Tableau de Bord & Critères de Validation
| Domaine | Tag Cible | Critère de Succès (Go / No-Go) | Statut Actuel |
| :--- | :---: | :--- | :---: |
| **Moteur Slugs & EAV** | `v1.20.1` | Aucune collision de slug, gestion transparente des soft-deletes | ✅ Validé en prod |
| **Sécurité PAT & RBAC** | `v1.21.0` | Authentification Admin fonctionnelle, hash sécurisé, révocation immédiate | ✅ Validé en prod |
| **Schéma OpenAPI / REST** | `v1.21.1` | Routes `/admin-api/` documentées et testables dans Swagger UI | ✅ Validé en prod |
| **GraphQL & Mercure** | `v1.22.0` | Limitation de profondeur active, zéro N+1, broadcast temps réel | ✅ Validé en prod |
| **Stockage S3 / R2** | `v1.23.0` | Cycle complet multipart direct upload, PublishedSiteStorage & SVG | ✅ Validé en prod |
| **Moteur Flow & IA SSE** | `v1.24.0` | Validation DAG sans boucles infinies, flux SSE continu sans leak | ✅ Validé en prod |
| **Formulaires & Blueprints**| `v1.24.1` | Intégrité stricte des sauvegardes ZIP et anti-spam opérationnel | ✅ Validé en prod |
| **Playwright E2E Studio** | `v1.25.0` | 100% tests Playwright passants (API, auth, dashboard) | ✅ Validé en prod |
| **Performance & OWASP** | `v1.25.1` | Bac à sable Twig sécurisé, zéro faille OWASP critique | ✅ Validé en prod |
| **CI/CD & Déploiement** | `v1.26.0` | Pipeline CI automatisé, smoke tests live 100% réussis sur o2switch | ✅ Validé en prod |
---
*Document conçu et maintenu par l'équipe JamboStack.*