Files
PaperClipAI/tests/runner-e2e/web-server-command.ts
DottaandPaperclip 30edeec300 test(runner): verify installed launch and published Daytona plugin
Invoke the public Playwright JavaScript entry directly for installed Pi tests so pnpm shim NODE_PATH injection cannot cross the closed controller boundary. Add a credential-free health/UI startup proof and a pinned published Daytona plugin fixture path without production runtime overrides.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 01:34:42 -05:00

33 lines
1.5 KiB
TypeScript

import path from "node:path";
// Let the restart-aware supervisor reap Paperclip and finish its log streams.
// Its stop path allows 30 seconds for SIGTERM and 5 seconds for SIGKILL.
export const runnerE2EWebServerGracefulShutdown = {
signal: "SIGTERM" as const,
timeout: 45_000,
};
function shellQuote(value: string) {
return `'${value.replaceAll("'", `'\\''`)}'`;
}
export function runnerE2EWebServerCommand(repositoryRoot: string) {
const tsx = path.join(repositoryRoot, "cli/node_modules/tsx/dist/cli.mjs");
const server = path.join(repositoryRoot, "tests/runner-e2e/server.ts");
return `node ${shellQuote(tsx)} ${shellQuote(server)}`;
}
// Keep the supervisor's child PID equal to the actual TypeScript process.
export function runnerE2ETypeScriptProcessArgs(repositoryRoot: string, entry: string, args: string[] = []) {
return ["--import", path.join(repositoryRoot, "cli/node_modules/tsx/dist/loader.mjs"), entry, ...args];
}
// pnpm's generated playwright bin shim adds NODE_PATH, even when the caller
// rejected ambient injection. The installed lane invokes the public JS bin
// with the current Node directly, keeping the WebServer environment closed.
export function runnerE2EPlaywrightInvocation(repositoryRoot: string, args: string[], installed: boolean) {
return installed
? { command: process.execPath, args: [path.join(repositoryRoot, "node_modules/@playwright/test/cli.js"), ...args] }
: { command: "pnpm", args: ["exec", "playwright", ...args] };
}