| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- import { describe, expect, test, vi } from "vitest";
- const loggerWarnMock = vi.fn();
- const PARSE_HEADER_RECORD_WARN_MESSAGE = "SessionManager: Failed to parse header record JSON";
- function getParseHeaderRecordWarnCalls(): unknown[][] {
- return loggerWarnMock.mock.calls.filter((call) => call[0] === PARSE_HEADER_RECORD_WARN_MESSAGE);
- }
- vi.mock("server-only", () => ({}));
- vi.mock("@/lib/logger", () => ({
- logger: {
- warn: loggerWarnMock,
- trace: vi.fn(),
- info: vi.fn(),
- error: vi.fn(),
- },
- }));
- const sanitizeHeadersMock = vi.fn();
- vi.mock("@/app/v1/_lib/proxy/errors", () => ({
- sanitizeHeaders: sanitizeHeadersMock,
- }));
- async function loadHelpers() {
- const mod = await import("@/lib/session-manager");
- return {
- headersToSanitizedObject: mod.headersToSanitizedObject,
- parseHeaderRecord: mod.parseHeaderRecord,
- };
- }
- describe("SessionManager 辅助函数", () => {
- test("parseHeaderRecord:有效 JSON 对象应解析为记录", async () => {
- vi.clearAllMocks();
- const { parseHeaderRecord } = await loadHelpers();
- expect(parseHeaderRecord('{"a":"1","b":"2"}')).toEqual({ a: "1", b: "2" });
- expect(getParseHeaderRecordWarnCalls()).toHaveLength(0);
- });
- test("parseHeaderRecord:空对象应返回空记录", async () => {
- vi.clearAllMocks();
- const { parseHeaderRecord } = await loadHelpers();
- expect(parseHeaderRecord("{}")).toEqual({});
- expect(getParseHeaderRecordWarnCalls()).toHaveLength(0);
- });
- test("parseHeaderRecord:只保留字符串值", async () => {
- vi.clearAllMocks();
- const { parseHeaderRecord } = await loadHelpers();
- expect(parseHeaderRecord('{"a":"1","b":2,"c":true,"d":null,"e":{},"f":[]}')).toEqual({
- a: "1",
- });
- expect(getParseHeaderRecordWarnCalls()).toHaveLength(0);
- });
- test("parseHeaderRecord:无效 JSON 应返回 null 并记录 warn", async () => {
- vi.clearAllMocks();
- const { parseHeaderRecord } = await loadHelpers();
- expect(parseHeaderRecord("{bad json")).toBe(null);
- const calls = getParseHeaderRecordWarnCalls();
- expect(calls).toHaveLength(1);
- const [message, meta] = calls[0] ?? [];
- expect(message).toBe("SessionManager: Failed to parse header record JSON");
- expect(meta).toEqual(expect.objectContaining({ error: expect.anything() }));
- });
- test("parseHeaderRecord:JSON 数组/null/原始值应返回 null", async () => {
- vi.clearAllMocks();
- const { parseHeaderRecord } = await loadHelpers();
- expect(parseHeaderRecord('["a"]')).toBe(null);
- expect(parseHeaderRecord("null")).toBe(null);
- expect(parseHeaderRecord("1")).toBe(null);
- expect(getParseHeaderRecordWarnCalls()).toHaveLength(0);
- });
- test("headersToSanitizedObject:单个 header 应正确转换", async () => {
- vi.clearAllMocks();
- const { headersToSanitizedObject } = await loadHelpers();
- const headers = new Headers({ "x-test": "1" });
- sanitizeHeadersMock.mockReturnValueOnce("x-test: 1");
- expect(headersToSanitizedObject(headers)).toEqual({ "x-test": "1" });
- expect(sanitizeHeadersMock).toHaveBeenCalledWith(headers);
- });
- test("headersToSanitizedObject:多个 header 应正确转换", async () => {
- vi.clearAllMocks();
- const { headersToSanitizedObject } = await loadHelpers();
- const headers = new Headers({ a: "1", b: "2" });
- sanitizeHeadersMock.mockReturnValueOnce("a: 1\nb: 2");
- expect(headersToSanitizedObject(headers)).toEqual({ a: "1", b: "2" });
- expect(sanitizeHeadersMock).toHaveBeenCalledWith(headers);
- });
- test("headersToSanitizedObject:空 Headers 应返回空对象", async () => {
- vi.clearAllMocks();
- const { headersToSanitizedObject } = await loadHelpers();
- const headers = new Headers();
- sanitizeHeadersMock.mockReturnValueOnce("(empty)");
- expect(headersToSanitizedObject(headers)).toEqual({});
- expect(sanitizeHeadersMock).toHaveBeenCalledWith(headers);
- });
- test("headersToSanitizedObject:值包含冒号时应保留完整值", async () => {
- vi.clearAllMocks();
- const { headersToSanitizedObject } = await loadHelpers();
- const headers = new Headers({ "x-test": "a:b:c" });
- sanitizeHeadersMock.mockReturnValueOnce("x-test: a:b:c");
- expect(headersToSanitizedObject(headers)).toEqual({ "x-test": "a:b:c" });
- expect(sanitizeHeadersMock).toHaveBeenCalledWith(headers);
- });
- });
|