68 lines
2.5 KiB
TypeScript
68 lines
2.5 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
|
|
import { createHttpClient } from "../../../src/adapters/http/client.js";
|
|
import { createReferenceHttpGateway } from "../../../src/features/reference-feature/adapters/reference-http-gateway.js";
|
|
import { createReferenceFeatureInput } from "../../../src/features/reference-feature/application/reference-feature-api.js";
|
|
import { REFERENCE_FEATURE_CONTRACT } from "../../../src/features/reference-feature/contracts/reference-feature-contract.js";
|
|
import { mapReferenceOperation } from "../../../src/features/reference-feature/contracts/reference-mapper.js";
|
|
import {
|
|
validateReferencePayload,
|
|
validateReferenceRequest,
|
|
} from "../../../src/features/reference-feature/contracts/reference-schemas.js";
|
|
|
|
describe("reference feature diagnostics correlation", () => {
|
|
it("preserves route, operation and request correlation through the vertical path", async () => {
|
|
const record = vi.fn();
|
|
const operations =
|
|
REFERENCE_FEATURE_CONTRACT.apiOperations as Readonly<
|
|
Record<
|
|
string,
|
|
ReturnType<
|
|
NonNullable<Parameters<typeof createHttpClient>[0]["getOperation"]>
|
|
>
|
|
>
|
|
>;
|
|
const client = createHttpClient({
|
|
baseUrl: "https://api.test",
|
|
fetcher: async () =>
|
|
Response.json({
|
|
success: true,
|
|
data: [{ id: "reference-1", name: "Reference" }],
|
|
meta: { requestId: "safe-request", traceId: "safe-trace" },
|
|
}),
|
|
getOperation(operationId) {
|
|
const operation = operations[operationId];
|
|
if (!operation) throw new Error("Unregistered reference operation");
|
|
return operation;
|
|
},
|
|
validatePayload: validateReferencePayload,
|
|
validateRequest: validateReferenceRequest,
|
|
mapPayload: mapReferenceOperation,
|
|
correlationIdFactory: () => "reference-correlation",
|
|
diagnostics: { record },
|
|
scheduler: {
|
|
setTimeout: () => 1,
|
|
clearTimeout: () => {},
|
|
},
|
|
});
|
|
const application = createReferenceFeatureInput(
|
|
createReferenceHttpGateway(client),
|
|
);
|
|
|
|
await expect(
|
|
application.listResources({ limit: 20 }),
|
|
).resolves.toMatchObject({ ok: true });
|
|
expect(record).toHaveBeenCalledOnce();
|
|
expect(record).toHaveBeenCalledWith({
|
|
level: "info",
|
|
eventId: "http.request.completed",
|
|
context: expect.objectContaining({
|
|
route_id: "REFERENCE_RESOURCE_LIST",
|
|
operation_id: "LIST_REFERENCE_RESOURCES",
|
|
correlation_id: "reference-correlation",
|
|
outcome: "success",
|
|
}),
|
|
});
|
|
});
|
|
});
|