77 lines
2.3 KiB
TypeScript
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" });
|
|
});
|
|
});
|