76 lines
2.4 KiB
TypeScript
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();
|
|
});
|
|
});
|