Suivis des revues de la pile #433 à #436 (fiabilité des tests) : relecture des commits de suivi, épingles manquantes #437

Open
opened 2026-10-14 00:29:49 +00:00 by maximus · 0 comments
Owner

Contexte

Restes non bloquants des quatre revues de la milestone planned-2026-10-10-fiabilite-tests (PRs #433 à #436, mergées le 2026-10-13, main c17bf5d). Les suivis applicables ont été appliqués en tête de pile (commits 74fae14, a1c31a1, ac3a981, 86eff9b, c17bf5d), sans nouvelle relecture (commentaires 23535 et 23550).

Analyse (2026-10-16, main d8037be)

  • Rien n'a bougé sur src/services/db.ts ni src-tauri/src/database/profile_db.rs depuis les cinq commits.
  • \r : présent dans PATH_STOP (db.ts ~l. 332, /[\n\r";|]/) mais absent de l'it.each « ends the folders at %j » (db.test.ts~l. 742, qui liste", ;, |, l'accent grave et \n`). Trou confirmé, déjà admis par 23535.
  • Rétention des copies : l'ordre est correct et déjà épinglé indirectement. backup_to (profile_db.rs:474-504) écrit .tmp, sync_all, puis rename sur la copie finale (« never deleted first », l. 470) ; remove_backups n'est appelé qu'après un catch_up_into réussi (l. 598-610). La mutation R2 du relecteur (élagage avant le renommage) a rougi 3 tests. Décision de Max (2026-10-16) : pas de test nommé en plus, limite documentée.
  • Génération du handle de transaction : défense inatteignable, commentée comme telle (db.ts:187-191) ; aucune mutation ne la vise (23535). Reste non couverte, par choix.
  • Survivantes de #435 (23499) : 6 clés réelles sur 4 composants, la 7e (common.next dans WizardNavigation) n'existe pas. Aucune des six n'est assertée : TransactionTable.render.test.tsx asserte 2 clés, LicenseKeyForm.render.test.tsx 2, PriceFetchControl.test.tsx 5, DashboardPage.render.test.tsx 1. Le faux t marqué (src/test/i18nMock.ts) rend t(key), donc expect(html).toContain(">t(dashboard.kpiSectionTitle)<") ou placeholder="t(license.keyPlaceholder)" suffit.
  • Limite des slots du harnais : plus large que « l'ordre des useState ». hookHarness.ts:192-205 attribue un slot par appel de hook, tous types confondus ; PriceFetchConsentToggle.test.tsx:230-236 prérègle slots[0..2] (hasConsent, showConfirm, loading, déclarés PriceFetchConsentToggle.tsx:59-61) et useOnboardingChecklist.wiring.test.ts:74-76 prérègle slots[0] (le reducer). Tout hook ajouté avant décale les slots en silence.
  • Badge best-effort : décision de Max (2026-10-16) : garder « non garanti » (cohérent avec « Source non garantie » de la notice voisine).

Travail à faire

1. Relecture des cinq commits de suivi (intégrée au fix)

Lire les diffs de 74fae14 (closeUnlocked : état vidé et génération incrémentée avant close(), échec en logWarn, closeDb() résolu quand même), a1c31a1 (harnais : useReducer garde le réducteur du premier rendu, cas M1 et M8), ac3a981 (garde i18n-mock-guard : t = (, t = vi.fn(, t: vi.fn(), 86eff9b (withoutFolders réécrit pour les chemins avec espaces) et c17bf5d (badge). Tout défaut trouvé devient une sous-tâche de cette issue ; sinon le noter « relu, rien à signaler » dans la PR, commit par commit.

2. Épingles

  • db.test.ts : ajouter \r à l'it.each des arrêts de chemin (~l. 742). Mutation : retirer \r de PATH_STOP doit rougir.
  • Six assertions sur le faux t marqué, une par clé survivante :
    • TransactionTable.render.test.tsx : transactions.table.transferIcon.ariaLabel (ou le chemin exact de la clé) et transactions.table.notes.placeholder
    • LicenseKeyForm.render.test.tsx : license.activate et license.keyPlaceholder (chemins exacts à lire dans le composant)
    • PriceFetchControl.test.tsx : balance.priceFetching.consent.accept, le dialogue de consentement rendu ouvert
    • DashboardPage.render.test.tsx : dashboard.kpiSectionTitle
      Mutation : retirer le t(...) de chaque appel (valeur brute à la place) doit rougir le test du composant.

3. Limites documentées (commentaires, pas de code)

  • En tête de PriceFetchConsentToggle.test.tsx (près de l. 230) et de mountWith (useOnboardingChecklist.wiring.test.ts:74) : un commentaire qui nomme la dépendance à l'ordre des hooks du composant (tout hook ajouté avant décale les slots), avec le renvoi à hookHarness.ts:192-205.
  • docs/architecture.md, section tests : trois limites connues : ordre des hooks pour les slots préréglés ; withoutFolders garde l'ancien repli (séparateurs en -) pour un chemin relatif sans début reconnu (dir/sub dir/x.db) ; la mesure du rattrapage (306 ms, 100 001 transactions) vient d'un NVMe, disque lent ou antivirus restent le risque écrit dans l'ADR 0021. Vérifier d'abord si l'ADR 0021 §7 ou architecture.md les portent déjà, ne pas dupliquer.

Fichiers concernés

  • src/services/db.test.ts (arrêt \r)
  • src/components/transactions/TransactionTable.render.test.tsx, src/components/settings/LicenseKeyForm.render.test.tsx, src/components/balance/PriceFetchControl.test.tsx, src/pages/DashboardPage.render.test.tsx
  • src/components/settings/PriceFetchConsentToggle.test.tsx, src/hooks/useOnboardingChecklist.wiring.test.ts (commentaires)
  • docs/architecture.md

Surface de test

  • Tests existants : ceux listés ci-dessus, plus db.test.ts l. 315-372 (fermetures, génération des handles sérialisés) et les 12 tests de rétention de profile_db.rs (l. 1356-1618).
  • Test de régression requis : non (épingles seulement, aucun changement de comportement).

Critères d'acceptation

  • Les cinq commits sont relus, verdict écrit dans la PR, défauts éventuels corrigés dans la même PR.
  • \r testé comme arrêt de chemin ; mutation citée.
  • Six assertions ajoutées ; les six mutations « t retiré » citées rouges.
  • Limites documentées sans duplication avec l'ADR 0021.
  • Aucun changement de comportement, aucune entrée CHANGELOG.

Complexité

Simple.

Revues sources : commentaires 23505 (#433), 23495 (#434), 23499 (#435), 23511 (#436) ; suivis : 23535, 23550.


Plan d'exécution — milestone lot-v018 (planifié le 2026-10-16)

Les sections ci-dessous viennent de la séance /plan-run du 2026-10-16 (revue /review-spec Sécurité, Architecture, Technique comprise). En cas de conflit avec le corps au-dessus, elles priment.

Consignes communes

  • Préflight : #369, #419 et #421 sont fermées et le tag v0.17.2 existe (git ls-remote --tags origin v0.17.2). Sinon, arrêt sans rien écrire.
  • Les numéros de ligne du corps ont été lus sur main 065f580 ; #369, #419 et #421 les ont déplacés depuis. Repérer chaque site par son contenu (symbole, chaîne), jamais par son numéro.
  • Toute clé i18n ajoutée l'est en FR et en EN (garde de #453, en tête de pile).
  • Les vérifications manuelles (app lancée) vont dans le corps de la PR et le DAILY-REPORT, pas dans STATE.md : le report dans STATE.md se fait au /merge-stack.

Depends on

Note : dépendance d'ordre de la pile, pas de dépendance de code.

Décisions prises en planification

  • Chemins de clés corrigés (revue Technique, vérifié sur 065f580) : transactions.transferIcon.ariaLabel et transactions.notes.placeholder, pas transactions.table.*. Le placeholder de la zone de notes n'est rendu qu'avec une ligne dépliée (état interne). Épingler la même clé sur le title du bouton des notes, toujours rendu.
  • PriceFetchControl : le dialogue de consentement dépend d'un état interne. Épingler balance.priceFetching.consent.accept en préréglant les slots du harnais (src/test/hookHarness.ts). Si le composant ne s'y prête pas, déclarer la clé non épinglable dans la PR, avec la raison, et passer aux cinq autres.
  • #369 et #429 ont modifié TransactionTable.tsx : lire les clés sur la base du maillon.

Spec source

spec-plan-lot-v018.md

## Contexte Restes non bloquants des quatre revues de la milestone `planned-2026-10-10-fiabilite-tests` (PRs #433 à #436, mergées le 2026-10-13, `main` `c17bf5d`). Les suivis applicables ont été appliqués en tête de pile (commits `74fae14`, `a1c31a1`, `ac3a981`, `86eff9b`, `c17bf5d`), **sans nouvelle relecture** (commentaires 23535 et 23550). ## Analyse (2026-10-16, `main` `d8037be`) - Rien n'a bougé sur `src/services/db.ts` ni `src-tauri/src/database/profile_db.rs` depuis les cinq commits. - **`\r`** : présent dans `PATH_STOP` (`db.ts` ~l. 332, `/[\n\r"`;|]/`) mais absent de l'`it.each` « ends the folders at %j » (`db.test.ts` ~l. 742, qui liste `"`, `;`, `|`, l'accent grave et `\n`). Trou confirmé, déjà admis par 23535. - **Rétention des copies** : l'ordre est correct et déjà épinglé indirectement. `backup_to` (`profile_db.rs:474-504`) écrit `.tmp`, `sync_all`, puis `rename` sur la copie finale (« never deleted first », l. 470) ; `remove_backups` n'est appelé qu'après un `catch_up_into` réussi (l. 598-610). La mutation R2 du relecteur (élagage avant le renommage) a rougi 3 tests. **Décision de Max (2026-10-16)** : pas de test nommé en plus, limite documentée. - **Génération du handle de transaction** : défense inatteignable, commentée comme telle (`db.ts:187-191`) ; aucune mutation ne la vise (23535). Reste non couverte, par choix. - **Survivantes de #435** (23499) : 6 clés réelles sur 4 composants, la 7e (`common.next` dans `WizardNavigation`) n'existe pas. Aucune des six n'est assertée : `TransactionTable.render.test.tsx` asserte 2 clés, `LicenseKeyForm.render.test.tsx` 2, `PriceFetchControl.test.tsx` 5, `DashboardPage.render.test.tsx` 1. Le faux `t` marqué (`src/test/i18nMock.ts`) rend `t(key)`, donc `expect(html).toContain(">t(dashboard.kpiSectionTitle)<")` ou `placeholder="t(license.keyPlaceholder)"` suffit. - **Limite des slots du harnais** : plus large que « l'ordre des `useState` ». `hookHarness.ts:192-205` attribue un slot par appel de hook, tous types confondus ; `PriceFetchConsentToggle.test.tsx:230-236` prérègle `slots[0..2]` (`hasConsent`, `showConfirm`, `loading`, déclarés `PriceFetchConsentToggle.tsx:59-61`) et `useOnboardingChecklist.wiring.test.ts:74-76` prérègle `slots[0]` (le reducer). Tout hook ajouté avant décale les slots en silence. - **Badge `best-effort`** : **décision de Max (2026-10-16)** : garder « non garanti » (cohérent avec « Source non garantie » de la notice voisine). ## Travail à faire ### 1. Relecture des cinq commits de suivi (intégrée au fix) Lire les diffs de `74fae14` (`closeUnlocked` : état vidé et génération incrémentée avant `close()`, échec en `logWarn`, `closeDb()` résolu quand même), `a1c31a1` (harnais : `useReducer` garde le réducteur du premier rendu, cas M1 et M8), `ac3a981` (garde `i18n-mock-guard` : `t = (`, `t = vi.fn(`, `t: vi.fn(`), `86eff9b` (`withoutFolders` réécrit pour les chemins avec espaces) et `c17bf5d` (badge). Tout défaut trouvé devient une sous-tâche de cette issue ; sinon le noter « relu, rien à signaler » dans la PR, commit par commit. ### 2. Épingles - [ ] `db.test.ts` : ajouter `\r` à l'`it.each` des arrêts de chemin (~l. 742). Mutation : retirer `\r` de `PATH_STOP` doit rougir. - [ ] Six assertions sur le faux `t` marqué, une par clé survivante : - `TransactionTable.render.test.tsx` : `transactions.table.transferIcon.ariaLabel` (ou le chemin exact de la clé) et `transactions.table.notes.placeholder` - `LicenseKeyForm.render.test.tsx` : `license.activate` et `license.keyPlaceholder` (chemins exacts à lire dans le composant) - `PriceFetchControl.test.tsx` : `balance.priceFetching.consent.accept`, le dialogue de consentement rendu ouvert - `DashboardPage.render.test.tsx` : `dashboard.kpiSectionTitle` Mutation : retirer le `t(...)` de chaque appel (valeur brute à la place) doit rougir le test du composant. ### 3. Limites documentées (commentaires, pas de code) - [ ] En tête de `PriceFetchConsentToggle.test.tsx` (près de l. 230) et de `mountWith` (`useOnboardingChecklist.wiring.test.ts:74`) : un commentaire qui nomme la dépendance à l'ordre des hooks du composant (tout hook ajouté avant décale les slots), avec le renvoi à `hookHarness.ts:192-205`. - [ ] `docs/architecture.md`, section tests : trois limites connues : ordre des hooks pour les slots préréglés ; `withoutFolders` garde l'ancien repli (séparateurs en `-`) pour un chemin relatif sans début reconnu (`dir/sub dir/x.db`) ; la mesure du rattrapage (306 ms, 100 001 transactions) vient d'un NVMe, disque lent ou antivirus restent le risque écrit dans l'ADR 0021. Vérifier d'abord si l'ADR 0021 §7 ou `architecture.md` les portent déjà, ne pas dupliquer. ## Fichiers concernés - `src/services/db.test.ts` (arrêt `\r`) - `src/components/transactions/TransactionTable.render.test.tsx`, `src/components/settings/LicenseKeyForm.render.test.tsx`, `src/components/balance/PriceFetchControl.test.tsx`, `src/pages/DashboardPage.render.test.tsx` - `src/components/settings/PriceFetchConsentToggle.test.tsx`, `src/hooks/useOnboardingChecklist.wiring.test.ts` (commentaires) - `docs/architecture.md` ## Surface de test - Tests existants : ceux listés ci-dessus, plus `db.test.ts` l. 315-372 (fermetures, génération des handles sérialisés) et les 12 tests de rétention de `profile_db.rs` (l. 1356-1618). - Test de régression requis : non (épingles seulement, aucun changement de comportement). ## Critères d'acceptation - [ ] Les cinq commits sont relus, verdict écrit dans la PR, défauts éventuels corrigés dans la même PR. - [ ] `\r` testé comme arrêt de chemin ; mutation citée. - [ ] Six assertions ajoutées ; les six mutations « `t` retiré » citées rouges. - [ ] Limites documentées sans duplication avec l'ADR 0021. - [ ] Aucun changement de comportement, aucune entrée CHANGELOG. ## Complexité Simple. Revues sources : commentaires 23505 (#433), 23495 (#434), 23499 (#435), 23511 (#436) ; suivis : 23535, 23550. --- # Plan d'exécution — milestone lot-v018 (planifié le 2026-10-16) Les sections ci-dessous viennent de la séance `/plan-run` du 2026-10-16 (revue `/review-spec` Sécurité, Architecture, Technique comprise). **En cas de conflit avec le corps au-dessus, elles priment.** ## Consignes communes - Préflight : #369, #419 et #421 sont fermées et le tag `v0.17.2` existe (`git ls-remote --tags origin v0.17.2`). Sinon, arrêt sans rien écrire. - Les numéros de ligne du corps ont été lus sur `main` `065f580` ; #369, #419 et #421 les ont déplacés depuis. Repérer chaque site par son contenu (symbole, chaîne), jamais par son numéro. - Toute clé i18n ajoutée l'est en FR et en EN (garde de #453, en tête de pile). - Les vérifications manuelles (app lancée) vont dans le corps de la PR et le DAILY-REPORT, pas dans `STATE.md` : le report dans `STATE.md` se fait au `/merge-stack`. ## Depends on - #393 Note : dépendance d'ordre de la pile, pas de dépendance de code. ## Décisions prises en planification - **Chemins de clés corrigés** (revue Technique, vérifié sur `065f580`) : `transactions.transferIcon.ariaLabel` et `transactions.notes.placeholder`, pas `transactions.table.*`. Le placeholder de la zone de notes n'est rendu qu'avec une ligne dépliée (état interne). Épingler la même clé sur le `title` du bouton des notes, toujours rendu. - **`PriceFetchControl`** : le dialogue de consentement dépend d'un état interne. Épingler `balance.priceFetching.consent.accept` en préréglant les slots du harnais (`src/test/hookHarness.ts`). Si le composant ne s'y prête pas, déclarer la clé non épinglable dans la PR, avec la raison, et passer aux cinq autres. - #369 et #429 ont modifié `TransactionTable.tsx` : lire les clés sur la base du maillon. ## Spec source spec-plan-lot-v018.md
maximus added the
status:triage
type:refactor
source:human
labels 2026-10-14 00:29:49 +00:00
maximus added
status:ready
and removed
status:triage
labels 2026-10-16 23:40:15 +00:00
maximus added this to the planned-2026-10-16-lot-v018 milestone 2026-10-17 00:14:25 +00:00
maximus added
status:in-progress
and removed
status:ready
labels 2026-10-18 23:32:19 +00:00
maximus added
status:review
and removed
status:in-progress
labels 2026-10-19 00:02:24 +00:00
maximus added
status:approved
and removed
status:review
labels 2026-10-19 02:24:13 +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#437
No description provided.