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.jsonou le supprimer - Créer quelques notes de test dans 
vault/:vault/test1.mdvault/folder/test2.mdvault/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.jsonexiste - ✅ 
bookmarks.json.bakexiste (backup) - ✅ Les deux fichiers sont valides JSON
 - ✅ 
bookmarks.jsoncontient 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.mdfolder/nested.mddeep/very/long/path/document.mdpath with spaces/file.mdaccents/é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.jsonpour 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
 - ✅ 
isDirtypasse à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:
- ✅ 
coloreticonsont toujours présents - ✅ Seul 
titlea é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 ___________