Files
wehub-resource-sync 64ed910d3f
CI / Backend Checks (push) Has been cancelled
CI / Frontend Checks (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 11:57:20 +08:00

76 lines
2.4 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
buildLocalProxyRequestOverrides,
isProtectedLocalProxyHeaderName,
isValidHttpHeaderName,
isValidHttpHeaderValue,
parseBodyOverrideJson,
parseHeaderOverrideJson,
parseRequestOverrideJson,
} from "@/lib/requestOverrides";
describe("requestOverrides", () => {
it("treats empty JSON fields as unset", () => {
expect(buildLocalProxyRequestOverrides("", " ")).toEqual({});
});
it("parses header and body override objects", () => {
expect(
buildLocalProxyRequestOverrides(
'{ "X-Test": "ok" }',
'{ "temperature": 0.2 }',
),
).toEqual({
overrides: {
headers: { "x-test": "ok" },
body: { temperature: 0.2 },
},
});
});
it("rejects non-object body overrides", () => {
expect(parseRequestOverrideJson("[]").error).toBeTruthy();
});
it("rejects non-string header values", () => {
expect(parseHeaderOverrideJson('{ "X-Test": 1 }').error).toBeTruthy();
});
it("rejects invalid header names", () => {
expect(isValidHttpHeaderName("X-Test")).toBe(true);
expect(isValidHttpHeaderName("X Foo")).toBe(false);
expect(isValidHttpHeaderName("Authorization:")).toBe(false);
expect(parseHeaderOverrideJson('{ "X Foo": "bar" }').error).toBeTruthy();
});
it("rejects duplicate header names after case normalization", () => {
expect(
parseHeaderOverrideJson('{ "X-Foo": "a", "x-foo": "b" }').error,
).toBeTruthy();
});
it("rejects protected proxy-managed header names", () => {
expect(isProtectedLocalProxyHeaderName("Content-Type")).toBe(true);
expect(isProtectedLocalProxyHeaderName("authorization")).toBe(true);
expect(isProtectedLocalProxyHeaderName("X-Test")).toBe(false);
expect(
parseHeaderOverrideJson('{ "content-type": "text/plain" }').error,
).toBeTruthy();
expect(
parseHeaderOverrideJson('{ "Authorization": "Bearer x" }').error,
).toBeTruthy();
});
it("matches backend header value control-character rule", () => {
expect(isValidHttpHeaderValue("hello\tworld")).toBe(true);
expect(isValidHttpHeaderValue("hello\nworld")).toBe(false);
});
it("rejects stream in body overrides", () => {
expect(parseBodyOverrideJson('{ "stream": true }').error).toBeTruthy();
expect(
buildLocalProxyRequestOverrides("", '{ "stream": false }').error,
).toBeTruthy();
});
});