import { describe, expect, it } from "vitest"; import { backendBaseUrl, joinBackendPath, resolveBackendUrl } from "./runtime-config"; describe("resolveBackendUrl", () => { it("uses the runtime-injected backend URL", () => { expect(resolveBackendUrl({ backendBaseUrl: "/api" })).toBe("/api"); }); it("falls back to the Vite backend URL", () => { expect(resolveBackendUrl(undefined)).toBe(import.meta.env.VITE_BACKEND_URL ?? ""); }); it("preserves the client default when Vite has no configured backend", () => { expect(backendBaseUrl).toBe(import.meta.env.VITE_BACKEND_URL ?? "http://localhost:8787"); }); it.each(["/backend", "api", "//evil.test", "ftp://example.test", "https://user:pass@example.test"])( "rejects unsupported backend URL %j", (backendBaseUrl) => { expect(() => resolveBackendUrl({ backendBaseUrl })).toThrow(/BACKEND_BASE_URL/); }, ); it.each(["", "/", "/api", "/api/", "http://localhost:8787", "https://api.example.test/v1"])( "accepts supported backend URL %j", (backendBaseUrl) => { expect(resolveBackendUrl({ backendBaseUrl })).toBe(backendBaseUrl); }, ); }); 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); }); });