mirror of
https://github.com/morluto/rea.git
synced 2026-10-22 05:42:31 -05:00
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
63 lines
2.3 KiB
TypeScript
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]);
|
|
},
|
|
);
|