Simpl-Resultat/docs/qa-refonte-seed-categories-ipc.md
le king fu 12d1877870
All checks were successful
PR Check / rust (push) Successful in 22m48s
PR Check / frontend (push) Successful in 2m20s
PR Check / rust (pull_request) Successful in 22m51s
PR Check / frontend (pull_request) Successful in 2m21s
test(categories): complete test coverage for migration flow (#123)
Adds unit + integration + regression tests and a QA checklist for the
v2→v1 seed migration feature.

- Fixtures: src/__fixtures__/profiles.ts (makeV2Profile, makeV1Profile,
  makeV2ProfileWithCustom) with realistic categories, keywords,
  suppliers, transactions, budgets.
- Unit: categoryMappingService (100 cases covering every DEFAULT_MAPPINGS
  entry, 4-pass priority, splits, preserved/custom detection),
  categoryBackupService (23 cases — Tauri mocks: success, write error,
  integrity check, PIN-encrypted profile), categoryMigrationService (16
  cases — BEGIN/COMMIT/ROLLBACK flow, backup-missing abort, journaling,
  custom parent creation).
- Integration: full plan→backup→migrate→verify flow; rollback via SREF
  import; backup failure → no DB write; migration SQL failure → ROLLBACK
  + intact state.
- Regression: parameterised v2/v1 fixtures covering auto-categorisation,
  budget aggregation, splits preservation.
- Docs: docs/qa-refonte-seed-categories-ipc.md — manual checklist for UX,
  system errors, encrypted profile, custom preservation, 90-day banner,
  restore flow.

331 vitest tests pass (up from 193 baseline).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 19:25:13 -04:00

8.5 KiB

QA — Refonte seed catégories IPC

Checklist manuelle pour valider le flow complet de migration v2→v1 (spec spec-refonte-seed-categories-ipc). À dérouler avant chaque release touchant au module catégories.

Prérequis

  • Profil de test v2 avec au moins : 10+ catégories seedées, 2-3 catégories custom, 50+ transactions réparties, quelques suppliers et keywords, un budget actif.
  • Profil de test v1 (nouveau profil créé après #115) pour les tests de régression.
  • Variante profil v2 avec PIN activé (profil chiffré).

1. Pré-migration (découverte)

  • Ouvrir l'app sur un profil v2 → bannière dashboard "Découvrez la nouvelle structure" (#118) visible en haut.
  • Cliquer CTA bannière → redirige vers /settings/categories/standard (#117).
  • Dismiss la bannière → disparaît immédiatement, reste dismiss après redémarrage de l'app.
  • Créer un nouveau profil v1 (ou charger le profil v1 de test) → bannière pas affichée.

2. Page Guide des catégories standard (#117)

  • Arbre affiche les 3 niveaux avec les noms traduits (FR et EN).
  • Switcher EN → les noms basculent, l'arbre conserve son état d'expansion.
  • Tooltip au hover d'un nœud affiche i18n_key, type, id.
  • Compteur "N catégories" en haut correspond au nombre total de leaves.
  • Recherche full-text filtre les noms correctement (accent-insensitive).
  • Bouton Print → impression/PDF avec arbre entièrement déplié et toolbar masquée.
  • Lien "Voir les catégories standard" dans Settings > Catégories → même page.

3. Page de migration — Étape 1 (Discover)

  • Depuis Settings > Catégories sur un profil v2, cliquer "Migrer vers la nouvelle structure" → /settings/categories/migrate.
  • Étape 1 affiche l'arbre v1 (read-only, comme la page Guide).
  • Bouton Next passe à l'étape 2.

4. Page de migration — Étape 2 (Simulate)

  • Table 3 colonnes : v2 source | confidence badge | cible v1 + action.
  • Badges corrects : 🟢 haute (keyword), 🔵 moyenne (supplier), 🟠 basse (default), 🔴 aucune (review).
  • Stats summary en haut : total / high / medium / low / none.
  • Section "Catégories personnalisées préservées" liste les custom du profil (si présentes).
  • Cliquer une ligne 🟠 ou 🔴 → panneau latéral "Transactions impactées" affiche jusqu'à 50 transactions liées.
  • Pour une ligne unresolved, ouvrir le picker de cible → sélectionner un leaf v1 → badge passe à résolu.
  • Bouton Next disabled tant qu'il reste des lignes unresolved.
  • Résoudre toutes les unresolved → Next devient actif.
  • Checklist obligatoire : "J'ai compris…", "Je consens…", "Je sauvegarde avant…".
  • Bouton Apply disabled tant que la checklist n'est pas complète.
  • Sur profil avec PIN, champ PIN demandé.
  • Apply déclenche : loader 4 sous-étapes (1. Sauvegarde, 2. Insertion v1, 3. Remap transactions/budgets, 4. Cleanup v2).

6. Migration — cas nominal

  • Après Apply, écran de succès affiche :
    • Chemin du backup SREF (ex: ~/Documents/Simpl-Resultat/backups/MonProfil_avant-migration-2026-04-21T12-34-56.sref).
    • Récap : nb v1 insérées, nb transactions updatées, nb budgets updatées, nb keywords updatés, nb v2 désactivées, nb custom préservées.
    • Liens vers Dashboard / Voir les catégories.
  • Retour au Dashboard → bannière dashboard #118 disparue.
  • Settings > Catégories → bannière "Sauvegarde disponible" (#122) visible (90 jours).
  • Page Catégories → affiche la structure v1.

7. Migration — échec backup

Simuler : rendre le dossier ~/Documents/Simpl-Resultat/backups/ non-writable (Linux : chmod -w, Windows : permissions lecture seule) avant de lancer Apply.

  • Apply échoue à l'étape 1 (Sauvegarde).
  • Message d'erreur clair : "Impossible de créer la sauvegarde. Aucune modification n'a été effectuée."
  • Aucune écriture BDD : via outil SQLite, vérifier que categories, transactions, budgets, keywords sont strictement identiques avant/après.
  • Flag categories_schema_version reste à v2.
  • Bouton retry dispo ; rétablir les droits d'écriture, relancer → succès.

8. Migration — échec SQL (rollback)

Plus difficile à reproduire ; le chemin testé unitairement est le ROLLBACK déclenché si un UPDATE casse une contrainte FK/UNIQUE. Tester en injectant artificiellement une contrainte (ex: DB corrompue) si un outil le permet, sinon revue de code suffit. La checklist minimale :

  • Si un échec est simulé, écran d'erreur affiche "La migration a échoué. Vos données n'ont pas été modifiées. Votre sauvegarde est disponible à ."
  • BDD intacte (même check qu'au point 7).
  • Backup SREF créé (toujours disponible sur le disque).

9. Bannière post-migration (#122) — 90 jours

  • Migration récente → bannière Settings > Catégories visible.
  • Date d'expiration affichée = timestamp migration + 90 jours.
  • Cliquer "Fermer" → bannière disparaît, flag categories_migration_banner_dismissed=1, ne réapparaît plus après redémarrage.
  • Après 90 jours (avancer l'horloge système ou manipuler last_categories_migration.timestamp dans la DB) → bannière plus affichée, mais entrée permanente "Rétablir une sauvegarde" reste dispo dans Settings.

10. Rétablir la sauvegarde (#122)

  • Cliquer "Rétablir la sauvegarde" depuis bannière ou depuis l'entrée permanente.
  • Modale s'ouvre : chemin backup affiché, texte de warning, boutons Annuler / Rétablir (rouge).
  • Sur profil chiffré (PIN), champ PIN demandé.
  • Simuler fichier manquant : renommer/déplacer le .sref avant de cliquer Rétablir → erreur claire + file picker de secours.
  • Choisir le fichier via le picker → la restauration procède.
  • Après succès :
    • Toast / message succès.
    • L'app recharge, catégories v2 à nouveau actives.
    • categories_schema_version revient à v2.
    • last_categories_migration.reverted_at renseigné (ISO string).
    • Transactions, budgets, keywords correspondent à l'état pré-migration.
  • Annuler la modale → aucune modification.

11. Profil avec catégories custom

  • Migration préserve les 3 custom sous un parent "Catégories personnalisées (migration)" (id 2000).
  • Les transactions liées aux custom conservent leur category_id.
  • Les keywords liés aux custom conservent leur category_id.

12. Profil sans catégories custom

  • Migration ne crée pas de parent "Catégories personnalisées (migration)" (section preserved vide → skip).

13. Régression — fonctionnalités auxiliaires

Tester sur profil v2 ET profil v1 pour vérifier qu'aucune fonctionnalité n'a cassé :

  • Auto-catégorisation CSV : importer un CSV de test → catégorisation par keyword/supplier fonctionne identiquement.
  • Budget vs Actuel : agrégation parent/enfant cohérente, montants corrects.
  • Splits : transactions multi-catégories préservent leurs ratios.
  • Export/Import SREF : export d'un profil v1 → re-import dans un nouveau profil → structure identique.
  • UI CategoryTree et CategoryCombobox : rendent correctement l'arbre v1 et v2, pas d'affichage cassé ou mélangé.
  • Rapports : aucune régression sur les graphiques catégorie (tendances, répartition).

14. i18n

  • Toutes les nouvelles pages (Guide, Migration, bannières, modale) supportent FR et EN.
  • Aucune chaîne en dur visible à l'écran.
  • Bascule live FR↔EN ne casse pas l'état local des pages.

Tests automatisés équivalents

Pour référence, les chemins de tests automatisés qui couvrent partiellement cette checklist :

  • Unitaires : src/services/categoryMappingService.test.ts (100 tests), src/services/categoryBackupService.test.ts (23), src/services/categoryMigrationService.test.ts (16), src/services/categoryTaxonomyService.test.ts (15), src/services/categoryRestoreService.test.ts (12), src/hooks/useCategoryMigration.test.ts (13).
  • Intégration : src/__integration__/category-migration.test.ts (flow + échecs + rollback).
  • Régression : src/__integration__/regression-v2-v1.test.ts (auto-catégorisation, budget agrégation, splits paramétrés v2/v1).

Cette QA manuelle couvre les dimensions UX, erreurs système (permissions, fichiers manquants), profil chiffré et régression visuelle qui ne sont pas automatisables actuellement.