mirror of
https://github.com/morluto/rea.git
synced 2026-11-14 10:43:30 +00:00
* refactor: remove redundant seams and preserve cleanup ownership * fix: validate PE resource extents before budget checks
120 lines
4.6 KiB
TypeScript
120 lines
4.6 KiB
TypeScript
import { createPackageWithOptions } from "@electron/asar";
|
|
import { TextReader, Uint8ArrayWriter, ZipWriter } from "@zip.js/zip.js";
|
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
import { join } from "node:path";
|
|
import { expect, it } from "vitest";
|
|
|
|
import { artifactInventoryResultSchema } from "../../src/domain/artifactGraph.js";
|
|
import { parseArtifactInventoryEvidence } from "../../src/domain/artifactInventoryEvidence.js";
|
|
import { historicalInventoryEvidence } from "../fixtures/artifactEvidence.js";
|
|
import { connectArtifactComparisonMcp } from "../fixtures/artifactComparisonMcp.js";
|
|
import { createTestTempDirectory } from "../fixtures/temporaryDirectory.js";
|
|
|
|
it("compares ASAR companion declarations from public MCP inventories and preserves historical unknowns", async () => {
|
|
const root = await createTestTempDirectory("rea-asar-unpacked-comparison-");
|
|
const input = join(root, "source");
|
|
await mkdir(input);
|
|
await writeFile(join(input, "member.bin"), "identical child bytes");
|
|
const packedPath = join(root, "packed.asar");
|
|
const unpackedPath = join(root, "unpacked.asar");
|
|
await createPackageWithOptions(input, packedPath, {});
|
|
await createPackageWithOptions(input, unpackedPath, { unpack: "*.bin" });
|
|
|
|
// This fixture validates advertised SDK-converted input/output schemas and
|
|
// every structured response against the declared JSON Schema dialect.
|
|
const { inspect, compare } = await connectArtifactComparisonMcp();
|
|
const packed = await inspect(packedPath);
|
|
const unpacked = await inspect(unpackedPath);
|
|
const packedInventory = artifactInventoryResultSchema.parse(
|
|
packed.normalized_result,
|
|
);
|
|
const unpackedInventory = artifactInventoryResultSchema.parse(
|
|
unpacked.normalized_result,
|
|
);
|
|
const packedChild = packedInventory.occurrences.find(
|
|
({ logical_path }) => logical_path === "member.bin",
|
|
);
|
|
const unpackedChild = unpackedInventory.occurrences.find(
|
|
({ logical_path }) => logical_path === "member.bin",
|
|
);
|
|
expect(packedChild).toMatchObject({
|
|
unpacked: false,
|
|
hash_status: "verified",
|
|
});
|
|
expect(unpackedChild).toMatchObject({
|
|
unpacked: true,
|
|
hash_status: "verified",
|
|
artifact_id: packedChild?.artifact_id,
|
|
});
|
|
expect(
|
|
packedInventory.occurrences.find(
|
|
({ logical_path }) => logical_path === ".",
|
|
),
|
|
).not.toHaveProperty("unpacked");
|
|
|
|
const known = await compare(packed, unpacked);
|
|
expect(
|
|
known.changes.find(({ logical_path }) => logical_path === "member.bin"),
|
|
).toEqual({
|
|
classification: "changed",
|
|
logical_path: "member.bin",
|
|
dimensions: ["metadata"],
|
|
left_occurrence_id: packedChild?.occurrence_id,
|
|
right_occurrence_id: unpackedChild?.occurrence_id,
|
|
left_artifact_id: packedChild?.artifact_id,
|
|
right_artifact_id: unpackedChild?.artifact_id,
|
|
evidence_links: [packed.evidence_id, unpacked.evidence_id],
|
|
});
|
|
|
|
// Model an authenticated pre-field snapshot with its original graph commitment,
|
|
// rather than editing a current Evidence payload without updating its identity.
|
|
const historical = historicalInventoryEvidence(
|
|
packed,
|
|
({ unpacked: _unpacked, ...occurrence }) => occurrence,
|
|
);
|
|
const historicalParsed = parseArtifactInventoryEvidence(historical);
|
|
expect(
|
|
historicalParsed.inventory.occurrences.map(
|
|
({ occurrence_id }) => occurrence_id,
|
|
),
|
|
).toEqual(
|
|
packedInventory.occurrences.map(({ occurrence_id }) => occurrence_id),
|
|
);
|
|
expect(
|
|
historicalParsed.inventory.occurrences.every(
|
|
(occurrence) => !Object.hasOwn(occurrence, "unpacked"),
|
|
),
|
|
).toBe(true);
|
|
const unknown = await compare(historical, unpacked);
|
|
expect(
|
|
unknown.changes.find(({ logical_path }) => logical_path === "member.bin"),
|
|
).toMatchObject({
|
|
classification: "unknown",
|
|
dimensions: ["availability"],
|
|
evidence_links: [historical.evidence_id, unpacked.evidence_id],
|
|
});
|
|
|
|
const zipPath = join(root, "control.zip");
|
|
const writer = new ZipWriter(new Uint8ArrayWriter());
|
|
await writer.add("member.bin", new TextReader("identical child bytes"));
|
|
await writeFile(zipPath, await writer.close());
|
|
const zip = await inspect(zipPath);
|
|
const zipOccurrences = artifactInventoryResultSchema.parse(
|
|
zip.normalized_result,
|
|
).occurrences;
|
|
expect(zipOccurrences).toContainEqual(
|
|
expect.objectContaining({ logical_path: "member.bin" }),
|
|
);
|
|
expect(
|
|
zipOccurrences.every(
|
|
(occurrence) => !Object.hasOwn(occurrence, "unpacked"),
|
|
),
|
|
).toBe(true);
|
|
const unchanged = await compare(zip, zip);
|
|
expect(unchanged).toMatchObject({
|
|
status: "unchanged",
|
|
changes: [],
|
|
summary: { unknown: 0 },
|
|
});
|
|
});
|