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', { headers: { Authorization: 'Bearer sk-test' }, }); expect(result.success).toBe(false); expect(result.message).toBe('OpenAI Image model not found: gpt-image-unknown'); }); });