118 lines
3.7 KiB
TypeScript
118 lines
3.7 KiB
TypeScript
import { writeFile } from "node:fs/promises";
|
|
import { join } from "node:path";
|
|
|
|
import { expect } from "vitest";
|
|
|
|
import { createEvidence } from "../../../src/domain/evidence.js";
|
|
import { createEvidenceBundle } from "../../../src/domain/evidenceBundle.js";
|
|
import {
|
|
createResidualUnknown,
|
|
updateResidualUnknown,
|
|
} from "../../../src/domain/residualUnknown.js";
|
|
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
|
|
import { cliTest } from "../../support/cli/cliFixture.js";
|
|
|
|
const revisionBundle = () => {
|
|
const records = ["open", "investigate"].map((operation) =>
|
|
createEvidence(
|
|
undefined,
|
|
{ id: "fixture", name: "Fixture", version: "1" },
|
|
{ operation, parameters: {}, result: { observed: operation } },
|
|
),
|
|
);
|
|
const [opened, investigated] = records;
|
|
if (opened === undefined || investigated === undefined)
|
|
throw new Error("Missing mutation Evidence");
|
|
const details = {
|
|
severity: "high" as const,
|
|
supporting_evidence_ids: [],
|
|
contradicting_evidence_ids: [],
|
|
required_authority: null,
|
|
required_confidence: "observed" as const,
|
|
required_environment: null,
|
|
recommended_probes: [],
|
|
relationships: [],
|
|
};
|
|
const initial = createResidualUnknown(
|
|
{ question: "How is this input handled?", domain: "protocol", ...details },
|
|
opened.evidence_id,
|
|
null,
|
|
);
|
|
const revised = updateResidualUnknown(
|
|
initial,
|
|
{
|
|
unknown_id: initial.unknown_id,
|
|
expected_revision: initial.revision,
|
|
status: "investigating",
|
|
...details,
|
|
resolution: null,
|
|
},
|
|
investigated.evidence_id,
|
|
);
|
|
return createEvidenceBundle(records, [initial, revised]);
|
|
};
|
|
|
|
cliTest(
|
|
"reports standalone import counts for every unknown revision",
|
|
async ({ cli }) => {
|
|
const root = await createTestTempDirectory("rea-evidence-import-");
|
|
const path = join(root, "bundle.json");
|
|
await writeFile(path, JSON.stringify(revisionBundle()));
|
|
const result = await cli.run({
|
|
arguments: ["evidence-import", path, "--json"],
|
|
});
|
|
expect(result.exitCode).toBe(0);
|
|
expect(result.json).toEqual({ imported: 2, unknowns_added: 2, total: 2 });
|
|
},
|
|
);
|
|
|
|
cliTest(
|
|
"reports a standalone Evidence record as the wrong input file kind",
|
|
async ({ cli }) => {
|
|
const root = await createTestTempDirectory("rea-evidence-record-input-");
|
|
const path = join(root, "record.json");
|
|
const record = revisionBundle().records[0];
|
|
if (record === undefined) throw new Error("Missing fixture Evidence");
|
|
await writeFile(path, JSON.stringify(record));
|
|
const result = await cli.run({
|
|
arguments: ["evidence-import", path, "--json"],
|
|
});
|
|
expect(result.exitCode).toBe(1);
|
|
expect(result.json).toMatchObject({
|
|
code: "invalid_request",
|
|
category: "invalid_input",
|
|
details: { path },
|
|
message: expect.stringContaining("this JSON is one Evidence record"),
|
|
});
|
|
},
|
|
);
|
|
|
|
cliTest(
|
|
"rejects altered Evidence and incomplete unknown history before reporting counts",
|
|
async ({ cli }) => {
|
|
const root = await createTestTempDirectory("rea-evidence-import-invalid-");
|
|
const path = join(root, "bundle.json");
|
|
const bundle = revisionBundle();
|
|
for (const invalid of [
|
|
{
|
|
...bundle,
|
|
records: bundle.records.map((record) => ({
|
|
...record,
|
|
normalized_result: "altered",
|
|
})),
|
|
},
|
|
{ ...bundle, unknowns: bundle.unknowns.slice(1) },
|
|
]) {
|
|
await writeFile(path, JSON.stringify(invalid));
|
|
const result = await cli.run({
|
|
arguments: ["evidence-import", path, "--json"],
|
|
});
|
|
expect(result.exitCode).toBe(1);
|
|
expect(result.json).toMatchObject({
|
|
code: "evidence_integrity_mismatch",
|
|
});
|
|
expect(result.json).not.toHaveProperty("imported");
|
|
}
|
|
},
|
|
);
|