Files
rea/tests/boundary/cli/reconstructionCoverageCli.test.ts
T

156 lines
5.0 KiB
TypeScript

import { reconstructionClosureResultSchema } from "../../../src/domain/reconstructionCoverage.js";
import { reconstructionCoverageScopeCases } from "../../../src/domain/reconstructionCoverageScope.fixture.js";
import { writeFile } from "node:fs/promises";
import { join } from "node:path";
import { expect } from "vitest";
import { completeReconstructionCoverageData } from "../../../src/domain/reconstructionCoverage.fixture.js";
import { parseMcpToolError } from "../../fixtures/mcpToolError.js";
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
import { cliTest, type TestCli } from "../../support/cli/cliFixture.js";
const currentCoverage = () => {
const coverage = completeReconstructionCoverageData();
return {
...coverage,
verifier_results: coverage.verifier_results.map((result) => ({
...result,
observed_at: new Date().toISOString(),
})),
};
};
const evaluate = async (cli: TestCli, coverage: unknown) => {
const root = await createTestTempDirectory("rea-coverage-cli-");
const input = join(root, "request.json");
await writeFile(
input,
JSON.stringify({ coverage, boundary_id: "replacement.cli" }),
);
return cli.run({
arguments: ["evaluate-reconstruction-coverage", input, "--json"],
cwd: root,
});
};
cliTest(
"evaluates complete inline coverage through the compiled CLI",
async ({ cli }) => {
const result = await evaluate(cli, currentCoverage());
expect(result.exitCode).toBe(0);
expect(result.json).toMatchObject({
boundary_id: "replacement.cli",
status: "ready",
summary: { reasons: 0 },
});
},
);
cliTest(
"reports a tampered coverage record as an integrity failure",
async ({ cli }) => {
const coverage = currentCoverage();
const result = await evaluate(cli, {
...coverage,
evidence_bundle: {
...coverage.evidence_bundle,
records: coverage.evidence_bundle.records.map((record, index) =>
index === 0
? { ...record, normalized_result: { tampered: true } }
: record,
),
},
});
expect(result.exitCode).toBe(1);
expect(result.json).toMatchObject({
code: "evidence_integrity_mismatch",
category: "integrity_mismatch",
});
},
);
cliTest(
"preserves shared integrity diagnostics for malformed source Evidence",
async ({ cli }) => {
const coverage = currentCoverage();
const malformed = {
...coverage,
evidence_bundle: {
...coverage.evidence_bundle,
records: coverage.evidence_bundle.records.map((record, index) =>
index === 0
? { ...record, provider: { ...record.provider, name: 3 } }
: record,
),
},
};
const call = await cli.sharedMcpCall?.();
if (call === undefined) throw new Error("Expected file MCP session");
const mcp = await call("evaluate_reconstruction_coverage", {
coverage: malformed,
boundary_id: "replacement.cli",
});
expect(mcp.isError).toBe(true);
expect(parseMcpToolError(mcp)).toMatchObject({
error: { code: "evidence_integrity_mismatch" },
});
const result = await evaluate(cli, malformed);
expect(result.exitCode).toBe(1);
expect(result.json).toMatchObject({
code: "evidence_integrity_mismatch",
category: "integrity_mismatch",
});
},
);
cliTest(
"locates malformed coverage through its shared workflow owner",
async ({ cli }) => {
const result = await evaluate(cli, { ...currentCoverage(), owners: 3 });
expect(result.exitCode).toBe(1);
expect(result.json).toMatchObject({
code: "invalid_request",
details: {
operation: "evaluate_reconstruction_coverage",
issues: [{ path: ["coverage", "owners"], reason: "invalid_type" }],
},
});
},
);
cliTest(
"accounts for effective scope and conflicting proofs through CLI and MCP",
async ({ cli }) => {
const call = await cli.sharedMcpCall?.();
if (call === undefined) throw new Error("Expected shared file MCP session");
for (const {
label,
coverage,
status,
codes,
surfaces,
evidenceIds,
} of reconstructionCoverageScopeCases()) {
coverage.verifier_results[0]!.observed_at = new Date().toISOString();
const cliResult = await evaluate(cli, coverage);
expect(cliResult.exitCode, label).toBe(0);
const mcpResult = await call("evaluate_reconstruction_coverage", {
coverage,
boundary_id: "replacement.cli",
});
expect(mcpResult.isError, label).not.toBe(true);
for (const output of [cliResult.json, mcpResult.structuredContent]) {
const result = reconstructionClosureResultSchema.parse(output);
expect(result.status, label).toBe(status);
expect(result.summary.required_surfaces, label).toBe(surfaces);
expect(result.reasons.map(({ code }) => code).sort(), label).toEqual(
[...codes].sort(),
);
expect(result.evidence_ids, label).toEqual(
expect.arrayContaining([...evidenceIds]),
);
}
}
},
);