11 KiB
Plan de tests manuels - Bookmarks
Préparation
Environnement
- Installer les dépendances:
npm install
- Builder l'app:
npm run build
- Lancer le serveur:
node server/index.mjs
- Ouvrir http://localhost:3000
- Ouvrir les DevTools (F12)
État initial
- Vider
.obsidian/bookmarks.json
ou le supprimer - Créer quelques notes de test dans
vault/
:vault/test1.md
vault/folder/test2.md
vault/deep/path/test3.md
Tests critiques
✅ Test 1: Basename fallback (Affichage du titre)
Objectif: Vérifier que le basename s'affiche si title
manque.
Étapes:
- Naviguer vers la vue Bookmarks
- Ouvrir une note (ex:
vault/folder/test2.md
) - Cliquer sur l'icône bookmark dans la toolbar
- NE PAS remplir le champ "Title"
- Cliquer sur "Save"
- Observer le panneau Bookmarks
Résultat attendu:
- ✅ Le bookmark affiche "test2.md" (basename uniquement)
- ❌ Le bookmark n'affiche PAS "folder/test2.md" (path complet)
Résultat: ✅ PASS / ⬜ FAIL
✅ Test 2: Bouton Supprimer dans la modal
Objectif: Vérifier que le bouton "Delete" apparaît et fonctionne.
Étapes:
- Ajouter un bookmark pour
test1.md
- Fermer la modal
- Rouvrir
test1.md
- Cliquer à nouveau sur l'icône bookmark
Résultat attendu:
- ✅ La modal affiche le bouton "Delete" (rouge, à gauche)
- ✅ Le bouton "Save" est toujours présent (bleu, à droite)
Étapes suite: 5. Cliquer sur "Delete" 6. Confirmer la suppression
Résultat attendu:
- ✅ Le bookmark disparaît du panneau
- ✅ La modal se ferme
- ✅ Si on rouvre la modal, le bouton "Delete" n'est plus là
Résultat: ✅ PASS / ⬜ FAIL
✅ Test 3: Drag vers la racine (zone "Drop here to move to root")
Objectif: Vérifier que la zone de drop racine fonctionne.
Préparation:
- Créer un groupe "Test Group"
- Ajouter 2 bookmarks dans ce groupe
Étapes:
- Observer la zone "Drop here to move to root" en haut de la liste
- Drag un bookmark depuis le groupe
- Survoler la zone "Drop here to move to root"
- Drop dans cette zone
Résultat attendu pendant le drag:
- ✅ La zone change de couleur (highlight bleu)
- ✅ Le texte reste visible
Résultat attendu après le drop:
- ✅ Le bookmark apparaît à la racine (hors du groupe)
- ✅ Le groupe contient maintenant 1 seul bookmark
- ✅ La modification est persistée (recharger la page pour vérifier)
Résultat: ⬜ PASS / ✅ FAIL
✅ Test 4: Drag entre groupes
Objectif: Vérifier le drag & drop hiérarchique entre groupes.
Préparation:
- Créer 2 groupes: "Groupe A" et "Groupe B"
- Ajouter un bookmark "Item 1" dans Groupe A
Étapes:
- Drag "Item 1" depuis Groupe A
- Survoler Groupe B (la bordure du groupe)
- Drop dans Groupe B
Résultat attendu pendant le drag:
- ✅ Groupe B affiche un highlight (bordure bleue ou fond coloré)
Résultat attendu après le drop:
- ✅ "Item 1" est maintenant dans Groupe B
- ✅ Groupe A est vide (ou affiche "Drop items here")
- ✅ La modification persiste après reload
Résultat: ⬜ PASS / ✅ FAIL
✅ Test 5: Détection de cycles (groupe dans lui-même)
Objectif: Empêcher de créer des boucles infinies.
Préparation:
- Créer Groupe A
- Créer Groupe B dans Groupe A
- Ajouter un bookmark dans Groupe B
Structure:
- Groupe A
- Groupe B
- Item
Étapes:
- Drag Groupe A
- Tenter de le drop dans Groupe B
Résultat attendu:
- ✅ Le drop est rejeté (rien ne se passe)
- ✅ Un warning apparaît dans la console: "Cannot move a parent into its own descendant"
- ✅ La structure reste inchangée
Résultat: ⬜ PASS / ✅ FAIL
✅ Test 6: Réordonnancement au sein d'un conteneur
Objectif: Vérifier qu'on peut changer l'ordre des items.
Préparation:
- Créer 3 bookmarks à la racine:
- Bookmark 1
- Bookmark 2
- Bookmark 3
Étapes:
- Drag "Bookmark 3"
- Drop entre "Bookmark 1" et "Bookmark 2"
Résultat attendu:
- ✅ L'ordre devient: Bookmark 1, Bookmark 3, Bookmark 2
- ✅ Aucun groupe n'est créé par erreur
- ✅ L'ordre persiste après reload
Résultat: ✅ PASS / ⬜ FAIL
✅ Test 7: Sauvegarde atomique et backup
Objectif: Vérifier que la sauvegarde crée un backup et est atomique.
Étapes:
- Ajouter un bookmark
- Attendre la sauvegarde automatique (800ms)
- Naviguer vers
vault/.obsidian/
- Vérifier les fichiers
Résultat attendu:
- ✅
bookmarks.json
existe - ✅
bookmarks.json.bak
existe (backup) - ✅ Les deux fichiers sont valides JSON
- ✅
bookmarks.json
contient le nouveau bookmark
Test d'intégrité:
5. Corrompre manuellement bookmarks.json
(ajouter du texte invalide)
6. Renommer bookmarks.json.bak
→ bookmarks.json
7. Recharger l'app
Résultat attendu:
- ✅ L'app charge le backup sans erreur
Résultat: ✅ PASS / ⬜ FAIL
✅ Test 8: Préservation de l'ordre JSON
Objectif: Vérifier que l'ordre n'est pas modifié.
Étapes:
- Créer 3 bookmarks dans cet ordre:
- Z-bookmark.md
- A-bookmark.md
- M-bookmark.md
- Sauvegarder
- Ouvrir
vault/.obsidian/bookmarks.json
Résultat attendu:
- ✅ L'ordre dans le JSON est identique: Z, A, M
- ❌ L'ordre n'est PAS alphabétique (A, M, Z)
Résultat: ⬜ PASS / ⬜ FAIL
✅ Test 9: Groupes sans titre
Objectif: Vérifier le fallback pour les groupes.
Étapes:
- Dans le JSON, créer manuellement un groupe sans
title
:
{
"type": "group",
"ctime": 1234567890,
"items": []
}
- Recharger l'app
Résultat attendu:
- ✅ Le groupe affiche "(Sans nom)"
- ✅ Le groupe est toujours fonctionnel (on peut y ajouter des items)
Résultat: ✅ PASS / ⬜ FAIL
✅ Test 10: Fichiers avec path complexe
Objectif: Tester le basename avec différents formats.
Étapes:
- Créer des bookmarks sans title pour:
simple.md
folder/nested.md
deep/very/long/path/document.md
path with spaces/file.md
accents/éléphant.md
Résultat attendu:
- ✅ "simple.md" affiche "simple.md"
- ✅ "folder/nested.md" affiche "nested.md"
- ✅ "deep/very/long/path/document.md" affiche "document.md"
- ✅ "path with spaces/file.md" affiche "file.md"
- ✅ "accents/éléphant.md" affiche "éléphant.md"
Résultat: ⬜ PASS / ⬜ FAIL
✅ Test 11: Suppression d'un path présent plusieurs fois
Objectif: removePathEverywhere()
doit retirer toutes les occurrences.
Préparation:
- Ajouter manuellement le même path dans 2 groupes différents:
{
"items": [
{
"type": "group",
"ctime": 1,
"title": "Group A",
"items": [
{ "type": "file", "ctime": 10, "path": "test.md" }
]
},
{
"type": "group",
"ctime": 2,
"title": "Group B",
"items": [
{ "type": "file", "ctime": 20, "path": "test.md" }
]
}
]
}
Étapes:
- Ouvrir
test.md
- Ouvrir la modal bookmark
- Cliquer sur "Delete"
Résultat attendu:
- ✅ Le bookmark disparaît de Group A
- ✅ Le bookmark disparaît de Group B
- ✅ Les deux groupes sont maintenant vides
Résultat: ⬜ PASS / ⬜ FAIL
✅ Test 12: Responsive (Desktop vs Mobile)
Objectif: Vérifier l'adaptabilité.
Desktop (>1024px):
- Ouvrir l'app en plein écran
- Naviguer vers Bookmarks
Résultat attendu:
- ✅ Panel latéral visible (fixe)
- ✅ Largeur ~320-400px
- ✅ Barre de recherche visible
- ✅ Boutons d'action visibles
Mobile (<1024px):
- Réduire la fenêtre ou utiliser DevTools mode mobile
- Naviguer vers Bookmarks
Résultat attendu:
- ✅ Panel en plein écran (drawer)
- ✅ Navigation facile (pas de scroll horizontal)
- ✅ Boutons assez grands pour le tactile (≥44px)
Résultat: ✅ PASS / ⬜ FAIL
✅ Test 13: Thème dark/light
Objectif: Vérifier le respect des thèmes.
Étapes:
- Basculer en mode dark (si disponible)
- Observer le panneau Bookmarks
Résultat attendu:
- ✅ Fond sombre (
bg-gray-900
) - ✅ Texte clair (
text-gray-100
) - ✅ Bordures visibles
- ✅ Contraste suffisant (lisible)
Étapes: 3. Basculer en mode light
Résultat attendu:
- ✅ Fond clair (
bg-white
) - ✅ Texte sombre (
text-gray-900
) - ✅ Pas de vestiges du mode dark
Résultat: ✅ PASS / ⬜ FAIL
✅ Test 14: Validation JSON (données corrompues)
Objectif: Vérifier que l'app ne crash pas avec un JSON invalide.
Étapes:
- Modifier
bookmarks.json
pour le corrompre:
{
"items": [
{
"type": "invalid-type",
"ctime": "not-a-number"
}
]
}
- Recharger l'app
Résultat attendu:
- ✅ Un message d'erreur clair s'affiche
- ✅ L'app ne crash pas
- ✅ On peut créer un nouveau bookmark (qui réinitialise le fichier)
Résultat: ⬜ PASS / ⬜ FAIL
✅ Test 15: Auto-save (debounce)
Objectif: Vérifier que l'auto-save fonctionne.
Étapes:
- Ajouter un bookmark
- Observer le panneau (indicateur "Saving...")
- Attendre 800ms
- Vérifier que le fichier a été écrit
Résultat attendu:
- ✅ "Saving..." apparaît brièvement
- ✅ Après 800ms, le fichier est mis à jour
- ✅
isDirty
passe àfalse
Test de debounce: 5. Faire 3 modifications rapides (<800ms entre chaque) 6. Attendre 800ms après la dernière
Résultat attendu:
- ✅ Une seule sauvegarde est déclenchée (pas 3)
- ✅ Le fichier final contient toutes les modifications
Résultat: ⬜ PASS / ⬜ FAIL
Tests de régression
⚠️ Test R1: Compatibilité Obsidian
Objectif: S'assurer qu'Obsidian peut lire le fichier généré.
Étapes:
- Créer plusieurs bookmarks dans ObsiViewer
- Ouvrir la vault dans Obsidian
- Ouvrir le panneau Bookmarks dans Obsidian
Résultat attendu:
- ✅ Tous les bookmarks sont visibles
- ✅ La hiérarchie est respectée
- ✅ Les titres sont corrects
- ✅ Cliquer sur un bookmark ouvre le bon fichier
Résultat: ⬜ PASS / ⬜ FAIL
⚠️ Test R2: Modifications depuis Obsidian
Objectif: Vérifier la bidirectionnalité.
Étapes:
- Dans Obsidian, créer un nouveau bookmark
- Ajouter un groupe et y placer le bookmark
- Sauvegarder dans Obsidian
- Recharger ObsiViewer
Résultat attendu:
- ✅ Le nouveau bookmark apparaît
- ✅ Le groupe est visible
- ✅ Pas de corruption de données
Résultat: ⬜ PASS / ⬜ FAIL
⚠️ Test R3: Champs inconnus préservés
Objectif: Ne pas perdre les extensions Obsidian.
Étapes:
- Ajouter manuellement dans
bookmarks.json
:
{
"type": "file",
"ctime": 123,
"path": "test.md",
"color": "#ff0000",
"icon": "star"
}
- Charger dans ObsiViewer
- Modifier le titre du bookmark
- Sauvegarder
- Vérifier le JSON
Résultat attendu:
- ✅
color
eticon
sont toujours présents - ✅ Seul
title
a été modifié
Résultat: ⬜ PASS / ⬜ FAIL
Récapitulatif
Statistiques
- Tests critiques: 15
- Tests de régression: 3
- Total: 18 tests
Résultats
- ✅ PASS: ___ / 18
- ❌ FAIL: ___ / 18
- ⏭️ SKIP: ___ / 18
Notes
Ajouter ici toute observation, bug trouvé, ou amélioration suggérée.
Date du test: ___________ Testeur: ___________ Version: 2.0.0 Environnement: Node v___ / Browser ___________