Files
TodoList/apps/api/test/openai-compatible-provider.spec.ts

81 lines
2.1 KiB
TypeScript

import { AiChannel } from "../generated/prisma/client";
import { OpenAiCompatibleProvider } from "../src/ai/providers/openai-compatible.provider";
describe("OpenAiCompatibleProvider", () => {
const originalFetch = global.fetch;
afterEach(() => {
global.fetch = originalFetch;
jest.restoreAllMocks();
});
it("should read text from responses style payload when chat content is empty", async () => {
const provider = new OpenAiCompatibleProvider();
const fetchMock = jest.fn(async (_input: unknown, init?: RequestInit) => {
expect(init?.method).toBe("POST");
return new Response(
JSON.stringify({
id: "resp_123",
object: "response",
model: "gpt-5.4",
output: [
{
id: "msg_123",
type: "message",
role: "assistant",
content: [
{
type: "output_text",
text: "今天优先先完成截止时间最近的任务。"
}
]
}
],
usage: {
prompt_tokens: 15,
completion_tokens: 9,
total_tokens: 24
}
}),
{
status: 200,
headers: {
"content-type": "application/json"
}
}
);
});
global.fetch = fetchMock as typeof global.fetch;
const result = await provider.execute(
{
channel: AiChannel.USER_KEY,
source: "binding",
sourceId: "binding_user_key_1",
providerName: "airouter",
model: "gpt-5.4",
configId: null,
configName: null,
endpoint: "https://api.airouter.io/v1",
apiKey: "sk_test"
},
{
userId: "user_1",
message: "帮我安排今天的任务",
sessionId: null
}
);
expect(fetchMock).toHaveBeenCalledTimes(1);
expect(result.content).toBe("今天优先先完成截止时间最近的任务。");
expect(result.model).toBe("gpt-5.4");
expect(result.usage).toEqual({
promptTokens: 15,
completionTokens: 9,
totalTokens: 24
});
});
});