import { renderToStaticMarkup } from "react-dom/server"; import { describe, expect, it } from "vitest"; import { AiProvidersPage } from "./AiProvidersPage"; import type { AiProviderResponse } from "../api/types"; const provider: AiProviderResponse = { id: "ai.openai", name: "OpenAI Relay", kind: "openai-compatible", baseUrl: "https://relay.example.test/v1", apiKeyRef: "secret://providers/openai", models: ["gpt-4.1", "gpt-4.1-mini"], defaultModel: "gpt-4.1-mini", relayMode: "relay", timeoutMs: 30000, status: "active", redactionPolicy: "default" }; describe("AiProvidersPage", () => { it("renders the loading state before API data arrives", () => { const html = renderToStaticMarkup(); expect(html).toContain("AI 提供商管理"); expect(html).toContain("正在加载 AI 提供商"); }); it("renders an empty API state when the platform returns no providers", () => { const html = renderToStaticMarkup(); expect(html).toContain("暂无 AI 提供商"); expect(html).toContain("page-summary-chip"); expect(html).not.toContain("metric-card"); expect(html).toContain("平台还没有返回任何提供商"); expect(html).toContain("新增提供商"); expect(html).not.toContain('value="secret://providers/"'); expect(html).not.toContain("OpenAI Relay"); }); it("renders local-development fixtures with an explicit status label", () => { const html = renderToStaticMarkup(); expect(html).toContain("OpenAI Relay"); expect(html).toContain("本地开发"); expect(html).toContain("secret://providers/openai"); expect(html).toContain("测试"); expect(html).toContain("模型"); expect(html).toContain("编辑"); expect(html).toContain("更多"); }); it("renders guided provider setup for an existing provider", () => { const html = renderToStaticMarkup(); expect(html).toContain("配置流程"); expect(html).toContain("提供商预设"); expect(html).toContain("保存前检查"); expect(html).toContain("测试已保存配置"); expect(html).toContain("发现模型并填入"); expect(html).toContain("secret://providers/..."); expect(html).not.toContain("api.example.test"); }); it("does not render raw key field names", () => { const html = renderToStaticMarkup(); expect(html).not.toContain("apiKey="); expect(html).not.toContain("rawApiKey"); expect(html).not.toContain('value="sk-'); expect(html).not.toContain(">sk-"); expect(html).not.toContain("api_key="); expect(html).not.toContain("Bearer "); }); });