import { describe, expect, test } from "bun:test"; import { buildScreenshotUrl, isValidSlug, screenshotFilePath, } from "../src/lib/screenshot"; describe("buildScreenshotUrl", () => { test("包含必填的编码后 url 与默认参数", () => { const url = buildScreenshotUrl("https://example.com/a?b=1&c=2"); expect(url.startsWith("https://api.adx9.com/screenshot/v1?")).toBe(true); expect(url).toContain(`url=${encodeURIComponent("https://example.com/a?b=1&c=2")}`); expect(url).toContain("mode=viewport"); expect(url).toContain("w=1440"); expect(url).toContain("h=900"); expect(url).toContain("ow=800"); expect(url).toContain("cf=1"); expect(url).toContain("format=webp"); expect(url).toContain("q=85"); expect(url).toContain("wait=3"); }); test("支持覆盖视口/输出参数", () => { const url = buildScreenshotUrl("https://example.com", { w: 1280, h: 800, format: "jpeg", q: 70, wait: 5, ow: 640, fit: "contain", }); expect(url).toContain("w=1280"); expect(url).toContain("h=800"); expect(url).toContain("format=jpeg"); expect(url).toContain("q=70"); expect(url).toContain("wait=5"); expect(url).toContain("ow=640"); expect(url).toContain("fit=contain"); }); }); describe("isValidSlug", () => { test("合法 slug", () => { expect(isValidSlug("github-copilot")).toBe(true); expect(isValidSlug("chatgpt")).toBe(true); expect(isValidSlug("a1-b2")).toBe(true); }); test("拒绝路径穿越与非法字符", () => { expect(isValidSlug("../etc/passwd")).toBe(false); expect(isValidSlug("a/b")).toBe(false); expect(isValidSlug("a b")).toBe(false); expect(isValidSlug("")).toBe(false); expect(isValidSlug("-abc")).toBe(false); }); }); describe("screenshotFilePath", () => { test("slug 映射为 <目录>/.webp", () => { const p = screenshotFilePath("github-copilot"); expect(p.endsWith("github-copilot.webp")).toBe(true); }); });