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 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 append: (...children: unknown[]) => {30 node.children = children;31 },32 };33 nodes.push(node);34 return node;35 },36 };37 await runInNewContext(`${navbar}\nnavbarLogin()`, {38 document,39 fetch: async () => ({ ok: status === 200, text: async () => "admin page" }),40 DOMParser: class {41 parseFromString() {42 return { querySelector: () => token };43 }44 },45 console,46 });47 expect(Boolean(replacement)).toBe(logout);48 if (logout) {49 expect(nodes[0]?.method).toBe("post");50 expect(nodes[0]?.action).toBe("/admin/sign-out");51 expect(nodes[0]?.children).toEqual([token, nodes[1]]);52 expect(nodes[1]?.textContent).toBe("log out");53 }54 }55});