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>
141 lines
8.5 KiB
Markdown
141 lines
8.5 KiB
Markdown
# 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.
|
|
|
|
## 5. Page de migration — Étape 3 (Consent)
|
|
|
|
- [ ] 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 à <path>."
|
|
- [ ] 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.
|