diff --git a/packages/core-audit/src/noop-audit-log.test.ts b/packages/core-audit/src/noop-audit-log.test.ts new file mode 100644 index 0000000..68cdd69 --- /dev/null +++ b/packages/core-audit/src/noop-audit-log.test.ts @@ -0,0 +1,29 @@ +import { describe, it, expect } from "vitest"; +import { NoopAuditLog } from "./noop-audit-log"; +import type { AuditEntry } from "@repo/core-shared/audit"; + +describe("NoopAuditLog", () => { + const sample: AuditEntry = { + actorId: "user_1", + actorType: "user", + actorRoles: [], + action: "VIEW", + resource: { type: "articles", id: "1" }, + at: new Date(), + scope: { feature: "blog", environment: "test", tenant: "default" }, + from: { ipTruncated: "10.0.0.0", userAgent: "test" }, + containsPii: false, + outcome: "success", + }; + + it("record() is a no-op that does not throw", async () => { + const log = new NoopAuditLog(); + await expect(log.record(sample)).resolves.toBeUndefined(); + }); + + it("eraseSubject() is a no-op that does not throw", async () => { + const log = new NoopAuditLog(); + await expect(log.eraseSubject("user_1", "pseudonymize")).resolves.toBeUndefined(); + await expect(log.eraseSubject("user_1", "delete")).resolves.toBeUndefined(); + }); +}); diff --git a/packages/core-audit/src/noop-audit-log.ts b/packages/core-audit/src/noop-audit-log.ts new file mode 100644 index 0000000..3d9e5b1 --- /dev/null +++ b/packages/core-audit/src/noop-audit-log.ts @@ -0,0 +1,11 @@ +import type { AuditEntry } from "@repo/core-shared/audit"; +import type { IAuditLog } from "./audit-log.interface"; + +export class NoopAuditLog implements IAuditLog { + async record(_entry: AuditEntry): Promise { + // intentional no-op + } + async eraseSubject(_actorId: string, _mode: "pseudonymize" | "delete"): Promise { + // intentional no-op + } +}