Files
rea/tests/boundary/filesystem/javascriptApplicationInputSelection.test.ts
T
morluto ffe0574e17 fix(artifacts)!: retain cleanup owners through client shutdown
Keep failed reader, root descriptor, and output-tree cleanup with the caller. Drain admitted work before close, retry the same retained owners, and block new resource work while cleanup is incomplete. Preserve primary failures and complete inventory observations.

Thread ownership through JavaScript reconstruction, the CLI's one-shot scope, MCP server shutdown, verifier scripts, and test fixtures. Remove redundant ownership flags and the unused validated test wrapper.

Validate with 850 passing focused tests across 90 suites (two skipped), targeted classification and cleanup retries, static and unused-code checks, and real macOS CLI/MCP directory, ZIP, and DMG workflows. Native Windows and deep-analysis providers were not verified.

BREAKING CHANGE: Direct artifact inventory/extraction and JavaScript analysis APIs require an explicit caller-owned ArtifactResourceScope. CLI and MCP input contracts are unchanged.
2026-10-11 04:43:02 +08:00

103 lines
3.4 KiB
TypeScript

import { chmod, mkdir, writeFile } from "node:fs/promises";
import { join } from "node:path";
import { describe, expect, it, onTestFinished } from "vitest";
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
import { analyzeJavaScriptApplication } from "../../support/javascriptApplicationScope.js";
import { projectAnalysisError } from "../../../src/domain/analysisErrorProjection.js";
const analyzeFailure = async (input: Record<string, unknown>) => {
const result = await analyzeJavaScriptApplication(input);
if (result.ok) throw new Error("Expected the selection to be refused");
return projectAnalysisError(result.error);
};
const application = async () => {
const root = await createTestTempDirectory("rea-javascript-selection-");
const directory = join(root, "app");
await mkdir(directory);
await writeFile(join(directory, "index.js"), "module.exports = 1;\n");
return { root, directory };
};
describe("JavaScript application input selection", () => {
it("reports a missing input path as invalid input, not an artifact read failure", async () => {
const { root } = await application();
const missing = join(root, "missing");
expect(await analyzeFailure({ input_path: missing })).toMatchObject({
code: "invalid_request",
category: "invalid_input",
details: {
issues: [
{
path: ["input_path"],
reason: "invalid_value",
message: expect.stringContaining(missing),
},
],
},
});
});
it("reports a file that is neither a directory nor an .asar as an unsupported target", async () => {
const { root } = await application();
const binary = join(root, "program");
await writeFile(binary, Buffer.from([0xcf, 0xfa, 0xed, 0xfe]));
expect(await analyzeFailure({ input_path: binary })).toMatchObject({
code: "unsupported_target",
category: "unsupported_target",
remediation: { action: expect.stringContaining(".asar") },
details: {
operation: "analyze_javascript_application",
path: binary,
},
});
});
it.each([
["a directory", "directory", "asar"],
["an .asar file", "asar", "directory"],
] as const)(
"reports %s selected with a contradicting format as an invalid request",
async (_label, observed, format) => {
const { root, directory } = await application();
const selected =
observed === "directory" ? directory : join(root, "app.asar");
if (observed === "asar") await writeFile(selected, "not inspected");
expect(
await analyzeFailure({ input_path: selected, format }),
).toMatchObject({
code: "invalid_request",
details: {
issues: [
{
path: ["format"],
reason: "invalid_value",
expected: ["auto", observed],
},
],
},
});
},
);
it.skipIf(process.platform === "win32" || process.getuid?.() === 0)(
"reports an unreadable selected directory as a host access denial",
async () => {
const { directory } = await application();
await chmod(directory, 0o000);
onTestFinished(() => chmod(directory, 0o700));
expect(await analyzeFailure({ input_path: directory })).toMatchObject({
code: "access_denied",
details: { path: directory, system_code: "EACCES" },
});
},
);
});