fix(browser): cover cdp attach fallbacks

This commit is contained in:
danzaio
2026-06-10 14:37:58 -03:00
parent b73c9bce94
commit e6b0e76341
4 changed files with 47 additions and 15 deletions
@@ -1,5 +1,6 @@
import { describe, expect, test } from "bun:test";
import { pickElectronTarget } from "@oh-my-pi/pi-coding-agent/tools/browser/attach";
import { normalizeConnectedCdpUrl } from "@oh-my-pi/pi-coding-agent/tools/browser/registry";
import type { Browser, Page, Target } from "puppeteer-core";
interface FakePageOptions {
@@ -36,4 +37,33 @@ describe("pickElectronTarget", () => {
await expect(pickElectronTarget(browser, "google")).resolves.toBe(page);
expect(pagesCalled).toBe(false);
});
test("falls back to browser.pages when discovered targets have no usable page", async () => {
const page = fakePage({ url: "https://example.com/", title: "Example" });
const browser = {
targets: () => [fakeTarget("browser", null), fakeTarget("service_worker", null)],
pages: async () => [page],
} as unknown as Browser;
await expect(pickElectronTarget(browser)).resolves.toBe(page);
});
test("reports available pages when the matcher misses", async () => {
const page = fakePage({ url: "https://example.com/", title: "Example" });
const browser = {
targets: () => [fakeTarget("page", page)],
pages: async () => [],
} as unknown as Browser;
await expect(pickElectronTarget(browser, "missing")).rejects.toThrow(
'No page target matched "missing". Available pages:\n- Example https://example.com/',
);
});
test("rejects websocket cdp_url values with an actionable diagnostic", () => {
expect(() => normalizeConnectedCdpUrl("ws://127.0.0.1:9222/devtools/browser/id")).toThrow(
"browser app.cdp_url must be the HTTP CDP discovery endpoint",
);
expect(normalizeConnectedCdpUrl("http://127.0.0.1:9222/")).toBe("http://127.0.0.1:9222");
});
});