Files
agentic-dev/packages/core-audit/src/with-audit.chain.test.ts

77 lines
2.3 KiB
TypeScript

import { describe, it, expect, vi } from "vitest";
import { withSpan } from "@repo/core-shared/instrumentation";
import { withCapture } from "@repo/core-shared/instrumentation";
import { isInstrumented, isCaptured, isAudited } from "@repo/core-shared/conformance";
import { withAudit } from "@/with-audit";
import type { IAuditLog } from "@/audit-log.interface";
import type { ITracer, ISpan } from "@repo/core-shared/instrumentation";
import type { ILogger } from "@repo/core-shared/instrumentation";
function makeTracer(): ITracer {
return {
startSpan: vi.fn(async (_opts, fn) => {
const span: ISpan = { setAttribute: () => {}, setStatus: () => {} };
return fn(span);
}),
};
}
function makeLogger(): ILogger {
return {
captureException: vi.fn(),
captureMessage: vi.fn(),
addBreadcrumb: vi.fn(),
setUser: vi.fn(),
};
}
function makeAuditLog(): IAuditLog {
return {
record: vi.fn().mockResolvedValue(undefined),
eraseSubject: vi.fn().mockResolvedValue(undefined),
};
}
describe("brand propagation across the full wrapper chain", () => {
it("withSpan(withCapture(withAudit(fn))) carries all three brands on the outer wrapper", () => {
const tracer = makeTracer();
const logger = makeLogger();
const auditLog = makeAuditLog();
const fn = async (input: { id: string }) => ({ ok: true, id: input.id });
const wrapped = withSpan(
tracer,
{ name: "test.chain", op: "use-case" },
withCapture(
logger,
{ feature: "test", layer: "use-case" },
withAudit(auditLog, fn),
),
);
expect(isInstrumented(wrapped)).toBe(true);
expect(isCaptured(wrapped)).toBe(true);
expect(isAudited(wrapped)).toBe(true);
});
it("the full chain preserves input/output behaviour end-to-end", async () => {
const tracer = makeTracer();
const logger = makeLogger();
const auditLog = makeAuditLog();
const fn = async (input: { id: string }) => ({ ok: true, id: input.id });
const wrapped = withSpan(
tracer,
{ name: "test.chain", op: "use-case" },
withCapture(
logger,
{ feature: "test", layer: "use-case" },
withAudit(auditLog, fn),
),
);
const result = await wrapped({ id: "abc" });
expect(result).toEqual({ ok: true, id: "abc" });
});
});