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					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});