import { describe, test, expect } from "bun:test"; import { generateSeoPage, generateToolFaqs } from "../src/lib/seo/page-generator"; describe("generateSeoPage", () => { const base = { name: "Blogging", kind: "use-case" as const, brandName: "AI Stack", toolCount: 12, freeCount: 4, topToolNames: ["ChatGPT", "Claude", "Grammarly"], year: 2026, }; test("生成 title / h1 / intro / faqs", () => { const page = generateSeoPage(base); expect(page.title).toContain("Best AI Tools for Blogging in 2026"); expect(page.h1).toBe("Best AI Tools for Blogging"); expect(page.intro).toContain("12"); expect(page.faqs.length).toBeGreaterThanOrEqual(3); }); test("description 含工具数与排序说明", () => { const page = generateSeoPage(base); expect(page.description).toContain("12"); expect(page.description).toContain("votes"); }); test("FAQ 具体化:引用真实工具名", () => { const page = generateSeoPage(base); const firstAnswer = page.faqs[0].answer; expect(firstAnswer).toContain("ChatGPT"); }); test("free 数量反映到 FAQ", () => { const page = generateSeoPage(base); const freeFaq = page.faqs.find((f) => f.question.startsWith("Are there free")); expect(freeFaq?.answer).toContain("4"); }); test("use case + audience 生成交叉引用 FAQ", () => { const page = generateSeoPage({ ...base, audienceName: "Marketers" }); const crossFaq = page.faqs.find((f) => f.question.toLowerCase().includes("marketer")); expect(crossFaq).toBeDefined(); }); test("零数据实体也能安全生成(无 NaN/undefined)", () => { const page = generateSeoPage({ name: "Research", kind: "audience", brandName: "X", toolCount: 0, }); expect(page.intro).not.toContain("undefined"); expect(page.title).not.toContain("NaN"); }); }); describe("generateToolFaqs", () => { test("由定价生成免费问答", () => { const faqs = generateToolFaqs({ name: "ChatGPT", pricing: "freemium" }); const freeFaq = faqs.find((f) => f.question.includes("free")); expect(freeFaq?.answer).toContain("freemium"); }); test("含替代品问答", () => { const faqs = generateToolFaqs( { name: "Cursor", pricing: "freemium" }, ["Windsurf", "Copilot"] ); const altFaq = faqs.find((f) => f.question.includes("alternatives")); expect(altFaq?.answer).toContain("Windsurf"); }); test("描述自动补句号", () => { const faqs = generateToolFaqs({ name: "X", description: "It does things", }); expect(faqs[0].answer).toBe("It does things."); }); });