Aller au contenu

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/ vs db/migration/platform/.
  • docs/standards/java-spring-guidelines.md § tranches de test.
  • docs/standards/git-workflow.md - branch feat/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 que V010 + V011 s'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-tenant puis mc 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_row et les ajouts ALTER customer/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)