import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { extractTokenFromCookie, extractTokenFromHeader, generateToken } from "./auth"; import { getConfig, updateAppearanceConfig, type Config } from "./config"; import { generateTotpCode } from "./mfa"; import { getBrandingImage } from "./db"; import { createUser, deleteUser, enableUserMfa, getUserById, setUserMfaSecret, } from "./users"; import { handleAuthRoutes } from "./server/routes/auth-routes"; import { handleMiscRoutes } from "./server/routes/misc-routes"; const PASSWORD = "Aa1!AuthMfaTest_2026"; const mockServer = { requestIP: () => ({ address: "127.0.0.1" }), }; let originalAppearance: Config["appearance"]; const uploadPublicRoot = "."; beforeAll(() => { originalAppearance = JSON.parse(JSON.stringify(getConfig().appearance)); }); afterAll(async () => { if (originalAppearance) { await updateAppearanceConfig(originalAppearance.customCSS, originalAppearance.loginBranding); } }); describe("auth token extraction", () => { test("extractTokenFromHeader returns bearer token", () => { expect(extractTokenFromHeader("Bearer abc123")).toBe("abc123"); expect(extractTokenFromHeader("Basic abc123")).toBeNull(); }); test("extractTokenFromCookie finds overlord_token", () => { const cookie = "other=1; overlord_token=token123; theme=dark"; expect(extractTokenFromCookie(cookie)).toBe("token123"); }); test("extractTokenFromCookie returns null when missing", () => { expect(extractTokenFromCookie("foo=bar")).toBeNull(); }); }); describe("account onboarding", () => { test("is pending for a new account and remains completed at the account level", async () => { const username = `onboarding_${Date.now().toString(36)}`; const created = await createUser(username, PASSWORD, "viewer", "test"); expect(created.success).toBe(true); try { const user = getUserById(created.userId!); expect(user).toBeTruthy(); const token = await generateToken(user!); const headers = { Cookie: `overlord_token=${token}` }; const meUrl = new URL("https://localhost/api/auth/me"); const before = await handleAuthRoutes(new Request(meUrl, { headers }), meUrl, mockServer); expect(before?.status).toBe(200); expect(before?.headers.get("cache-control")).toContain("no-store"); expect((await before!.json()).needsOnboarding).toBe(true); const completeUrl = new URL("https://localhost/api/auth/onboarding/complete"); const completed = await handleAuthRoutes( new Request(completeUrl, { method: "POST", headers }), completeUrl, mockServer, ); expect(completed?.status).toBe(200); expect(completed?.headers.get("cache-control")).toContain("no-store"); const after = await handleAuthRoutes(new Request(meUrl, { headers }), meUrl, mockServer); expect(after?.status).toBe(200); expect((await after!.json()).needsOnboarding).toBe(false); const repeated = await handleAuthRoutes( new Request(completeUrl, { method: "POST", headers }), completeUrl, mockServer, ); expect(repeated?.status).toBe(200); expect((await repeated!.json()).needsOnboarding).toBe(false); } finally { deleteUser(created.userId!); } }); }); describe("login branding", () => { test("returns configured public login branding", async () => { const url = new URL("https://localhost/api/login/branding"); const res = await handleAuthRoutes(new Request(url), url, mockServer); expect(res?.status).toBe(200); const body = (await res!.json()) as any; expect(body).toEqual(originalAppearance.loginBranding); }); test("returns sanitized enterprise branding fields", async () => { await updateAppearanceConfig("", { productName: "Acme SOC", navName: "Acme Console", title: "Welcome to Acme", subtitle: "Use your Acme identity", iconClass: "fa-solid fa-shield-halved