1import { expect, test } from "bun:test";2import { runInNewContext } from "node:vm";34const script = await Bun.file(new URL("../public/js/kepr.js", import.meta.url)).text();5const navbar = script.slice(6 script.indexOf("async function navbarLogin()"),7 script.indexOf("// Signed in, a repo page"),8);910test("navbar offers admin and protected log out only after confirming a live session", async () => {11 for (const [cookie, status, logout] of [12 ["", 200, false],13 ["kepr_editor=1", 401, false],14 ["kepr_editor=1", 200, true],15 ] as const) {16 const nodes: Record<string, unknown>[] = [];17 let replacement: unknown;18 const token = { name: "form", value: "session-form-token" };19 const document = {20 cookie,21 querySelector: () => ({22 replaceWith: (node: unknown) => {23 replacement = node;24 },25 }),26 createElement: (tag: string) => {27 const node: Record<string, unknown> = {28 tag,29 addEventListener: () => {},30 append: (...children: unknown[]) => {31 node.children = children;32 },33 };34 nodes.push(node);35 return node;36 },37 };38 await runInNewContext(`${navbar}\nnavbarLogin()`, {39 document,40 fetch: async () => ({ ok: status === 200, text: async () => "admin page" }),41 DOMParser: class {42 parseFromString() {43 return { querySelector: () => token };44 }45 },46 console,47 });48 expect(Boolean(replacement)).toBe(logout);49 if (logout) {50 expect(nodes[0]?.method).toBe("post");51 expect(nodes[0]?.action).toBe("/admin/sign-out");52 expect(nodes[0]?.children).toEqual([token, nodes[1]]);53 expect(nodes[1]?.textContent).toBe("log out");54 expect(nodes.find((node) => node.tag === "a")?.href).toBe("/admin");55 expect(nodes.find((node) => node.tag === "a")?.textContent).toBe("admin");56 }57 }58});