Files
HiveGrid-Wireframes/hivegrid-cloud/apps/web/app/utils/audit/withAuditContext.test.ts
T

47 lines
2.2 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { extractWebActorIp, extractWebActorUserAgent, extractWebRequestId, getWebAuditContext, withAuditContext } from "./withAuditContext.js";
function makeRequest(headers: Record<string, string>): Request {
return new Request("https://example.com/", { headers });
}
describe("extractWebActorIp", () => {
it("prefers cf-connecting-ip > x-real-ip > x-forwarded-for first hop", () => {
expect(extractWebActorIp(makeRequest({ "cf-connecting-ip": "1.1.1.1", "x-forwarded-for": "2.2.2.2" }))).toBe("1.1.1.1");
expect(extractWebActorIp(makeRequest({ "x-real-ip": "2.2.2.2" }))).toBe("2.2.2.2");
expect(extractWebActorIp(makeRequest({ "x-forwarded-for": "3.3.3.3, 8.8.8.8" }))).toBe("3.3.3.3");
expect(extractWebActorIp(makeRequest({}))).toBeNull();
});
});
describe("extractWebActorUserAgent", () => {
it("returns capped trimmed value or null", () => {
expect(extractWebActorUserAgent(makeRequest({ "user-agent": " ua " }))).toBe("ua");
expect(extractWebActorUserAgent(makeRequest({ "user-agent": "x".repeat(600) })!)?.length).toBe(512);
expect(extractWebActorUserAgent(makeRequest({}))).toBeNull();
});
});
describe("extractWebRequestId", () => {
it("returns trimmed value or null for oversize/missing", () => {
expect(extractWebRequestId(makeRequest({ "x-request-id": "req_1" }))).toBe("req_1");
expect(extractWebRequestId(makeRequest({ "x-request-id": "x".repeat(200) }))).toBeNull();
expect(extractWebRequestId(makeRequest({}))).toBeNull();
});
});
describe("withAuditContext", () => {
it("binds the context for the duration of the callback", async () => {
expect(getWebAuditContext()).toBeNull();
const captured = await withAuditContext({ request: makeRequest({ "cf-connecting-ip": "5.5.5.5", "user-agent": "Test/1.0", "x-request-id": "req_1" }) }, async () => getWebAuditContext());
expect(captured).toEqual({ actorIp: "5.5.5.5", actorUserAgent: "Test/1.0", requestId: "req_1" });
expect(getWebAuditContext()).toBeNull();
});
it("passes through when request is undefined", async () => {
const captured = await withAuditContext({}, async () => getWebAuditContext());
expect(captured).toBeNull();
});
});