Files
oh-my-pi/packages/coding-agent/test/tools/browser-tab-evaluate.test.ts
T
can1357 3047c27c33 fix(test): skip real-browser tab.evaluate test when chromium cannot exec
- Exported ensureChromiumExecutable so the test can probe launchability.
- CI runner holds the downloaded Chrome but lacks libnspr4 & co., so the
  binary fails at dynamic-link time; probe --version and skipIf instead
  of failing the release run.
2026-07-14 02:12:21 +02:00

60 lines
1.9 KiB
TypeScript

import { describe, expect, it } from "bun:test";
import { Settings } from "@oh-my-pi/pi-coding-agent/config/settings";
import type { ToolSession } from "@oh-my-pi/pi-coding-agent/sdk";
import { BrowserTool } from "@oh-my-pi/pi-coding-agent/tools/browser";
import { ensureChromiumExecutable } from "@oh-my-pi/pi-coding-agent/tools/browser/launch";
function makeSession(): ToolSession {
return {
cwd: "/tmp/test",
hasUI: false,
getSessionFile: () => null,
getSessionSpawns: () => "*",
settings: Settings.isolated({ "browser.headless": true }),
};
}
/**
* Whether the Chromium puppeteer resolves can actually execute on this host.
* CI runners without Chrome's system libraries (libnspr4 & co.) hold the
* downloaded binary but cannot exec it — probe with --version and skip
* instead of failing.
*/
async function chromiumCanLaunch(): Promise<boolean> {
try {
const executable = await ensureChromiumExecutable();
if (!executable) return false;
const probe = Bun.spawnSync([executable, "--version"], { stdout: "ignore", stderr: "ignore" });
return probe.exitCode === 0;
} catch {
return false;
}
}
const CHROMIUM_AVAILABLE = await chromiumCanLaunch();
describe.skipIf(!CHROMIUM_AVAILABLE)("browser tab evaluation", () => {
// Launches real headless Chromium; CI cold start easily exceeds bun's 5s default.
it("runs tab.evaluate in the page's main JavaScript world", async () => {
const tool = new BrowserTool(makeSession());
const name = `main-world-${process.pid}`;
try {
await tool.execute("open", {
action: "open",
name,
url: "data:text/html,<script>globalThis.__ompMainWorld = 42</script>",
});
const result = await tool.execute("run", {
action: "run",
name,
code: "return await tab.evaluate(() => globalThis.__ompMainWorld);",
});
expect(result.content).toEqual([{ type: "text", text: "42" }]);
} finally {
await tool.execute("close", { action: "close", name, kill: true });
}
}, 30_000);
});