import { describe, expect, it } from 'vitest' import { DEFAULT_IMAGE_OUTPUT_FORMAT, IMAGE_BACKGROUND_LABELS, IMAGE_BACKGROUNDS, IMAGE_INPUT_FIDELITY_LABELS, IMAGE_INPUT_FIDELITIES, IMAGE_MODERATION_LABELS, IMAGE_MODERATIONS, IMAGE_OUTPUT_FORMAT_LABELS, IMAGE_OUTPUT_FORMATS, IMAGE_QUALITIES, IMAGE_QUALITY_LABELS, IMAGE_RATIOS, buildImageEditEndpoint, buildImageEndpoint, buildImageRequestBody, formatImageQuality, getDefaultImageSize, getImageSizeOptions, ratioToSize, supportsImageInputFidelity } from './image-options' describe('image options', () => { it('maps expanded ratios to API size strings', () => { expect(IMAGE_RATIOS).toEqual(['1:1', '3:2', '2:3', '4:3', '3:4', '16:9', '9:16', '21:9', '9:21']) expect(ratioToSize('1:1')).toBe('1024x1024') expect(ratioToSize('3:2')).toBe('1536x1024') expect(ratioToSize('2:3')).toBe('1024x1536') expect(ratioToSize('4:3')).toBe('1024x768') expect(ratioToSize('3:4')).toBe('768x1024') expect(ratioToSize('16:9')).toBe('1792x1008') expect(ratioToSize('9:16')).toBe('1008x1792') expect(ratioToSize('21:9')).toBe('1344x576') expect(ratioToSize('9:21')).toBe('576x1344') expect(getDefaultImageSize('16:9')).toBe('1792x1008') expect(getDefaultImageSize('9:16')).toBe('1008x1792') expect(getImageSizeOptions('16:9').at(-1)?.value).toBe('3840x2160') }) it('exposes GPT and compatibility quality options', () => { expect(IMAGE_QUALITIES).toEqual(['auto', 'low', 'medium', 'high']) expect(IMAGE_QUALITY_LABELS).toEqual({ auto: '自动', low: '低', medium: '中', high: '高' }) expect(formatImageQuality('high')).toBe('高') expect(IMAGE_OUTPUT_FORMATS).toEqual(['jpeg', 'png', 'webp']) expect(DEFAULT_IMAGE_OUTPUT_FORMAT).toBe('png') expect(IMAGE_OUTPUT_FORMAT_LABELS).toEqual({ jpeg: 'JPEG', png: 'PNG', webp: 'WebP' }) expect(IMAGE_BACKGROUNDS).toEqual(['auto', 'opaque']) expect(IMAGE_BACKGROUND_LABELS).toEqual({ auto: '自动', opaque: '不透明' }) expect(IMAGE_MODERATIONS).toEqual(['auto', 'low']) expect(IMAGE_MODERATION_LABELS).toEqual({ auto: '自动', low: '低' }) expect(IMAGE_INPUT_FIDELITIES).toEqual(['low', 'high']) expect(IMAGE_INPUT_FIDELITY_LABELS).toEqual({ low: '低', high: '高' }) }) it('normalizes baseURL into the generations endpoint', () => { expect(buildImageEndpoint('https://example.test///')).toBe('https://example.test/v1/images/generations') }) it('normalizes baseURL into the edits endpoint', () => { expect(buildImageEditEndpoint('https://example.test///')).toBe('https://example.test/v1/images/edits') }) it('treats gpt-image-2 as not supporting input fidelity overrides', () => { expect(supportsImageInputFidelity('gpt-image-2')).toBe(false) expect(supportsImageInputFidelity('gpt-image-1')).toBe(true) }) it('builds a request body without leaking empty optional fields', () => { expect( buildImageRequestBody({ conversationId: 'c1', prompt: ' mint glasshouse ', model: 'gpt-image-2', ratio: '3:2', size: '1536x1024', quality: 'auto', n: 2 }) ).toEqual({ prompt: 'mint glasshouse', model: 'gpt-image-2', size: '1536x1024', quality: 'auto', n: 2 }) }) it('maps advanced request fields when they are enabled', () => { expect( buildImageRequestBody({ conversationId: 'c1', prompt: 'scene', model: 'gpt-image-2', ratio: '1:1', size: '1024x1024', quality: 'high', n: 1, outputFormat: 'webp', outputCompression: 85, background: 'opaque', moderation: 'low', stream: true, partialImages: 3 }) ).toEqual({ prompt: 'scene', model: 'gpt-image-2', size: '1024x1024', quality: 'high', n: 1, output_format: 'webp', output_compression: 85, background: 'opaque', moderation: 'low', stream: true, partial_images: 3 }) }) })