navbar.test.ts

1.7 KB · raw

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					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			expect(nodes.find((node) => node.tag === "a")?.href).toBe("/admin");54			expect(nodes.find((node) => node.tag === "a")?.textContent).toBe("admin");55		}56	}57});