110 lines
3.1 KiB
TypeScript
110 lines
3.1 KiB
TypeScript
import { beforeEach, describe, expect, it, vi, type Mock } from 'vitest';
|
|
import {
|
|
generateWithOpenAIImage,
|
|
testOpenAIImageConnectivity,
|
|
} from '@/lib/media/adapters/openai-image-adapter';
|
|
|
|
const mockFetch = vi.fn() as Mock;
|
|
vi.stubGlobal('fetch', mockFetch);
|
|
|
|
describe('openai-image-adapter', () => {
|
|
beforeEach(() => {
|
|
mockFetch.mockReset();
|
|
});
|
|
|
|
it('posts image generation requests to the configured OpenAI Images endpoint', async () => {
|
|
mockFetch.mockResolvedValueOnce({
|
|
ok: true,
|
|
json: async () => ({ data: [{ url: 'https://cdn.example.com/image.png' }] }),
|
|
});
|
|
|
|
const result = await generateWithOpenAIImage(
|
|
{
|
|
providerId: 'openai-image',
|
|
apiKey: 'sk-test',
|
|
baseUrl: 'https://proxy.example.com/v1/',
|
|
model: 'gpt-image-2',
|
|
},
|
|
{ prompt: 'a classroom diagram', width: 1536, height: 1024 },
|
|
);
|
|
|
|
expect(mockFetch).toHaveBeenCalledWith(
|
|
'https://proxy.example.com/v1/images/generations',
|
|
expect.objectContaining({
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
Authorization: 'Bearer sk-test',
|
|
},
|
|
}),
|
|
);
|
|
const body = JSON.parse(mockFetch.mock.calls[0][1].body);
|
|
expect(body).toEqual({
|
|
model: 'gpt-image-2',
|
|
prompt: 'a classroom diagram',
|
|
n: 1,
|
|
size: '1536x1024',
|
|
});
|
|
expect(result).toEqual({
|
|
url: 'https://cdn.example.com/image.png',
|
|
base64: undefined,
|
|
width: 1536,
|
|
height: 1024,
|
|
});
|
|
});
|
|
|
|
it('returns base64 image data when OpenAI responds inline', async () => {
|
|
mockFetch.mockResolvedValueOnce({
|
|
ok: true,
|
|
json: async () => ({ data: [{ b64_json: 'aW1hZ2U=' }] }),
|
|
});
|
|
|
|
const result = await generateWithOpenAIImage(
|
|
{ providerId: 'openai-image', apiKey: 'sk-test' },
|
|
{ prompt: 'inline result' },
|
|
);
|
|
|
|
expect(result.base64).toBe('aW1hZ2U=');
|
|
expect(result.width).toBe(1024);
|
|
expect(result.height).toBe(1024);
|
|
});
|
|
|
|
it('throws a useful error on failed generation responses', async () => {
|
|
mockFetch.mockResolvedValueOnce({
|
|
ok: false,
|
|
status: 400,
|
|
text: async () => 'bad request',
|
|
statusText: 'Bad Request',
|
|
});
|
|
|
|
await expect(
|
|
generateWithOpenAIImage(
|
|
{ providerId: 'openai-image', apiKey: 'sk-test' },
|
|
{ prompt: 'bad request' },
|
|
),
|
|
).rejects.toThrow('OpenAI image generation failed (400): bad request');
|
|
});
|
|
|
|
it('reports connectivity failures for missing models', async () => {
|
|
mockFetch.mockResolvedValueOnce({
|
|
ok: false,
|
|
status: 404,
|
|
text: async () => 'not found',
|
|
statusText: 'Not Found',
|
|
});
|
|
|
|
const result = await testOpenAIImageConnectivity({
|
|
providerId: 'openai-image',
|
|
apiKey: 'sk-test',
|
|
model: 'gpt-image-unknown',
|
|
});
|
|
|
|
expect(mockFetch).toHaveBeenCalledWith('https://api.openai.com/v1/models/gpt-image-unknown', {
|
|
redirect: 'manual',
|
|
headers: { Authorization: 'Bearer sk-test' },
|
|
});
|
|
expect(result.success).toBe(false);
|
|
expect(result.message).toBe('OpenAI Image model not found: gpt-image-unknown');
|
|
});
|
|
});
|