/** * lib/camera 單元測試(塊 1) * * 驗證 buildStreamUrl: * - jsdom(window 存在)+ 無 NEXT_PUBLIC_API_BASE → base = ""(同 origin),回相對路徑 * - cacheBust 以 `_t=` query 附加,且做 URL encode * - 已含 query 的 URL 用 `&` 串接 * - 相對路徑補開頭斜線 */ import { afterEach, describe, expect, it } from "vitest"; import { buildStreamUrl, CAMERA_STREAM_PATH } from "./camera"; const ORIGINAL = process.env.NEXT_PUBLIC_API_BASE; afterEach(() => { if (ORIGINAL === undefined) delete process.env.NEXT_PUBLIC_API_BASE; else process.env.NEXT_PUBLIC_API_BASE = ORIGINAL; }); describe("buildStreamUrl", () => { it("同 origin(無 env)回相對路徑,不含 cacheBust 時無 query", () => { delete process.env.NEXT_PUBLIC_API_BASE; expect(buildStreamUrl(CAMERA_STREAM_PATH)).toBe("/api/camera/stream"); }); it("附加 cacheBust 為 _t query 並 encode", () => { delete process.env.NEXT_PUBLIC_API_BASE; expect(buildStreamUrl("/api/camera/stream", "dev 1")).toBe( "/api/camera/stream?_t=dev%201", ); }); it("已含 query 時用 & 串接 cacheBust", () => { delete process.env.NEXT_PUBLIC_API_BASE; expect(buildStreamUrl("/api/camera/stream?x=1", "abc")).toBe( "/api/camera/stream?x=1&_t=abc", ); }); it("跨 origin(有 env)前綴 base URL", () => { process.env.NEXT_PUBLIC_API_BASE = "https://api.example.com"; expect(buildStreamUrl("/api/camera/stream")).toBe( "https://api.example.com/api/camera/stream", ); }); it("相對路徑無開頭斜線時自動補上", () => { delete process.env.NEXT_PUBLIC_API_BASE; expect(buildStreamUrl("api/camera/stream")).toBe("/api/camera/stream"); }); });