diff --git a/tests/draco-alertes.test.js b/tests/draco-alertes.test.js new file mode 100644 index 0000000..dc5371f --- /dev/null +++ b/tests/draco-alertes.test.js @@ -0,0 +1,84 @@ +// Tests unitaires (node:test) du module partagé draco-alertes.js. +// Exécutés dans la sandbox : node --test draco-alertes.test.js +// Aucune donnée inventée : les payloads reprennent la forme exacte +// des API réelles (Flowdeck /api/notifications, TikTak +// /api/notifications, Kanbante /api/events). +const test = require("node:test"); +const assert = require("node:assert/strict"); +const t = require("../static/js/draco-alertes.js"); + +test("resolveUrls: config explicite > hote -dev > href > defaut prod", () => { + const prod = t.resolveUrls({ hostname: "tiktak.dracodev.net", tabHrefs: {} }); + assert.equal(prod.tiktak, "https://tiktak.dracodev.net/"); + const dev = t.resolveUrls({ hostname: "tiktak-dev.dracodev.net", tabHrefs: {} }); + assert.equal(dev.flowdeck, "https://flowdeck-dev.dracodev.net/"); + assert.equal(dev.obsigate, "https://og-dev.dracodev.net/"); + const explicit = t.resolveUrls({ + hostname: "tiktak-dev.dracodev.net", + configUrls: { flowdeck: "https://flowdeck.dracodev.net/" }, + }); + assert.equal(explicit.flowdeck, "https://flowdeck.dracodev.net/"); + const href = t.resolveUrls({ + hostname: "example.org", + tabHrefs: { kanbante: "https://kanbante-dev.dracodev.net/" }, + }); + assert.equal(href.kanbante, "https://kanbante-dev.dracodev.net/"); + const token = t.resolveUrls({ hostname: "x", tabHrefs: { tiktak: "{{URL_TIKTAK}}" } }); + assert.equal(token.tiktak, "https://tiktak.dracodev.net/"); + assert.equal(t.isDevHost("tiktak-dev.dracodev.net.evil.com"), false); + assert.equal(t.isDevHost("x-dev.dracodev.net"), true); +}); + +test("normalizeFlowdeck: non lues actives, lien = base + url", () => { + const items = t.normalizeFlowdeck("https://flowdeck.dracodev.net/", { + notifications: [ + { id: 1, ntype: "mention", title: "Mention", message: "voir page", url: "/collections/3", is_read: 0, created_at: "2026-10-28T10:00:00" }, + { id: 2, ntype: "reminder", title: "Rappel", message: "", url: "", is_read: 1, created_at: "2026-10-27T09:00:00" }, + ], + unread: 1, + }); + assert.equal(items.length, 2); + assert.equal(items[0].active, true); + assert.equal(items[0].state, "active"); + assert.equal(items[0].url, "https://flowdeck.dracodev.net/collections/3"); + assert.equal(items[1].active, false); + assert.equal(items[1].url, "https://flowdeck.dracodev.net/"); +}); + +test("normalizeTiktak: lien tache, sinon page notifications", () => { + const items = t.normalizeTiktak("https://tiktak.dracodev.net/", [ + { id: 7, kind: "reminder", title: "Rappel", body: "tache", task_id: 42, is_read: 0, created_at: "2026-10-28T08:00:00" }, + { id: 8, kind: "share", title: "Partage", body: "", task_id: null, is_read: 1, created_at: "2026-10-26T08:00:00" }, + ]); + assert.equal(items[0].url, "https://tiktak.dracodev.net/?task=42"); + assert.equal(items[1].url, "https://tiktak.dracodev.net/notifications"); + assert.equal(items[0].active, true); +}); + +test("normalizeKanbante: jamais actif (pas d'etat lu/non lu), lien board", () => { + const items = t.normalizeKanbante("https://kanbante.dracodev.net/", { + events: [ + { id: 9, repo_full_name: "Projets/fusion-trois-apps", issue_number: 69, event_type: "commented", from_column: "", to_column: "", created_at: "2026-10-28T11:50:00" }, + { id: 10, repo_full_name: "Projets/fusion-trois-apps", issue_number: 69, event_type: "moved", from_column: "todo", to_column: "review", created_at: "2026-10-28T12:00:00" }, + ], + }); + assert.equal(items.length, 2); + assert.ok(items.every((i) => i.active === false)); + assert.equal(items[0].url, "https://kanbante.dracodev.net/board/Projets/fusion-trois-apps"); + assert.match(items[0].title, /#69/); +}); + +test("sortAlerts + countActive: actives d'abord, date decroissante", () => { + const list = [ + { app: "tiktak", active: false, date: "2026-10-28T12:00:00" }, + { app: "flowdeck", active: true, date: "2026-10-26T12:00:00" }, + { app: "flowdeck", active: true, date: "2026-10-28T12:00:00" }, + { app: "kanbante", active: false, date: "" }, + ]; + const sorted = t.sortAlerts(list); + assert.equal(sorted[0].date, "2026-10-28T12:00:00"); + assert.equal(sorted[0].active, true); + assert.equal(sorted[1].date, "2026-10-26T12:00:00"); + assert.equal(sorted[3].date, ""); + assert.equal(t.countActive(list), 2); +});