diff --git a/TEST_SCENARIOS.md b/TEST_SCENARIOS.md index 58069f4..faf41c8 100644 --- a/TEST_SCENARIOS.md +++ b/TEST_SCENARIOS.md @@ -72,9 +72,21 @@ Préparer : 3 entrées `A`, `B`, `C`, dont `A` dans le dossier `Work` avec le ta - **ACTION** : `A` ouverte → Settings → *Fetch missing* / *Re-fetch all* favicons - **ATTENDU** : l'aperçu d'icône **dans l'éditeur** se met à jour tout seul (pas seulement la carte). Idem après un import en mode overwrite qui apporte une icône. -### A11 · sync / import pendant que l'éditeur est ouvert — **trou connu** +### A11 · sync / import pendant que l'éditeur est ouvert - **ACTION** : `A` ouverte + dirty → lancer *Sync now* (ou importer un JSON en mode overwrite) qui met `A` à jour → Save -- **ATTENDU AUJOURD'HUI** : le Save de l'éditeur écrase la version venue du sync/import. **Non corrigé** — voir « Reste à traiter » plus bas. +- **ATTENDU** : modale « Entry changed elsewhere ». **Annuler ⇒ rien n'est écrit** (la version du sync/import survit, l'éditeur reste ouvert le temps de recopier). **Overwrite ⇒** la version de l'éditeur gagne. + +### A12 · pas de fausse alerte (non-régression d'A11) +Aucun de ces enchaînements ne doit afficher « Entry changed elsewhere » : +- **A12a** : `A` ouverte + dirty → Save → modifier encore → Save (le rechargement post-save re-cale la référence) +- **A12b** : `A` ouverte + dirty → batch *Add tag* / *Move to folder* sur `A` → Save (l'éditeur a absorbé le changement) +- **A12c** : `A` ouverte + dirty → supprimer son dossier → Save (cf. A7) +- **A12d** : `A` ouverte + dirty → *Fetch missing* favicons → Save (l'icône est hors payload éditeur) +- **A12e** : `A` ouverte + dirty → sync **sans** changement distant sur `A` → Save + +### A13 · entrée supprimée ailleurs pendant l'édition +- **ACTION** : `A` ouverte + dirty → un sync distant supprime `A` (tombstone) → Save +- **ATTENDU** : pas de plantage. L'entrée n'est plus en mémoire → le contrôle A11 passe la main ; le PUT échoue proprement avec un toast d'erreur. --- @@ -168,14 +180,7 @@ Symptôme du bug : après relance, lignes au nom vide / `(no name)`. ## Reste à traiter (constaté pendant l'audit, non corrigé) -1. **Sync / import pendant l'édition** (scénario A11). `editorAbsorbChange` - ne couvre que les écritures locales tag/dossier. Un vrai filet serait de - mémoriser `updated_at` à l'ouverture de l'éditeur et, au Save, de comparer - avec la valeur courante en mémoire : si elle a bougé, demander - « cette entrée a changé ailleurs — écraser ? ». Ça couvre d'un coup sync, - import, et tout futur chemin d'écriture. - -2. **Modale d'entrée héritée = code mort.** `openEntryModal` n'a **aucun +1. **Modale d'entrée héritée = code mort.** `openEntryModal` n'a **aucun appelant** ; `saveEntry`, `closeEntryModal`, le markup `#entryModal` et leurs listeners ne sont plus atteignables. Danger : `saveEntry` fait un PUT **partiel** (ni `kind`, ni `totp_secret`, ni `custom_fields`, ni @@ -183,7 +188,8 @@ Symptôme du bug : après relance, lignes au nom vide / `(no name)`. à ne jamais refaire. À supprimer (JS + HTML) tant qu'il n'est pas recâblé par erreur. -3. **Click-outside** : `#busyOverlay` et `.toast` ne sont pas dans la liste - blanche. Cliquer un toast ou l'overlay d'attente pendant une opération - longue ferme l'éditeur. Impact faible, correctif = 2 lignes dans la même - liste. +2. **Attachments hors garde A11.** Le contrôle « changed elsewhere » couvre le + payload de l'entrée, pas ses pièces jointes (table séparée, écrites par + leurs propres endpoints). Un sync qui remplace une pièce jointe pendant + l'édition n'est pas signalé. Faible risque : l'éditeur ne re-ship jamais + les pièces jointes existantes, donc il n'y a rien à écraser.