a11oy / packages /receipt-substrate /src /receipt_substrate.test.ts
betterwithage's picture
sync(space): complete build context — fix BUILD_ERROR (CTO)
518343a verified
Raw
History Blame
4.09 kB
import assert from "node:assert/strict";
import * as fs from "node:fs";
import * as os from "node:os";
import * as path from "node:path";
import {
appendReceipt,
canonicalJson,
createToolEnvelope,
emitReceipt,
parseQuorum,
qecWitness,
readReceiptJsonl,
verifyChain,
verifyReceipt,
} from "./index.ts";
const policy = {
algorithm: "SHA3-256" as const,
chaining: "hash_chain" as const,
quorum: "2-of-3",
nodes: ["node-primary", "node-backup", "node-witness"],
};
function envelope(payload: unknown = { query: "status", limit: 3 }) {
return createToolEnvelope({
protocol: "mcp",
actor_id: "did:key:z6MkOperator",
tool_name: "receipted_retrieval",
lambda_axes: ["Λ7", "Λ2"],
payload,
});
}
assert.equal(canonicalJson({ b: 2, a: 1 }), canonicalJson({ a: 1, b: 2 }));
assert.equal(canonicalJson({ value: "e\u0301" }), canonicalJson({ value: "é" }));
assert.deepEqual(parseQuorum("2-of-3"), { required: 2, total: 3 });
assert.throws(() => parseQuorum("4-of-3"), /Invalid quorum/);
const genesis = emitReceipt(envelope(), {
policy,
quorumSignatures: ["node-backup", "node-primary"],
timestamp: new Date("2026-05-29T00:00:00.000Z"),
});
assert.equal(verifyReceipt(genesis).valid, true);
assert.equal(genesis.prev_receipt_hash, null);
assert.equal(genesis.sequence, 0);
assert.equal(genesis.qec_witness.css_consistent, true);
const chain = appendReceipt([genesis], envelope({ query: "next", limit: 1 }), {
policy,
quorumSignatures: ["node-primary", "node-witness"],
timestamp: new Date("2026-05-29T00:00:01.000Z"),
});
assert.equal(chain.length, 2);
assert.equal(verifyChain(chain).valid, true);
assert.equal(chain[1].prev_receipt_hash, genesis.merkle_root);
const tamperedPayload = [{ ...genesis, envelope: { ...genesis.envelope, payload: { query: "tampered" } } }, chain[1]];
const tamperedPayloadResult = verifyChain(tamperedPayload, policy);
assert.equal(tamperedPayloadResult.valid, false);
assert.match(tamperedPayloadResult.errors.join("\n"), /payload_hash mismatch|merkle_root mismatch/);
const tamperedReceiptId = [{ ...genesis, receipt_id: "or-tampered" }];
const tamperedReceiptIdResult = verifyChain(tamperedReceiptId, policy);
assert.equal(tamperedReceiptIdResult.valid, false);
assert.match(tamperedReceiptIdResult.errors.join("\n"), /receipt_id mismatch/);
const replayed = [...chain, chain[0]];
const replayResult = verifyChain(replayed, policy);
assert.equal(replayResult.valid, false);
assert.match(replayResult.errors.join("\n"), /duplicate receipt_id|prev_receipt_hash mismatch|timestamp regression/);
const skippedSequence = [{ ...genesis, sequence: 3 }];
const skippedSequenceResult = verifyChain(skippedSequence, policy);
assert.equal(skippedSequenceResult.valid, false);
assert.match(skippedSequenceResult.errors.join("\n"), /sequence mismatch|receipt_id mismatch|merkle_root mismatch/);
const weakQuorum = [{ ...genesis, quorum_signatures: ["node-primary"] }];
const weakQuorumResult = verifyChain(weakQuorum, policy);
assert.equal(weakQuorumResult.valid, false);
assert.match(weakQuorumResult.errors.join("\n"), /insufficient quorum/);
const impossibleQuorum = [{ ...genesis, policy: { ...genesis.policy!, quorum: "3-of-4" } }];
const impossibleQuorumResult = verifyChain(impossibleQuorum, policy);
assert.equal(impossibleQuorumResult.valid, false);
assert.match(impossibleQuorumResult.errors.join("\n"), /quorum total exceeds known nodes|merkle_root mismatch|receipt_id mismatch/);
const witness = qecWitness(genesis.payload_hash);
assert.equal(witness.shor_repetition_count, 9);
assert.equal(witness.payload_byte, witness.shor_majority_payload);
assert.equal(witness.css_consistent, true);
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "a11oy-receipt-substrate-"));
const tmp = path.join(tmpDir, "receipts.jsonl");
try {
fs.writeFileSync(tmp, `${JSON.stringify(genesis)}\n${JSON.stringify(chain[1])}\n`, "utf8");
assert.equal(readReceiptJsonl(tmp).length, 2);
} finally {
fs.rmSync(tmpDir, { recursive: true, force: true });
}
console.log("[receipt-substrate] OK 12 tests");