Files
next-ai-draw-io/tests/unit/ai-providers-cache.test.ts
T
dayuan.jiang 1333ed68c6 test: shared e2e helpers, vi.stubEnv, drop placeholder specs
- tests/e2e/lib: openApp(page, { path, config }), MODEL_CONFIGS_KEY,
  savedModelConfigs, settingsDialog, chunkedReplies, sse() and
  toolCallEvents() replace about 70 copies of goto + wait for iframe,
  three local openApp functions, 14 window.fetch overrides and the
  Node-side SSE serialisers; unused fixtures removed
- delete theme, save, history, model-config, upload and copy-paste
  specs (the copy-button test moves to chat.spec.ts); trim
  iframe-interaction, history-restore, keyboard and smoke to tests that
  can fail; file-upload asserts on the preview image
- settings-review-fixes.spec.ts split by topic into settings-bedrock,
  settings-tabs-sync and settings-providers
- unit tests use vi.stubEnv with unstubEnvs: true instead of
  hand-written process.env save and restore loops
2026-10-12 09:11:25 +09:00

79 lines
2.4 KiB
TypeScript

// @vitest-environment node
import { generateText, type ModelMessage } from "ai"
import { afterEach, describe, expect, it, vi } from "vitest"
import { CACHE_POINT, getAIModel } from "@/lib/ai-providers"
afterEach(() => {
vi.unstubAllGlobals()
})
// The chat route marks its system messages like this
const messages: ModelMessage[] = [
{ role: "system", content: "Instructions", providerOptions: CACHE_POINT },
{ role: "user", content: "hi" },
]
/** Send the messages through a real provider and return the request body */
async function requestBody(
provider: "anthropic" | "openrouter",
reply: unknown,
) {
let body: any
vi.stubGlobal(
"fetch",
vi.fn(async (_url: string, init: RequestInit) => {
body = JSON.parse(init.body as string)
return new Response(JSON.stringify(reply), {
headers: { "content-type": "application/json" },
})
}),
)
const { model } = getAIModel({
provider,
modelId:
provider === "anthropic"
? "claude-sonnet-4-5"
: "anthropic/claude-sonnet-4.5",
})
await generateText({ model, messages, maxRetries: 0 }).catch(() => {})
return body
}
describe("prompt cache breakpoints", () => {
it("reach the Anthropic API", async () => {
vi.stubEnv("ANTHROPIC_API_KEY", "test-key")
const body = await requestBody("anthropic", {
id: "msg_1",
type: "message",
role: "assistant",
content: [{ type: "text", text: "ok" }],
stop_reason: "end_turn",
usage: { input_tokens: 1, output_tokens: 1 },
})
expect(body.system).toEqual([
{
type: "text",
text: "Instructions",
cache_control: { type: "ephemeral" },
},
])
})
it("reach OpenRouter", async () => {
vi.stubEnv("OPENROUTER_API_KEY", "test-key")
const body = await requestBody("openrouter", {
id: "gen-1",
choices: [
{
index: 0,
message: { role: "assistant", content: "ok" },
finish_reason: "stop",
},
],
})
expect(JSON.stringify(body.messages[0])).toContain(
'"cache_control":{"type":"ephemeral"}',
)
})
})