Files
rea/tests/acceptance/analysisViewCallerPath.test.ts
T
morluto 1bfa60ac20 fix(cli): preserve caller-selected JSON paths
Keep POSIX symlink-parent traversal at the shared JSON input boundary and forward the selected browser executable without a second lexical normalization. Verify Electron, browser, and Evidence-file consumers through registered commands and the built CLI.

Refs #5103
2026-10-21 03:50:14 +08:00

63 lines
2.3 KiB
TypeScript

import { mkdir, symlink, writeFile } from "node:fs/promises";
import { join } from "node:path";
import { expect } from "vitest";
import { toolContract } from "../../src/contracts/toolContracts.js";
import { parseEvidence } from "../../src/domain/evidence.js";
import { analysisViewResultSchema } from "../../src/domain/analysisView/analysisView.js";
import {
analysisViewJavaScriptEvidence,
analysisViewLayoutEvidence,
} from "../fixtures/analysisView.js";
import { createTestTempDirectory } from "../fixtures/temporaryDirectory.js";
import { cliTest } from "../support/cli/cliFixture.js";
cliTest
.skipIf(process.platform === "win32")
.for(["relative", "absolute"] as const)(
"reads selected analysis-view Evidence through a %s caller path containing a symlink parent",
async (pathKind, { cli }) => {
const root = await createTestTempDirectory(
"rea-analysis-view-caller-path-",
);
await mkdir(join(root, "real", "inner"), { recursive: true });
await symlink("real/inner", join(root, "link"));
const selected = analysisViewJavaScriptEvidence();
const decoy = analysisViewLayoutEvidence();
expect(selected.evidence_id).not.toBe(decoy.evidence_id);
await writeFile(
join(root, "real", "evidence.json"),
JSON.stringify(selected),
);
await writeFile(join(root, "evidence.json"), JSON.stringify(decoy));
const sourcePath =
pathKind === "relative"
? "link/../evidence.json"
: `${root}/link/../evidence.json`;
const queryPath = join(root, "query.json");
await writeFile(
queryPath,
JSON.stringify({
source: { kind: "evidence-file", path: sourcePath },
view: { kind: "summary" },
}),
);
const result = await cli.run({
arguments: ["inspect-analysis-view", queryPath, "--json"],
cwd: root,
});
expect(result.exitCode, result.stdout + result.stderr).toBe(0);
const contractResult = toolContract(
"inspect_analysis_view",
).outputSchema.parse(result.json);
const output = parseEvidence(contractResult);
const view = analysisViewResultSchema.parse(output.normalized_result);
expect(view.kind).toBe("summary");
expect(view.parent_evidence_id).toBe(selected.evidence_id);
expect(output.evidence_links).toEqual([selected.evidence_id]);
},
);