import { readFileSync } from "node:fs"; import path from "node:path"; import { describe, expect, it } from "vitest"; import { assertAbsoluteApiUrlHasApiSegment } from "./api-url-contract"; describe("assertAbsoluteApiUrlHasApiSegment", () => { it("allows relative /api", () => { expect(() => assertAbsoluteApiUrlHasApiSegment("/api")).not.toThrow(); }); it("allows empty or undefined", () => { expect(() => assertAbsoluteApiUrlHasApiSegment(undefined)).not.toThrow(); expect(() => assertAbsoluteApiUrlHasApiSegment("")).not.toThrow(); }); it("allows absolute URL ending with /api", () => { expect(() => assertAbsoluteApiUrlHasApiSegment("https://api.seahavenindustries.com/api"), ).not.toThrow(); }); it("rejects absolute URL without /api", () => { expect(() => assertAbsoluteApiUrlHasApiSegment("https://api.seahavenindustries.com")).toThrow( /must end with \/api/, ); }); }); describe(".env.example contract", () => { it("documents an absolute VITE_API_URL that includes /api", () => { const envExample = readFileSync(path.resolve(process.cwd(), ".env.example"), "utf8"); const match = envExample.match(/^VITE_API_URL=(.+)$/m); expect(match).not.toBeNull(); const value = match![1]!.trim(); if (value.startsWith("http")) { expect(() => assertAbsoluteApiUrlHasApiSegment(value)).not.toThrow(); } }); });