test: le faux t des tests de rendu rend la clé brute, un appel à t oublié passe inaperçu
#389
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#389
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Constat de la revue de la PR #387 (#370), suggestion S1 : un faux
tqui rend la clé telle quelle cache un appel àtoublié. Un composant qui affichelicense.removeKey.confirmValidau lieu du texte traduit passe toute la suite (mesuré sur la tête de #387 : 1487 tests sur 1487 verts).2cbc886a marqué la sortie dansuseLicenseMachines.test.ts(fonctionecho, L664) etLicenseCard.render.test.tsx:t(clé[options]). Depuis, la forme marquée est devenue la convention de fait (12 fichiers), mais elle est recopiée dans chaque fichier, et la pile du 2026-10-08 a ajouté quatre fichiers àtbrut.État au 2026-10-10 (inventaire scripté)
tbrut, 12 fichiers :src/components/balance/PriceFetchControl.test.tsxsrc/components/dashboard/OnboardingChecklist.test.tsxsrc/components/import/ImportEmptyState.test.tsxsrc/components/import/SourceList.test.tsx(ajouté le 2026-10-08)src/components/import/WizardNavigation.test.tsx(ajouté le 2026-10-08)src/components/reports/FilterPanel.test.tsxsrc/components/settings/DocsSubsections.test.tsx(cas particulier : rend unFIXTUREpour certaines clés, à garder pour ces clés)src/components/settings/LicenseKeyForm.render.test.tsxsrc/components/settings/PriceFetchConsentToggle.test.tsxsrc/components/shared/UpsellCtas.render.test.tsxsrc/components/transactions/TransactionTable.render.test.tsx(ajouté le 2026-10-08)src/pages/DashboardPage.render.test.tsx(ajouté le 2026-10-08)Déjà marqués, 12 fichiers (copie locale de la même fonction) :
BudgetTable.render,BudgetTable.wiring,DashboardEmptyState.render,AppShell.render,OnboardingBanner.render,StepCard.render,LicenseCard.render,BudgetPage.render,BudgetPage.wiring,ImportPage.render,UsersSettingsPage,TransactionsPage.render.Décision (Max, 2026-10-10)
Module partagé + migration. Un seul faux
tmarqué danssrc/test/i18nMock.ts, adopté par les 24 fichiers (bruts et déjà marqués), chaque fichier brut prouvé par une mutation.Travail à faire
src/test/i18nMock.ts:markedT(key, options?)qui rendt(clé)out(clé[a=1,b=2]), et une fabriquei18nMock({ language?, fixture? })pourvi.mock("react-i18next", ...)(hoisting : import dynamique dans la fabrique).fixturecouvre le cas deDocsSubsections.echodeuseLicenseMachines.test.tsparmarkedT.docs/architecture.md, section## Tests (vitest sans jsdom)(créée par #409) : convention « jamais detbrut, utiliseri18nMock».Fichiers concernés
src/test/i18nMock.ts(nouveau),src/hooks/useLicenseMachines.test.tsdocs/architecture.mdSurface de test
tretiré du composant » qui fait rougir au moins un test (code de sortie 1). Si un composant n'a aucune assertion sur un texte affiché, en ajouter une.src/__integration__/i18n-mock-guard.test.ts(convention detransactions-transfer-icon.test.ts:readFileSync,import.meta.dirname), liste les fichiers parreaddirSync(src, {{ recursive: true }}), et échoue sur toutuseTranslation:out: (dans un fichier*.test.ts(x)hors desrc/test/i18nMock.ts(s'exclut lui-même).Critères d'acceptation
react-i18nextne rend une clé brute ; un seul fauxtdans le dépôt.tretiré » rougit.npm testvert.Complexité estimée
Simple à medium (mécanique, 24 fichiers).
Liens
PR #387 (revue S1),
2cbc886; #409 (harnais React, module voisinsrc/test/hookHarness.ts) ; #369 (toucheTransactionTable.render.test.tsx).Depends on
Critères d'acceptation (planification)
BudgetTable.wiring,BudgetPage.wiring,UsersSettingsPageseulement (#409 est mergée avant : partir de son état).echo; les 12 fichiers bruts avec leurs mutations ; les 12 fichiers marqués ; la garde (verte seulement une fois les 24 migrés).tretiré » / test rouge.Review caveats
useTranslation:,t: () plutôt que par analyse de la fabrique : moins fragile.Décisions prises en planification
/analyze).src/__integration__/(décision de planification).docs/architecture.mdfixées pour toute la milestone :### Accès DB et transactions(sous la section Base de données) et## Tests (vitest sans jsdom)(juste avant CI/CD). La première issue de la pile qui en a besoin crée la section ; les suivantes y ajoutent.Spec source
spec-plan-fiabilite-tests.md(local, ignoré par git)Archive avant réécriture par
/analyze(2026-10-10, lu surmain87920ec). Le corps est réécrit avec les décisions de Max du jour ; le texte d'origine est conservé ci-dessous.Corps d'origine
Contexte
Constat de la revue de la PR #387 (#370), suggestion S1 : le faux
tdes tests rend la clé telle quelle quand l'appel n'a pas d'options. Un appel àtoublié ne se voit donc pas : un composant qui affichelicense.removeKey.confirmValidau lieu du texte traduit passe toute la suite. Mesuré sur la tête de #387 : la première confirmation du retrait passée sanst, et la raison d'échec affichée sur la carte passée sanst, laissaient 1487 tests sur 1487 verts.Ce qui est déjà corrigé
Avant le merge de la pile #386 → #387 → #388, le commit
2cbc886a marqué la sortie du fauxtdans les deux fichiers de la pile :t(clé[options])au lieu declé[options].src/hooks/useLicenseMachines.test.ts(fonctionecho) ;src/components/settings/LicenseCard.render.test.tsx(mock dereact-i18next).Les assertions écrites sous la forme marquée y rougissent désormais sur une chaîne qui a sauté
t: 18, 4 et 1 tests rouges selon la mutation. Les assertions par sous-chaîne sur une clé nue restent valides, puisque la clé figure dans la marque.Ce qui reste
Huit fichiers mockent encore
react-i18nextavec untqui rend la clé brute :src/components/shared/UpsellCtas.render.test.tsxsrc/components/settings/LicenseKeyForm.render.test.tsxsrc/components/settings/PriceFetchConsentToggle.test.tsxsrc/components/settings/DocsSubsections.test.tsxsrc/components/balance/PriceFetchControl.test.tsxsrc/components/import/ImportEmptyState.test.tsxsrc/components/dashboard/OnboardingChecklist.test.tsxsrc/components/reports/FilterPanel.test.tsxPiste
markedTdans un module de test) qui rendt(clé[options]), adopté fichier par fichier.tdu composant testé.Critères d'acceptation
react-i18nextdans les tests ne rend une clé brute.tretiré » fait rougir un test.npm testvert.