Files
hyperframes/packages/cli/src/utils/openBrowser.test.ts
T
AnoKno 3902a9a82b feat(cli): add remote debugging port option
Adds a Chromium remote debugging port flag for preview and play.

The flag is only passed when launching an explicit browser/profile.

HyperFrames still does not own CDP automation.
2026-05-25 15:38:41 -04:00

117 lines
3.5 KiB
TypeScript

import { describe, it, expect } from "vitest";
import { buildBrowserArgs, parseRemoteDebuggingPort } from "./openBrowser.js";
describe("buildBrowserArgs", () => {
it("returns only the URL when no options are given", () => {
expect(buildBrowserArgs("http://localhost:3002", {})).toEqual(["http://localhost:3002"]);
});
it("returns only the URL when only browserPath is set (args do not include it)", () => {
// browserPath is used by the caller to decide spawn vs open, not in args
expect(buildBrowserArgs("http://localhost:3002", { browserPath: "/usr/bin/chromium" })).toEqual(
["http://localhost:3002"],
);
});
it("prepends --user-data-dir before the URL", () => {
expect(
buildBrowserArgs("http://localhost:3002", {
userDataDir: "D:\\tmp\\profile",
}),
).toEqual(["--user-data-dir=D:\\tmp\\profile", "http://localhost:3002"]);
});
it("prepends --user-data-dir with both options", () => {
expect(
buildBrowserArgs("http://localhost:3002", {
browserPath: "/usr/bin/chromium",
userDataDir: "/tmp/hf-profile",
}),
).toEqual(["--user-data-dir=/tmp/hf-profile", "http://localhost:3002"]);
});
it("handles paths with spaces", () => {
expect(
buildBrowserArgs("http://localhost:3002", {
userDataDir: "C:\\Documents and Settings\\profile",
}),
).toEqual(["--user-data-dir=C:\\Documents and Settings\\profile", "http://localhost:3002"]);
});
it("prepends --remote-debugging-port before the URL", () => {
expect(
buildBrowserArgs("http://localhost:3002", {
browserPath: "/usr/bin/chromium",
userDataDir: "/tmp/hf-profile",
remoteDebuggingPort: 9222,
}),
).toEqual([
"--user-data-dir=/tmp/hf-profile",
"--remote-debugging-port=9222",
"http://localhost:3002",
]);
});
it("includes all flags together", () => {
expect(
buildBrowserArgs("http://localhost:3002", {
browserPath: "/usr/bin/chromium",
userDataDir: "/tmp/hf-profile",
remoteDebuggingPort: 9222,
}),
).toEqual([
"--user-data-dir=/tmp/hf-profile",
"--remote-debugging-port=9222",
"http://localhost:3002",
]);
});
});
describe("parseRemoteDebuggingPort", () => {
it("returns undefined for undefined", () => {
expect(parseRemoteDebuggingPort(undefined)).toBeUndefined();
});
it("returns undefined for empty string", () => {
expect(parseRemoteDebuggingPort("")).toBeUndefined();
});
it("parses a valid port number", () => {
expect(parseRemoteDebuggingPort("9222")).toBe(9222);
});
it("parses port 1 (minimum)", () => {
expect(parseRemoteDebuggingPort("1")).toBe(1);
});
it("parses port 65535 (maximum)", () => {
expect(parseRemoteDebuggingPort("65535")).toBe(65535);
});
it("rejects 0", () => {
expect(() => parseRemoteDebuggingPort("0")).toThrow(
"--remote-debugging-port must be an integer between 1 and 65535",
);
});
it("rejects negative numbers", () => {
expect(() => parseRemoteDebuggingPort("-1")).toThrow();
});
it("rejects non-numeric input", () => {
expect(() => parseRemoteDebuggingPort("abc")).toThrow();
});
it("rejects trailing non-digits (no parseInt leakage)", () => {
expect(() => parseRemoteDebuggingPort("9222abc")).toThrow();
});
it("rejects numbers above 65535", () => {
expect(() => parseRemoteDebuggingPort("70000")).toThrow();
});
it("rejects decimals", () => {
expect(() => parseRemoteDebuggingPort("22.5")).toThrow();
});
});