feat(core-dsr): Payload impls, recording doubles, DI binders, contract tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-19 20:05:06 +00:00
parent 8068d1bf98
commit 6606b59d1e
35 changed files with 2375 additions and 24 deletions

View File

@@ -0,0 +1,41 @@
import { describe, it, expect } from "vitest";
import { RecordingDataDelete } from "./recording-data-delete";
describe("RecordingDataDelete", () => {
it("records deleteSubjectData calls", async () => {
const deleter = new RecordingDataDelete();
await deleter.deleteSubjectData("alice", "soft");
expect(deleter.calls).toHaveLength(1);
expect(deleter.calls[0]).toEqual({ subjectId: "alice", mode: "soft" });
});
it("returns a DeletionCertificate with the correct shape", async () => {
const deleter = new RecordingDataDelete();
const cert = await deleter.deleteSubjectData("alice", "cascade-hard");
expect(cert.subjectId).toBe("alice");
expect(cert.mode).toBe("cascade-hard");
expect(cert.reason).toBe("art-17-request");
expect(cert.affected).toEqual([]);
expect(typeof cert.auditEntryId).toBe("string");
expect(typeof cert.timestamp).toBe("string");
});
it("records multiple calls in order", async () => {
const deleter = new RecordingDataDelete();
await deleter.deleteSubjectData("alice", "soft");
await deleter.deleteSubjectData("bob", "cascade-hard");
expect(deleter.calls[0]?.mode).toBe("soft");
expect(deleter.calls[1]?.mode).toBe("cascade-hard");
});
it("reset() clears recorded calls", async () => {
const deleter = new RecordingDataDelete();
await deleter.deleteSubjectData("alice", "soft");
deleter.reset();
expect(deleter.calls).toHaveLength(0);
});
});