mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-21 08:22:20 +02:00
Start installed-consumer validation through Node and remove ambient Node startup settings before test processes start. Keep pinned historical source fixtures available in shallow checkouts and set filesystem fixture conditions explicitly. Co-Authored-By: Paperclip <Paperclip-Paperclip@users.noreply.github.com>
61 lines
3.3 KiB
JavaScript
61 lines
3.3 KiB
JavaScript
import { spawnSync } from "node:child_process";
|
|
import { copyFileSync, mkdirSync, mkdtempSync, readFileSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
|
import { tmpdir } from "node:os";
|
|
import path from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
import { expect, it } from "vitest";
|
|
|
|
const root = fileURLToPath(new URL("../../", import.meta.url));
|
|
|
|
it.skipIf(process.env.PAPERCLIP_UNIT_BOUNDARY_PROBE === "1")("runs the documented pnpm validation with clean test processes after parent and shim injection", () => {
|
|
const directory = realpathSync(mkdtempSync(path.join(tmpdir(), "runner unit boundary-")));
|
|
try {
|
|
const preload = path.join(directory, "preload.cjs");
|
|
const foreignModules = path.join(directory, "foreign-modules");
|
|
const log = path.join(directory, "preloads.ndjson");
|
|
const report = path.join(directory, "vitest.json");
|
|
writeFileSync(preload, `require("node:fs").appendFileSync(${JSON.stringify(log)}, JSON.stringify({
|
|
argv: process.argv, execArgv: process.execArgv, nodePath: process.env.NODE_PATH
|
|
}) + "\\n");`);
|
|
const result = spawnSync("pnpm", ["test:e2e:runner:unit", "installed-cli.test.ts",
|
|
"--maxWorkers=1", "--reporter=json", `--outputFile=${report}`], {
|
|
cwd: root,
|
|
encoding: "utf8",
|
|
timeout: 90_000,
|
|
env: { ...process.env, PAPERCLIP_UNIT_BOUNDARY_PROBE: "1",
|
|
NODE_PATH: foreignModules, NODE_OPTIONS: `--require=${JSON.stringify(preload)}` },
|
|
});
|
|
expect(result.error, `${result.stdout}\n${result.stderr}`).toBeUndefined();
|
|
expect(result.status, `${result.stdout}\n${result.stderr}`).toBe(0);
|
|
const tests = JSON.parse(readFileSync(report, "utf8"));
|
|
expect(tests.numPassedTests).toBeGreaterThan(0);
|
|
expect(tests.numFailedTests).toBe(0);
|
|
expect(tests.testResults).toHaveLength(1);
|
|
expect(tests.testResults[0].name).toMatch(/installed-cli\.test\.ts$/);
|
|
expect(result.stdout).toContain("native completion prerequisite admits an executed passing boundary");
|
|
const preloads = readFileSync(log, "utf8").trim().split("\n").map(line => JSON.parse(line));
|
|
expect(preloads.some(record => record.argv.some(arg => /pnpm(?:\.c?js)?$/.test(arg)))).toBe(true);
|
|
expect(preloads.some(record => record.argv[1]?.endsWith("/run-unit.mjs")
|
|
&& record.nodePath?.split(path.delimiter).includes(foreignModules))).toBe(true);
|
|
expect(preloads.every(record => !/vitest|tinypool|\.test\.(?:ts|mjs)$/.test(record.argv[1] ?? "")
|
|
&& !record.execArgv.includes("--test"))).toBe(true);
|
|
} finally {
|
|
rmSync(directory, { recursive: true, force: true });
|
|
}
|
|
}, 120_000);
|
|
|
|
it("reports a missing test runner as a launcher/environment failure before any product assertions", () => {
|
|
const directory = realpathSync(mkdtempSync(path.join(tmpdir(), "runner-unit-uninstalled-")));
|
|
try {
|
|
const launcher = path.join(directory, "tests/runner-e2e/run-unit.mjs");
|
|
mkdirSync(path.dirname(launcher), { recursive: true });
|
|
copyFileSync(path.join(root, "tests/runner-e2e/run-unit.mjs"), launcher);
|
|
const result = spawnSync(process.execPath, [launcher], { encoding: "utf8", timeout: 5000 });
|
|
expect(result.status).toBe(2);
|
|
expect(result.stderr).toContain("launcher/environment failure: Vitest is not installed");
|
|
expect(result.stdout).toBe("");
|
|
} finally {
|
|
rmSync(directory, { recursive: true, force: true });
|
|
}
|
|
});
|