test: expand browser existing-session coverage

This commit is contained in:
Peter Steinberger
2026-03-14 00:22:38 +00:00
parent 3c70e50af5
commit 766f13d37a
3 changed files with 102 additions and 0 deletions

View File

@@ -189,4 +189,22 @@ describe("chrome MCP page parsing", () => {
expect(tabs).toHaveLength(2);
expect(result).toBe(123);
});
it("clears failed pending sessions so the next call can retry", async () => {
let factoryCalls = 0;
const factory: ChromeMcpSessionFactory = async () => {
factoryCalls += 1;
if (factoryCalls === 1) {
throw new Error("attach failed");
}
return createFakeSession();
};
setChromeMcpSessionFactoryForTest(factory);
await expect(listChromeMcpTabs("chrome-live")).rejects.toThrow(/attach failed/);
const tabs = await listChromeMcpTabs("chrome-live");
expect(factoryCalls).toBe(2);
expect(tabs).toHaveLength(2);
});
});

View File

@@ -173,6 +173,64 @@ describe("existing-session browser routes", () => {
expect(chromeMcpMocks.takeChromeMcpScreenshot).toHaveBeenCalled();
});
it("allows ref screenshots for existing-session profiles", async () => {
const { app, postHandlers } = createApp();
registerBrowserAgentSnapshotRoutes(app, {
state: () => ({ resolved: { ssrfPolicy: undefined } }),
} as never);
const handler = postHandlers.get("/screenshot");
expect(handler).toBeTypeOf("function");
const response = createResponse();
await handler?.(
{
params: {},
query: {},
body: { ref: "btn-1", type: "jpeg" },
},
response.res,
);
expect(response.statusCode).toBe(200);
expect(response.body).toMatchObject({
ok: true,
path: "/tmp/fake.png",
targetId: "7",
});
expect(chromeMcpMocks.takeChromeMcpScreenshot).toHaveBeenCalledWith({
profileName: "chrome-live",
targetId: "7",
uid: "btn-1",
fullPage: false,
format: "jpeg",
});
});
it("rejects selector-based element screenshots for existing-session profiles", async () => {
const { app, postHandlers } = createApp();
registerBrowserAgentSnapshotRoutes(app, {
state: () => ({ resolved: { ssrfPolicy: undefined } }),
} as never);
const handler = postHandlers.get("/screenshot");
expect(handler).toBeTypeOf("function");
const response = createResponse();
await handler?.(
{
params: {},
query: {},
body: { element: "#submit" },
},
response.res,
);
expect(response.statusCode).toBe(400);
expect(response.body).toMatchObject({
error: expect.stringContaining("element screenshots are not supported"),
});
expect(chromeMcpMocks.takeChromeMcpScreenshot).not.toHaveBeenCalled();
});
it("fails closed for existing-session networkidle waits", async () => {
const { app, postHandlers } = createApp();
registerBrowserAgentActRoutes(app, {

View File

@@ -0,0 +1,26 @@
import { describe, expect, it } from "vitest";
import { matchBrowserUrlPattern } from "./url-pattern.js";
describe("browser url pattern matching", () => {
it("matches exact URLs", () => {
expect(matchBrowserUrlPattern("https://example.com/a", "https://example.com/a")).toBe(true);
expect(matchBrowserUrlPattern("https://example.com/a", "https://example.com/b")).toBe(false);
});
it("matches substring patterns without wildcards", () => {
expect(matchBrowserUrlPattern("example.com", "https://example.com/a")).toBe(true);
expect(matchBrowserUrlPattern("/dash", "https://example.com/app/dash")).toBe(true);
expect(matchBrowserUrlPattern("nope", "https://example.com/a")).toBe(false);
});
it("matches glob patterns", () => {
expect(matchBrowserUrlPattern("**/dash", "https://example.com/app/dash")).toBe(true);
expect(matchBrowserUrlPattern("https://example.com/*", "https://example.com/a")).toBe(true);
expect(matchBrowserUrlPattern("https://example.com/*", "https://other.com/a")).toBe(false);
});
it("rejects empty patterns", () => {
expect(matchBrowserUrlPattern("", "https://example.com")).toBe(false);
expect(matchBrowserUrlPattern(" ", "https://example.com")).toBe(false);
});
});