mirror of
https://github.com/morluto/rea.git
synced 2026-11-09 16:26:36 +00:00
* test: strengthen integration oracles and verification * test: bound lifecycle gates and strengthen workflow checks * test: verify complete paged and extracted results * test: preserve bytecode and cancellation evidence * test: strengthen retained evidence and fixture cleanup * test: require cross-projection bridge identities * test: retain fixture owners through cleanup failures * test: verify graph examples and project selectors * test: tighten provider and lifecycle regressions * test: consolidate hex coverage and bound cutter cleanup * test: bound subprocess output waits and strengthen graph checks * test: check mcp recovery and preserve cleanup owners * test: verify structured mcp argument failures * test: preserve artifact cleanup and gdb limit evidence * test: preserve evidence identities and bound provider gates * test: retain browser and comparison cleanup owners * test: bound startup and strengthen fixture oracles * test: bound lifecycle gates and verify recovered evidence * test: verify public outcomes and lifecycle ownership * test: assert precise evidence and release lifecycle gates * test: verify selected facts and bound cleanup waits * test: check retained evidence and decoded records * test: verify final reports and retain cleanup ownership * test: bound reviewed startup gates and retain cleanup * test: verify PE errors and preserve MCP cleanup * test: preserve MCP fixture cleanup ownership * test: release provider gates before late startup
146 lines
4.2 KiB
TypeScript
146 lines
4.2 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
createEvidenceCompletionLedger,
|
|
evidenceCompletionLedgerSchema,
|
|
type EvidenceCompletionStatus,
|
|
} from "./evidenceCompletionLedger.js";
|
|
|
|
const evidenceId = (digit: string): string => `ev_${digit.repeat(64)}`;
|
|
|
|
const record = (
|
|
claimId: string,
|
|
status: EvidenceCompletionStatus,
|
|
evidenceIds: readonly string[] = [evidenceId("1")],
|
|
) => ({ claim_id: claimId, status, evidence_ids: evidenceIds });
|
|
|
|
describe("Evidence completion ledger", () => {
|
|
it("marks only an all-pass ledger complete", () => {
|
|
const ledger = createEvidenceCompletionLedger([
|
|
record("scenario.launch", "pass"),
|
|
record("scenario.shutdown", "pass", [evidenceId("2")]),
|
|
]);
|
|
|
|
expect(ledger.summary).toEqual({
|
|
total: 2,
|
|
pass: 2,
|
|
fail: 0,
|
|
unsupported: 0,
|
|
truncated: 0,
|
|
unknown: 0,
|
|
complete: true,
|
|
});
|
|
});
|
|
|
|
it.each(["fail", "unsupported", "truncated", "unknown"] as const)(
|
|
"does not count %s as pass",
|
|
(status) => {
|
|
const ledger = createEvidenceCompletionLedger([
|
|
record("scenario.pass", "pass"),
|
|
record(`scenario.${status}`, status, [evidenceId("2")]),
|
|
]);
|
|
|
|
expect(ledger.summary).toMatchObject({ pass: 1, complete: false });
|
|
expect(ledger.summary[status]).toBe(1);
|
|
},
|
|
);
|
|
|
|
it("canonicalizes claim and Evidence ID ordering", () => {
|
|
const left = createEvidenceCompletionLedger([
|
|
record("scenario.z", "pass", [evidenceId("2"), evidenceId("1")]),
|
|
record("scenario.a", "unknown", [evidenceId("3")]),
|
|
]);
|
|
const right = createEvidenceCompletionLedger([
|
|
record("scenario.a", "unknown", [evidenceId("3")]),
|
|
record("scenario.z", "pass", [evidenceId("1"), evidenceId("2")]),
|
|
]);
|
|
|
|
expect(left).toEqual(right);
|
|
expect(left.records).toEqual([
|
|
record("scenario.a", "unknown", [evidenceId("3")]),
|
|
record("scenario.z", "pass", [evidenceId("1"), evidenceId("2")]),
|
|
]);
|
|
expect(left.ledger_id).toMatch(/^ecl_[a-f0-9]{64}$/u);
|
|
});
|
|
|
|
it("accepts every Evidence ID supplied for one claim", () => {
|
|
const evidenceIds = Array.from(
|
|
{ length: 101 },
|
|
(_, index) => `ev_${index.toString(16).padStart(64, "0")}`,
|
|
);
|
|
|
|
expect(
|
|
createEvidenceCompletionLedger([
|
|
record(
|
|
"scenario.many-evidence-items",
|
|
"pass",
|
|
[...evidenceIds].reverse(),
|
|
),
|
|
]).records[0]?.evidence_ids,
|
|
).toEqual(evidenceIds);
|
|
});
|
|
|
|
it("rejects missing, malformed, and duplicate Evidence IDs", () => {
|
|
expect(() =>
|
|
createEvidenceCompletionLedger([record("scenario.empty", "pass", [])]),
|
|
).toThrow();
|
|
expect(() =>
|
|
createEvidenceCompletionLedger([
|
|
record("scenario.bad", "pass", ["ev_not-a-digest"]),
|
|
]),
|
|
).toThrow();
|
|
expect(() =>
|
|
createEvidenceCompletionLedger([
|
|
record("scenario.duplicate", "pass", [
|
|
evidenceId("1"),
|
|
evidenceId("1"),
|
|
]),
|
|
]),
|
|
).toThrow("unique");
|
|
});
|
|
|
|
it("rejects duplicate claims and tampered derived fields", () => {
|
|
expect(() =>
|
|
createEvidenceCompletionLedger([
|
|
record("scenario.same", "pass"),
|
|
record("scenario.same", "unknown", [evidenceId("2")]),
|
|
]),
|
|
).toThrow("unique");
|
|
|
|
const ledger = createEvidenceCompletionLedger([
|
|
record("scenario.valid", "pass"),
|
|
]);
|
|
expect(() =>
|
|
evidenceCompletionLedgerSchema.parse({
|
|
...ledger,
|
|
summary: { ...ledger.summary, complete: false },
|
|
}),
|
|
).toThrow();
|
|
expect(() =>
|
|
evidenceCompletionLedgerSchema.parse({
|
|
...ledger,
|
|
ledger_id: `ecl_${"0".repeat(64)}`,
|
|
}),
|
|
).toThrow();
|
|
});
|
|
|
|
it("rejects path-bearing fields and emits path-independent output", () => {
|
|
const ledger = createEvidenceCompletionLedger([
|
|
record("scenario.path-free", "pass"),
|
|
]);
|
|
expect(() =>
|
|
evidenceCompletionLedgerSchema.parse({
|
|
...ledger,
|
|
records: [
|
|
{
|
|
...record("scenario.path-free", "pass"),
|
|
local_path: "/private/operator/input.bin",
|
|
},
|
|
],
|
|
}),
|
|
).toThrow();
|
|
|
|
expect(JSON.stringify(ledger)).not.toContain("/private/operator");
|
|
});
|
|
});
|