Files
ThothII/frontend/src/api/runtime-config.test.ts

42 lines
1.5 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { backendBaseUrl, joinBackendPath, resolveBackendUrl } from "./runtime-config";
describe("resolveBackendUrl", () => {
it("uses same-origin /api by default", () => {
expect(resolveBackendUrl()).toBe("/api");
});
it("does not allow a browser-facing backend override", () => {
expect(() => resolveBackendUrl("https://api.example.test")).toThrow(/same-origin/i);
});
it("keeps the exported browser base on /api", () => {
expect(backendBaseUrl).toBe("/api");
});
it("accepts a same-origin prefixed API base for embedded deployments", () => {
expect(resolveBackendUrl({ backendBaseUrl: "/embedded/api" })).toBe("/embedded/api");
});
it.each(["/backend", "api", "//evil.test", "ftp://example.test", "https://user:pass@example.test"])(
"rejects any browser-facing backend URL %j",
(backendBaseUrl) => {
expect(() => resolveBackendUrl(backendBaseUrl)).toThrow(/same-origin/i);
},
);
});
describe("joinBackendPath", () => {
it.each([
["", "/sessions/s1", "/sessions/s1"],
["/", "/sessions/s1", "/sessions/s1"],
["/api", "/sessions/s1", "/api/sessions/s1"],
["/api/", "/sessions/s1", "/api/sessions/s1"],
["https://example.test/api", "/sessions/s1", "https://example.test/api/sessions/s1"],
["https://example.test/api/", "sessions/s1", "https://example.test/api/sessions/s1"],
])("joins base %j and path %j", (base, path, expected) => {
expect(joinBackendPath(base, path)).toBe(expected);
});
});