package indexer import ( "os" "path/filepath" "testing" ) func TestIndexerLoadAndSearchByTag(t *testing.T) { tmp := t.TempDir() files := map[string]string{ "note1.md": "---\ntags: [tag1, tag2]\n---\ncontenu 1\n", "note2.md": "---\ntags: tag2\n---\ncontenu 2\n", "note3.md": "---\n---\ncontenu 3\n", } for name, content := range files { path := filepath.Join(tmp, name) if err := os.WriteFile(path, []byte(content), 0o644); err != nil { t.Fatalf("ecriture fichier %s: %v", name, err) } } idx := New() if err := idx.Load(tmp); err != nil { t.Fatalf("chargement index: %v", err) } cases := map[string][]string{ "tag1": []string{"note1.md"}, "TAG2": []string{"note1.md", "note2.md"}, "tag3": nil, "": nil, } for tag, expected := range cases { results := idx.SearchByTag(tag) if len(results) != len(expected) { t.Errorf("tag %q: taille %d attendue %d", tag, len(results), len(expected)) continue } for i, file := range expected { if results[i] != file { t.Errorf("tag %q: resultat[%d]=%s attendu %s", tag, i, results[i], file) } } } } func TestIndexerSearchDocuments(t *testing.T) { tmp := t.TempDir() files := map[string]string{ "projet-alpha.md": `--- title: Projet Alpha tags: [projet, alpha] --- Le projet Alpha explore une nouvelle architecture. `, "journal.md": `--- title: Journal Quotidien tags: [journal] --- Aujourd'hui, nous avons discuté du projet Bêta et des priorités. `, "guide.md": `--- title: Guide Pratique tags: [documentation, guide] --- Ce guide explique comment démarrer rapidement. `, } for name, content := range files { path := filepath.Join(tmp, name) if err := os.WriteFile(path, []byte(content), 0o644); err != nil { t.Fatalf("écriture fichier %s: %v", name, err) } } idx := New() if err := idx.Load(tmp); err != nil { t.Fatalf("chargement index: %v", err) } type expected struct { query string results []string } tests := []expected{ {query: "projet", results: []string{"journal.md", "projet-alpha.md"}}, {query: "title:\"Projet Alpha\"", results: []string{"projet-alpha.md"}}, {query: "tag:guide", results: []string{"guide.md"}}, {query: "tag:projet projet", results: []string{"projet-alpha.md"}}, {query: "tag:journal beta", results: []string{"journal.md"}}, {query: "path:guide démarrer", results: []string{"guide.md"}}, } for _, tt := range tests { results := idx.SearchDocuments(tt.query) paths := make([]string, len(results)) for i, res := range results { paths[i] = res.Path } if len(paths) != len(tt.results) { t.Fatalf("query %q: taille %d attendue %d (résultats: %v)", tt.query, len(paths), len(tt.results), paths) } for idxRes, path := range tt.results { if paths[idxRes] != path { t.Fatalf("query %q: résultat[%d]=%s attendu %s", tt.query, idxRes, paths[idxRes], path) } } } }