import { afterEach, describe, expect, it } from "vitest"; import { startBrowserBridgeServer, stopBrowserBridgeServer } from "./bridge-server.js"; import { DEFAULT_OPENCLAW_BROWSER_COLOR, DEFAULT_OPENCLAW_BROWSER_PROFILE_NAME, } from "./constants.js"; function buildResolvedConfig() { return { enabled: true, evaluateEnabled: false, controlPort: 0, cdpProtocol: "http", cdpHost: "127.0.0.1", cdpIsLoopback: true, remoteCdpTimeoutMs: 1500, remoteCdpHandshakeTimeoutMs: 3000, color: DEFAULT_OPENCLAW_BROWSER_COLOR, executablePath: undefined, headless: true, noSandbox: false, attachOnly: true, defaultProfile: DEFAULT_OPENCLAW_BROWSER_PROFILE_NAME, profiles: { [DEFAULT_OPENCLAW_BROWSER_PROFILE_NAME]: { cdpPort: 1, color: DEFAULT_OPENCLAW_BROWSER_COLOR, }, }, } as const; } describe("startBrowserBridgeServer auth", () => { const servers: Array<{ stop: () => Promise }> = []; afterEach(async () => { while (servers.length) { const s = servers.pop(); if (s) { await s.stop(); } } }); it("rejects unauthenticated requests when authToken is set", async () => { const bridge = await startBrowserBridgeServer({ resolved: buildResolvedConfig(), authToken: "secret-token", }); servers.push({ stop: () => stopBrowserBridgeServer(bridge.server) }); const unauth = await fetch(`${bridge.baseUrl}/`); expect(unauth.status).toBe(401); const authed = await fetch(`${bridge.baseUrl}/`, { headers: { Authorization: "Bearer secret-token" }, }); expect(authed.status).toBe(200); }); it("accepts x-openclaw-password when authPassword is set", async () => { const bridge = await startBrowserBridgeServer({ resolved: buildResolvedConfig(), authPassword: "secret-password", }); servers.push({ stop: () => stopBrowserBridgeServer(bridge.server) }); const unauth = await fetch(`${bridge.baseUrl}/`); expect(unauth.status).toBe(401); const authed = await fetch(`${bridge.baseUrl}/`, { headers: { "x-openclaw-password": "secret-password" }, }); expect(authed.status).toBe(200); }); it("requires auth params", async () => { await expect( startBrowserBridgeServer({ resolved: buildResolvedConfig(), }), ).rejects.toThrow(/requires auth/i); }); });