Files
waooplus/tests/unit/model-gateway/openai-compat-responses.test.ts
2026-03-08 17:10:06 +08:00

68 lines
2.2 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest'
const resolveOpenAICompatClientConfigMock = vi.hoisted(() =>
vi.fn(async () => ({
providerId: 'openai-compatible:node-1',
baseUrl: 'https://compat.example.com/v1',
apiKey: 'sk-test',
})),
)
vi.mock('@/lib/model-gateway/openai-compat/common', () => ({
resolveOpenAICompatClientConfig: resolveOpenAICompatClientConfigMock,
}))
import { runOpenAICompatResponsesCompletion } from '@/lib/model-gateway/openai-compat/responses'
describe('model-gateway openai-compat responses executor', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('converts responses payload to normalized chat completion', async () => {
const fetchMock = vi.fn(async () => new Response(JSON.stringify({
output: [
{ type: 'reasoning', text: 'think-' },
{ type: 'output_text', text: 'hello' },
],
usage: {
input_tokens: 12,
output_tokens: 7,
},
}), { status: 200 }))
vi.stubGlobal('fetch', fetchMock)
const completion = await runOpenAICompatResponsesCompletion({
userId: 'user-1',
providerId: 'openai-compatible:node-1',
modelId: 'gpt-4.1-mini',
messages: [{ role: 'user', content: 'hello' }],
temperature: 0.2,
})
expect(completion.choices[0]?.message?.content).toEqual([
{ type: 'reasoning', text: 'think-' },
{ type: 'text', text: 'hello' },
])
expect(completion.usage?.prompt_tokens).toBe(12)
expect(completion.usage?.completion_tokens).toBe(7)
const firstCall = fetchMock.mock.calls[0] as unknown[] | undefined
expect(String(firstCall?.[0])).toBe('https://compat.example.com/v1/responses')
})
it('throws status-bearing error when responses endpoint fails', async () => {
const fetchMock = vi.fn(async () => new Response('not supported', { status: 404 }))
vi.stubGlobal('fetch', fetchMock)
await expect(
runOpenAICompatResponsesCompletion({
userId: 'user-1',
providerId: 'openai-compatible:node-1',
modelId: 'gpt-4.1-mini',
messages: [{ role: 'user', content: 'hello' }],
temperature: 0.2,
}),
).rejects.toThrow('OPENAI_COMPAT_RESPONSES_FAILED: 404')
})
})