diff --git a/tests/frontend/recherche.test.mjs b/tests/frontend/recherche.test.mjs new file mode 100644 index 0000000..2204084 --- /dev/null +++ b/tests/frontend/recherche.test.mjs @@ -0,0 +1,62 @@ +#!/usr/bin/env node +/** + * ObsiGate — tests de la logique pure de la page « Rechercher partout » + * (fusion #68), sans DOM ni jsdom : résolution des bases, liens + * profonds et normalisation des 4 formats d'API. + * + * Le fichier frontend/js/recherche.js est chargé en ESM (frontend/js + * est "type": "module") ; ses helpers sont exposés via + * globalThis.RecherchePartout. Usage : node tests/frontend/recherche.test.mjs + */ +import { strict as assert } from "node:assert"; +import { fileURLToPath, pathToFileURL } from "node:url"; +import path from "node:path"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const JS_FILE = path.resolve(__dirname, "..", "..", "frontend", "js", "recherche.js"); + +await import(pathToFileURL(JS_FILE).href); +const rp = globalThis.RecherchePartout; +assert.ok(rp, "RecherchePartout exposé"); + +let n = 0; +const ok = (cond, label) => { + assert.ok(cond, label); + n += 1; +}; + +ok(rp.isDevHost("og-dev.dracodev.net") === true, "dev reconnu"); +ok(rp.isDevHost("x-dev.dracodev.net.evil") === false, "hôte piège rejeté"); + +const b = rp.resolveBases({ + host: "og-dev.dracodev.net", + explicit: { tiktak: "https://tiktak-perso.example/" }, + barUrls: {}, + tabHrefs: {}, +}); +ok(b.tiktak === "https://tiktak-perso.example/", "explicite prioritaire"); +ok(b.obsigate === "https://og-dev.dracodev.net/", "dev pour l'hôte courant"); +ok(b.kanbante === "https://kanbante-dev.dracodev.net/", "dev avant href"); +ok( + rp.searchPath("obsigate", "café") === "api/search?q=caf%C3%A9&vault=all&limit=8", + "path ObsiGate", +); + +const items = rp.normalize( + "obsigate", + { results: [{ vault: "home-bruno", path: "Notes/Idée.md", title: "Idée", snippet: "extrait" }] }, + "https://og-dev.dracodev.net/", + "idée", +); +ok( + items[0].url === "https://og-dev.dracodev.net/#file=home-bruno:Notes%2FId%C3%A9e.md", + "lien profond ObsiGate", +); +ok( + rp.nativeSearchUrl("tiktak", "https://tiktak-dev.dracodev.net/", "q") === + "https://tiktak-dev.dracodev.net/search?q=q", + "repli TikTak", +); + +console.log(`recherche.test.mjs : ${n} assertions OK`);