test: corpus de fixtures CSV et contrat de detection #326

Closed
opened 2026-08-12 20:14:33 +00:00 by maximus · 0 comments
Owner

Refs: spec-decisions-import-csv-format.md + spec-plan-import-csv-format.md (racine du repo).

Contexte

src/utils/csvAutoDetect.test.ts ne couvre que le flux holdings (#245). autoDetectConfig, detectAmountMode, detectSingleAmount, preprocessQuotedCSV et l'integralite de useImportWizard n'ont aucun test, sur les 871 que compte le projet — alors que c'est le coeur historique de la reconnaissance de format.

Cette issue vient avant la refonte de la detection, deliberement : elle fige le comportement actuel comme contrat, pour que les issues suivantes se mesurent a quelque chose d'etabli plutot qu'a une intention.

Taches

  • Corpus de fixtures synthetiques sous src/test/fixtures/csv/, un fichier par cas :
    montant signe ; debit/credit ; debit/credit en ordre inverse (Date;Description;Credit;Debit) ; colonne inutilisee a 0,00 ; preambule avant l'en-tete ; en-tete contenant un nombre (« Solde 2024 ») ; sans ligne d'en-tete ; tout-positif ; ligne entiere entre guillemets (style Desjardins)
  • Tests de contrat sur autoDetectConfig : delimiteur, en-tete, lignes ignorees, format de date, mode, convention, mapping
  • Tests de bout en bout du parsing sur chaque fixture, du fichier brut aux montants signes
  • Documenter dans le fichier de test quels cas echouent aujourd'hui et sont attendus corriges par les issues suivantes

Points d'attention

Fixtures synthetiques : aucune donnee reelle au depot. Elles couvrent des cas qu'un vrai releve ne contient pas, ce qui est precisement l'interet.

Criteres d'acceptation

  • Chaque fixture est couverte par au moins un test de contrat
  • Les cas connus defaillants sont marques explicitement, pas silencieusement absents

Revision /review-spec — 2026-08-13

Corrections a appliquer, issues de la revue 3 experts :

  • Cette issue passe en PREMIER maillon de la pile, sans dependance. Elle etait placee apres #325, qui modifie parseFrenchAmount — dont dependent detectHeader, detectSingleAmount, pickBestAmountColumn et isSparseComplementary. Le corpus cense figer le comportement « avant la refonte » aurait enregistre un comportement deja modifie.
  • Nouvel ordre de la pile : #326#323#324#325#327#328#329#330#331#332.
  • Chemin des fixtures corrige : src/__fixtures__/csv/, pas src/test/fixtures/csv/src/test/ n'existe pas. Les tests sont colocalises (src/utils/*.test.ts), les fixtures vivent dans src/__fixtures__/ et l'integration dans src/__integration__/.
  • Etendre les assertions aux sites d'appel holdings, puisque #325 durcira le parser globalement.
  • Ajouter une fixture au format « montant absolu + indicateur D/C » (voir #327).

Premier maillon — aucune dependance.


Fichiers concernes

  • src/__fixtures__/csv/creer : corpus synthetique (PAS src/test/, qui n'existe pas)
  • src/utils/csvAutoDetect.test.ts — tests de contrat du flux transactions
  • src/utils/amountParser.test.tscreer

Decisions prises en planification

  • Emplacement du code partage : le codec formatToRow/formatFromRow et mapRow vivent dans src/utils/importFormat.ts — meme dossier que amountParser, dateParser et csvAutoDetect, qui portent deja la logique pure du domaine. Les types restent dans src/shared/types/.
  • Aucune correction retroactive des transactions deja importees a l'envers : la voie de reparation est deleteImportWithTransactions puis re-import. Ne jamais muter des montants deja ecrits.
  • L'import reste entierement en edition Free — aucun gating a ajouter.
  • Les specs spec-decisions-import-csv-format.md et spec-plan-import-csv-format.md sont committees a la racine (force-add, precedent PR #295) : elles sont lisibles depuis un worktree.

Spec source

spec-plan-import-csv-format.md + spec-decisions-import-csv-format.md (racine du repo, committees).

Refs: `spec-decisions-import-csv-format.md` + `spec-plan-import-csv-format.md` (racine du repo). ## Contexte `src/utils/csvAutoDetect.test.ts` ne couvre que le flux holdings (#245). `autoDetectConfig`, `detectAmountMode`, `detectSingleAmount`, `preprocessQuotedCSV` et l'integralite de `useImportWizard` n'ont **aucun test**, sur les 871 que compte le projet — alors que c'est le coeur historique de la reconnaissance de format. Cette issue vient **avant** la refonte de la detection, deliberement : elle fige le comportement actuel comme contrat, pour que les issues suivantes se mesurent a quelque chose d'etabli plutot qu'a une intention. ## Taches - [ ] Corpus de fixtures synthetiques sous `src/test/fixtures/csv/`, un fichier par cas : montant signe ; debit/credit ; debit/credit en ordre inverse (`Date;Description;Credit;Debit`) ; colonne inutilisee a `0,00` ; preambule avant l'en-tete ; en-tete contenant un nombre (« Solde 2024 ») ; sans ligne d'en-tete ; tout-positif ; ligne entiere entre guillemets (style Desjardins) - [ ] Tests de contrat sur `autoDetectConfig` : delimiteur, en-tete, lignes ignorees, format de date, mode, convention, mapping - [ ] Tests de bout en bout du parsing sur chaque fixture, du fichier brut aux montants signes - [ ] Documenter dans le fichier de test quels cas echouent aujourd'hui et sont attendus corriges par les issues suivantes ## Points d'attention Fixtures **synthetiques** : aucune donnee reelle au depot. Elles couvrent des cas qu'un vrai releve ne contient pas, ce qui est precisement l'interet. ## Criteres d'acceptation - [ ] Chaque fixture est couverte par au moins un test de contrat - [ ] Les cas connus defaillants sont marques explicitement, pas silencieusement absents --- ## Revision /review-spec — 2026-08-13 Corrections a appliquer, issues de la revue 3 experts : - **Cette issue passe en PREMIER maillon de la pile, sans dependance.** Elle etait placee apres #325, qui modifie `parseFrenchAmount` — dont dependent `detectHeader`, `detectSingleAmount`, `pickBestAmountColumn` et `isSparseComplementary`. Le corpus cense figer le comportement « avant la refonte » aurait enregistre un comportement deja modifie. - **Nouvel ordre de la pile** : #326 → #323 → #324 → #325 → #327 → #328 → #329 → #330 → #331 → #332. - **Chemin des fixtures corrige** : `src/__fixtures__/csv/`, pas `src/test/fixtures/csv/` — `src/test/` n'existe pas. Les tests sont colocalises (`src/utils/*.test.ts`), les fixtures vivent dans `src/__fixtures__/` et l'integration dans `src/__integration__/`. - **Etendre les assertions aux sites d'appel holdings**, puisque #325 durcira le parser globalement. - Ajouter une fixture au format « montant absolu + indicateur D/C » (voir #327). Premier maillon — aucune dependance. --- ## Fichiers concernes - `src/__fixtures__/csv/` — **creer** : corpus synthetique (PAS `src/test/`, qui n'existe pas) - `src/utils/csvAutoDetect.test.ts` — tests de contrat du flux transactions - `src/utils/amountParser.test.ts` — **creer** ## Decisions prises en planification - **Emplacement du code partage** : le codec `formatToRow`/`formatFromRow` et `mapRow` vivent dans `src/utils/importFormat.ts` — meme dossier que `amountParser`, `dateParser` et `csvAutoDetect`, qui portent deja la logique pure du domaine. Les types restent dans `src/shared/types/`. - **Aucune correction retroactive** des transactions deja importees a l'envers : la voie de reparation est `deleteImportWithTransactions` puis re-import. Ne jamais muter des montants deja ecrits. - **L'import reste entierement en edition Free** — aucun gating a ajouter. - Les specs `spec-decisions-import-csv-format.md` et `spec-plan-import-csv-format.md` sont **committees a la racine** (force-add, precedent PR #295) : elles sont lisibles depuis un worktree. ## Spec source `spec-plan-import-csv-format.md` + `spec-decisions-import-csv-format.md` (racine du repo, committees).
maximus added this to the planned-2026-08-12-import-csv-format milestone 2026-08-12 20:14:33 +00:00
maximus added the
status:ready
type:feature
source:human
labels 2026-08-12 20:14:33 +00:00
maximus added
status:in-progress
and removed
status:ready
labels 2026-08-13 16:25:12 +00:00
maximus added
status:approved
and removed
status:in-progress
labels 2026-08-14 15:23:51 +00:00
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/Simpl-Resultat#326
No description provided.