import { describe, expect, test } from "bun:test";import { buildForwardHeaders, buildResponseHeaders, buildUpstreamUrl, createProxyApp, type ProxyModeConfig,} from "./proxy-mode"; const baseConfig: ProxyModeConfig = { host: "127.0.0.1", port: 8080, upstream_url: "http://gpu-box:8080", cors_origins: [],}; describe("buildUpstreamUrl", () => { test("forwards path and query to the upstream origin", () => { const target = buildUpstreamUrl( "http://gpu-box:8080", "http://127.0.0.1:8080/v1/chat/completions?stream=true", ); expect(target.toString()).toBe("http://gpu-box:8080/v1/chat/completions?stream=true"); }); test("preserves an upstream base path", () => { const target = buildUpstreamUrl("http://gpu-box:8080/base/", "http://localhost:8080/status"); expect(target.toString()).toBe("http://gpu-box:8080/base/status"); });}); describe("buildForwardHeaders", () => { test("strips inbound auth and framing headers and injects the upstream key", () => { const headers = buildForwardHeaders( new Headers({ authorization: "Bearer local-key", "x-api-key": "local-key", "content-length": "42", "transfer-encoding": "chunked", "content-type": "application/json", accept: "text/event-stream", }), "upstream-key", ); expect(headers.get("authorization")).toBe("Bearer upstream-key"); expect(headers.get("x-api-key")).toBeNull(); expect(headers.get("content-length")).toBeNull(); expect(headers.get("transfer-encoding")).toBeNull(); expect(headers.get("content-type")).toBe("application/json"); expect(headers.get("accept")).toBe("text/event-stream"); }); test("sends no auth when no upstream key is configured", () => { const headers = buildForwardHeaders(new Headers({ authorization: "Bearer local" }), undefined); expect(headers.get("authorization")).toBeNull(); });}); describe("buildResponseHeaders", () => { test("drops stale encoding and hop-by-hop headers, keeps SSE headers", () => { const headers = buildResponseHeaders( new Headers({ "content-type": "text/event-stream", "cache-control": "no-cache", "content-encoding": "gzip", "content-length": "100", connection: "keep-alive", }), ); expect(headers.get("content-type")).toBe("text/event-stream"); expect(headers.get("cache-control")).toBe("no-cache"); expect(headers.get("content-encoding")).toBeNull(); expect(headers.get("content-length")).toBeNull(); expect(headers.get("connection")).toBeNull(); });}); describe("createProxyApp auth gate", () => { test("rejects unauthenticated requests when an api key is set", async () => { const app = createProxyApp({ ...baseConfig, api_key: "secret" }); const response = await app.request("http://127.0.0.1:8080/status"); expect(response.status).toBe(401); }); test("keeps /proxy/health public", async () => { const app = createProxyApp({ ...baseConfig, api_key: "secret", // Unroutable upstream: the health probe reports it unreachable instead of failing. upstream_url: "http://127.0.0.1:1", }); const response = await app.request("http://127.0.0.1:8080/proxy/health"); expect(response.status).toBe(200); const body = (await response.json()) as { mode: string; upstream_health: string }; expect(body.mode).toBe("proxy"); expect(body.upstream_health).toBe("unreachable"); });});
import { describe, expect, test } from "bun:test";
import {
buildForwardHeaders,
buildResponseHeaders,
buildUpstreamUrl,
createProxyApp,
type ProxyModeConfig,
} from "./proxy-mode";
const baseConfig: ProxyModeConfig = {
host: "127.0.0.1",
port: 8080,
upstream_url: "http://gpu-box:8080",
cors_origins: [],
};
describe("buildUpstreamUrl", () => {
test("forwards path and query to the upstream origin", () => {
const target = buildUpstreamUrl(
"http://gpu-box:8080",
"http://127.0.0.1:8080/v1/chat/completions?stream=true",
);
expect(target.toString()).toBe("http://gpu-box:8080/v1/chat/completions?stream=true");
});
test("preserves an upstream base path", () => {
const target = buildUpstreamUrl("http://gpu-box:8080/base/", "http://localhost:8080/status");
expect(target.toString()).toBe("http://gpu-box:8080/base/status");
});
});
describe("buildForwardHeaders", () => {
test("strips inbound auth and framing headers and injects the upstream key", () => {
const headers = buildForwardHeaders(
new Headers({
authorization: "Bearer local-key",
"x-api-key": "local-key",
"content-length": "42",
"transfer-encoding": "chunked",
"content-type": "application/json",
accept: "text/event-stream",
}),
"upstream-key",
);
expect(headers.get("authorization")).toBe("Bearer upstream-key");
expect(headers.get("x-api-key")).toBeNull();
expect(headers.get("content-length")).toBeNull();
expect(headers.get("transfer-encoding")).toBeNull();
expect(headers.get("content-type")).toBe("application/json");
expect(headers.get("accept")).toBe("text/event-stream");
});
test("sends no auth when no upstream key is configured", () => {
const headers = buildForwardHeaders(new Headers({ authorization: "Bearer local" }), undefined);
expect(headers.get("authorization")).toBeNull();
});
});
describe("buildResponseHeaders", () => {
test("drops stale encoding and hop-by-hop headers, keeps SSE headers", () => {
const headers = buildResponseHeaders(
new Headers({
"content-type": "text/event-stream",
"cache-control": "no-cache",
"content-encoding": "gzip",
"content-length": "100",
connection: "keep-alive",
}),
);
expect(headers.get("content-type")).toBe("text/event-stream");
expect(headers.get("cache-control")).toBe("no-cache");
expect(headers.get("content-encoding")).toBeNull();
expect(headers.get("content-length")).toBeNull();
expect(headers.get("connection")).toBeNull();
});
});
describe("createProxyApp auth gate", () => {
test("rejects unauthenticated requests when an api key is set", async () => {
const app = createProxyApp({ ...baseConfig, api_key: "secret" });
const response = await app.request("http://127.0.0.1:8080/status");
expect(response.status).toBe(401);
});
test("keeps /proxy/health public", async () => {
const app = createProxyApp({
...baseConfig,
api_key: "secret",
// Unroutable upstream: the health probe reports it unreachable instead of failing.
upstream_url: "http://127.0.0.1:1",
});
const response = await app.request("http://127.0.0.1:8080/proxy/health");
expect(response.status).toBe(200);
const body = (await response.json()) as { mode: string; upstream_health: string };
expect(body.mode).toBe("proxy");
expect(body.upstream_health).toBe("unreachable");
});
});