Histoire ING-001 : Environnement de développement + infrastructure de test + migrations vides¶
Module : ingestion Tranche : Tier 0 - ING-S0 (architecture §11) Côté : [BACKEND] Version cible : V0.0.0 Priorité : 1 Dépend de : TENANT-S0 (MinIO + Postgres + Flyway), AUDIT-S0 (TestContainers patterns) Peut être développé en même temps que : Aucun (tranche de fondation) Ordre de fusion : Avant ING-002 Complexité estimée : S Histoires d'utilisateurs de la DRP : N/A - Histoire technique (facilitateur pour ING-US-01..03) Cadre filaire : N/A - backend uniquement
Objectif¶
Mettre en place l'infrastructure locale + CI nécessaire pour chaque histoire ING suivante : Seau MinIO papillon-ingestion-inbox vérifié/provisionné, helper de préfixe par locataire, fixture TestContainers, fixtures CSV/XLSX d'échantillons, et coquilles de migration Flyway vides (V010, V011). Pas de logique d'entreprise. Sans cette tranche, ING-002..006 ne peut pas démarrer un test.
Backend Scope¶
Entités¶
Aucune (cette tranche ne crée que des fichiers de migration vides ; les tables commerciales sont définies dans les V010/V011 remplies par ING-004).
Migrations¶
Deux fichiers de migration vides engagés (corps remplis par ING-004) :
backend/src/main/resources/db/migration/tenant/V010__ingestion_create_tables.sql
backend/src/main/resources/db/migration/tenant/V011__ingestion_customer_contract_columns.sql
Chaque fichier ne contient qu'un commentaire d'en-tête : -- ING-001 scaffold - body added by ING-004 (échafaudage ING-001 - corps ajouté par ING-004).
Couche de service¶
Aucun. Cette tranche fournit :
- IngestionTestContainersConfig (Spring @TestConfiguration) bootstrapping Postgres-platform, Postgres-tenant, et MinIO avec papillon-ingestion-inbox pré-créé.
- IngestionMinioPrefixHelper (test util) créant les préfixes <tenantId>/{inbox,processed,rejected,duplicate}/.
- docker-compose.yml MinIO init extension if TENANT S0 did not already create the bucket (verify first ; do not duplicate).
Points d'extrémité de l'API¶
Aucun.
Règles de validation¶
Aucune.
Considérations multi-tenant¶
La fixation TestContainers doit ensemencer au moins deux locataires dans papillon_platform.tenant afin que les tests d'intégration ultérieurs puissent prouver l'isolation entre les locataires (architecture §13.1). La même DDL sert les profils de BD SHARED (v0.0.0) et BYO (v0.0.4) - il n'y a pas de code spécifique au profil ici.
Audit & Logging¶
Aucune émission dans cette tranche. L'extension du catalogue AUDIT est un pré-requis (Cross-module ask OQ-X10, appartenant à AUDIT) et doit être installé avant que ING-002 ne commence le développement, pas ici.
Frontend Scope¶
N/A - backend uniquement.
Pages et itinéraires¶
Aucune.
Composants¶
Aucun.
États de l'interface utilisateur (TOUS OBLIGATOIRES)¶
| State | Behavior | French Copy |
|---|---|---|
| Loading | N/A — backend only | — |
| Empty | N/A — backend only | — |
| Error | N/A — backend only | — |
| Offline / low network | N/A — backend only | — |
| Success | N/A — backend only | — |
Comportement réactif¶
N/A.
Interactions¶
N/A.
Critères d'acceptation¶
AC-001: Test stack boots
Given a clean checkout of the repo
When the developer runs `./gradlew :backend:test --tests "*IngestionTestContainersSmokeTest"`
Then an ephemeral Postgres-platform + Postgres-tenant + MinIO container start
And the `papillon-ingestion-inbox` bucket exists with at least two seeded tenant prefixes
And the smoke test passes in < 60 s on a developer laptop.
AC-002: Empty migrations apply cleanly
Given the test stack from AC-001
When Flyway runs on the tenant DB
Then migrations `V010__ingestion_create_tables.sql` and `V011__ingestion_customer_contract_columns.sql` are present, applied, and idempotent
And no `ingestion_*` table yet exists (bodies are empty).
AC-003: Fixture files parseable
Given the fixture files committed by this story
When a smoke test loads `fixtures/ingestion/clean-5-rows.csv` via Jackson CSV streaming
And loads `fixtures/ingestion/blocking-anomalies.xlsx` via Apache POI SAX (`XSSFReader`)
Then both fixtures parse without exception
And the CSV reports exactly 5 data rows + 1 header row
And the XLSX reports at least one row that will later trigger `TELEPHONE_INVALIDE`.
Règles de conformité¶
Aucune n'est applicable à cette tranche d'échafaudage. La porte de production feature.artci.phone-auth.granted est câblée dans ING-005 ; cette histoire documente seulement le nom env-var dans .env.example.
Normes et conventions¶
docs/standards/multi-datasource-patterns.md- Conventions TestContainers pour les DBs des plateformes et des locataires.docs/standards/database-guidelines.md§ migrations layout -db/migration/tenant/vsdb/migration/platform/.docs/standards/java-spring-guidelines.md§ tranches de test.docs/standards/git-workflow.md- branchfeat/ingestion-ING-001.
Test des exigences¶
Tests unitaires¶
- N/A (pas de code de production dans cette tranche au-delà des utils de test).
Tests d'intégration¶
IngestionTestContainersSmokeTest- prouve que les trois conteneurs démarrent et que les préfixes bucket + tenant existent.IngestionMigrationsSmokeTest- prouve queV010+V011s'appliquent avec des corps vides.IngestionFixtureParseSmokeTest- prouve que les fichiers CSV + XLSX sont lisibles par les parsers choisis.
Ce que l'AQ validera¶
./gradlew :backend:test --tests "*Ingestion*Smoke*"passe localement.- En lançant
docker compose up -d minio postgres-platform postgres-tenantpuismc ls local/papillon-ingestion-inbox/on obtient le bucket.
Hors du champ d'application¶
- Toute logique métier (parsers, validators, scheduler, commit, audit) - ce sont les normes ING-002..005.
- Remplir les corps de migration - ING-004 possède les DDL
ingestion_import+ingestion_import_rowet les ajouts ALTERcustomer/contract. - Support multi-agences (V0.0.2+).
- UI upload endpoint / atelier (V0.0.3+).
- Notification de rejet par l'opérateur (V0.0.1 badge / V2 email-SMS).
- Approvisionnement BYO-DB (V0.0.4).
Définition de Fait¶
- [Tous les endpoints du backend sont implémentés et renvoient des réponses correctes (N/A - pas d'endpoints)
- [Toutes les pages du frontend s'affichent correctement à 360 / 768 / 1024 px (N/A - backend uniquement)
- [Les 5 états de l'interface utilisateur sont implémentés (N/A - backend uniquement)
- [La micro-copie française correspond exactement aux spécifications du design (N/A - backend uniquement)
- [Tous les critères d'acceptation sont passés manuellement
- [Tests unitaires et d'intégration écrits et réussis (trois tests de fumée ci-dessus)
- [ ] L'isolation des locataires a été vérifiée (les semences du dispositif de test sont ≥2 locataires ; le profil SHARED a été validé)
- [ ] [Histoires de clients] payload + Slow-3G + resumability (N/A - backend uniquement)
- [Les entrées du journal d'audit sont présentes pour chaque événement requis (N/A - pas d'émissions d'audit ici)
- [Pas de défaillances silencieuses sur des erreurs de réseau (les défaillances de démarrage des conteneurs de test font échouer la construction)