Files
2026-08-14 14:37:39 -07:00

73 lines
3.3 KiB
JavaScript

import assert from "node:assert/strict";
import test from "node:test";
import { WebSocketServer } from "ws";
import { CdpSession, createBrowserSession } from "../dist/cdp.js";
import { eventJsonLine, resultJsonLine } from "../dist/event-json.js";
test("CLI clips trace events without clipping the final deliverable", () => {
const output = "x".repeat(40_000);
const event = JSON.parse(eventJsonLine({ output }));
const result = JSON.parse(resultJsonLine({ output }));
assert.match(event.output, /chars omitted/);
assert.equal(result.result.output, output);
});
test("CDP session attaches once and routes page calls through the active session", async () => {
const requests = [];
let websocketExtensions = "not-connected";
const server = new WebSocketServer({ port: 0 });
await new Promise((resolve) => server.once("listening", resolve));
server.on("connection", (socket, request) => {
websocketExtensions = request.headers["sec-websocket-extensions"] ?? "";
socket.on("message", (raw) => {
const request = JSON.parse(raw.toString());
requests.push(request);
if (request.method === "Runtime.throwForTest") {
socket.send(JSON.stringify({ id: request.id, error: { message: "test CDP error" } }));
return;
}
const result = request.method === "Target.getTargets"
? { targetInfos: [{ type: "page", targetId: "page-1", url: "about:blank" }] }
: request.method === "Target.attachToTarget"
? { sessionId: "session-1" }
: request.method === "Runtime.evaluate"
? { result: { value: "Example" } }
: {};
socket.send(JSON.stringify({ id: request.id, result }));
});
});
const address = server.address();
assert.ok(address && typeof address === "object");
const client = new CdpSession({ cdpUrl: `ws://127.0.0.1:${address.port}` });
await client.connect();
const session = createBrowserSession(client);
assert.equal(websocketExtensions, "");
const result = await session.Runtime.evaluate({ expression: "document.title", returnByValue: true });
assert.equal(result.result.value, "Example");
let observedUrl = "";
const unsubscribe = session.Network.requestWillBeSent((event) => {
observedUrl = event.request.url;
});
const socket = [...server.clients][0];
socket.send(JSON.stringify({
method: "Network.requestWillBeSent",
sessionId: "session-1",
params: { request: { url: "https://example.com/product" } },
}));
await new Promise((resolve) => setTimeout(resolve, 10));
assert.equal(observedUrl, "https://example.com/product");
assert.equal(typeof unsubscribe, "function");
unsubscribe();
assert.equal(requests.some((request) => request.method === "Network.requestWillBeSent"), false);
const abandonedWait = session.waitFor("Page.eventThatNeverArrives", 5);
const abandonedCommand = session.Runtime.throwForTest({});
await new Promise((resolve) => setTimeout(resolve, 10));
await assert.rejects(abandonedWait, /Timed out waiting/);
await assert.rejects(abandonedCommand, /test CDP error/);
const evaluation = requests.find((request) => request.method === "Runtime.evaluate");
assert.equal(evaluation.sessionId, "session-1");
assert.equal(requests.find((request) => request.method === "Target.getTargets").sessionId, undefined);
await client.close();
await new Promise((resolve) => server.close(resolve));
});