2026-03-14 03:46:34 +00:00
|
|
|
import { describe, expect, it, vi } from "vitest";
|
2026-03-13 23:56:39 +00:00
|
|
|
import { BrowserProfileUnavailableError } from "../errors.js";
|
|
|
|
|
import { registerBrowserBasicRoutes } from "./basic.js";
|
2026-03-14 00:33:00 +00:00
|
|
|
import { createBrowserRouteApp, createBrowserRouteResponse } from "./test-helpers.js";
|
2026-03-13 23:56:39 +00:00
|
|
|
|
2026-03-14 03:46:34 +00:00
|
|
|
vi.mock("../chrome-mcp.js", () => ({
|
|
|
|
|
getChromeMcpPid: vi.fn(() => 4321),
|
|
|
|
|
}));
|
|
|
|
|
|
2026-03-13 23:56:39 +00:00
|
|
|
describe("basic browser routes", () => {
|
|
|
|
|
it("maps existing-session status failures to JSON browser errors", async () => {
|
2026-03-14 00:33:00 +00:00
|
|
|
const { app, getHandlers } = createBrowserRouteApp();
|
2026-03-13 23:56:39 +00:00
|
|
|
registerBrowserBasicRoutes(app, {
|
|
|
|
|
state: () => ({
|
|
|
|
|
resolved: {
|
|
|
|
|
enabled: true,
|
|
|
|
|
headless: false,
|
|
|
|
|
noSandbox: false,
|
|
|
|
|
executablePath: undefined,
|
|
|
|
|
},
|
|
|
|
|
profiles: new Map(),
|
|
|
|
|
}),
|
|
|
|
|
forProfile: () =>
|
|
|
|
|
({
|
|
|
|
|
profile: {
|
|
|
|
|
name: "chrome-live",
|
|
|
|
|
driver: "existing-session",
|
2026-03-14 03:46:34 +00:00
|
|
|
cdpPort: 0,
|
|
|
|
|
cdpUrl: "",
|
2026-03-13 23:56:39 +00:00
|
|
|
color: "#00AA00",
|
|
|
|
|
attachOnly: true,
|
|
|
|
|
},
|
|
|
|
|
isHttpReachable: async () => {
|
|
|
|
|
throw new BrowserProfileUnavailableError("attach failed");
|
|
|
|
|
},
|
|
|
|
|
isReachable: async () => true,
|
|
|
|
|
}) as never,
|
|
|
|
|
} as never);
|
|
|
|
|
|
|
|
|
|
const handler = getHandlers.get("/");
|
|
|
|
|
expect(handler).toBeTypeOf("function");
|
|
|
|
|
|
2026-03-14 00:33:00 +00:00
|
|
|
const response = createBrowserRouteResponse();
|
2026-03-13 23:56:39 +00:00
|
|
|
await handler?.({ params: {}, query: { profile: "chrome-live" } }, response.res);
|
|
|
|
|
|
|
|
|
|
expect(response.statusCode).toBe(409);
|
|
|
|
|
expect(response.body).toMatchObject({ error: "attach failed" });
|
|
|
|
|
});
|
2026-03-14 03:46:34 +00:00
|
|
|
|
|
|
|
|
it("reports Chrome MCP transport without fake CDP fields", async () => {
|
|
|
|
|
const { app, getHandlers } = createBrowserRouteApp();
|
|
|
|
|
registerBrowserBasicRoutes(app, {
|
|
|
|
|
state: () => ({
|
|
|
|
|
resolved: {
|
|
|
|
|
enabled: true,
|
|
|
|
|
headless: false,
|
|
|
|
|
noSandbox: false,
|
|
|
|
|
executablePath: undefined,
|
|
|
|
|
},
|
|
|
|
|
profiles: new Map(),
|
|
|
|
|
}),
|
|
|
|
|
forProfile: () =>
|
|
|
|
|
({
|
|
|
|
|
profile: {
|
|
|
|
|
name: "chrome-live",
|
|
|
|
|
driver: "existing-session",
|
|
|
|
|
cdpPort: 0,
|
|
|
|
|
cdpUrl: "",
|
|
|
|
|
color: "#00AA00",
|
|
|
|
|
attachOnly: true,
|
|
|
|
|
},
|
|
|
|
|
isHttpReachable: async () => true,
|
|
|
|
|
isReachable: async () => true,
|
|
|
|
|
}) as never,
|
|
|
|
|
} as never);
|
|
|
|
|
|
|
|
|
|
const handler = getHandlers.get("/");
|
|
|
|
|
expect(handler).toBeTypeOf("function");
|
|
|
|
|
|
|
|
|
|
const response = createBrowserRouteResponse();
|
|
|
|
|
await handler?.({ params: {}, query: { profile: "chrome-live" } }, response.res);
|
|
|
|
|
|
|
|
|
|
expect(response.statusCode).toBe(200);
|
|
|
|
|
expect(response.body).toMatchObject({
|
|
|
|
|
profile: "chrome-live",
|
|
|
|
|
driver: "existing-session",
|
|
|
|
|
transport: "chrome-mcp",
|
|
|
|
|
running: true,
|
|
|
|
|
cdpPort: null,
|
|
|
|
|
cdpUrl: null,
|
|
|
|
|
pid: 4321,
|
|
|
|
|
});
|
|
|
|
|
});
|
2026-03-13 23:56:39 +00:00
|
|
|
});
|