47 lines
2.2 KiB
TypeScript
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();
|
|
});
|
|
});
|