import { describe, expect, it } from 'vitest' import { getAddableModelTypesForProvider, getVisibleModelTypesForProvider, shouldShowOpenAICompatVideoHint, } from '@/app/[locale]/profile/components/api-config/provider-card/ProviderAdvancedFields' import { buildCustomPricingFromModelForm, buildProviderConnectionPayload, } from '@/app/[locale]/profile/components/api-config/provider-card/hooks/useProviderCardState' describe('provider card pricing form behavior', () => { it('allows openai-compatible provider to add llm/image/video', () => { expect(getAddableModelTypesForProvider('openai-compatible:oa-1')).toEqual(['llm', 'image', 'video']) }) it('shows llm/image/video tabs by default for openai-compatible even with only image models', () => { const visible = getVisibleModelTypesForProvider( 'openai-compatible:oa-1', { image: [ { modelId: 'gpt-image-1', modelKey: 'openai-compatible:oa-1::gpt-image-1', name: 'Image', type: 'image', provider: 'openai-compatible:oa-1', price: 0, enabled: true, }, ], }, ) expect(visible).toEqual(['llm', 'image', 'video']) }) it('shows the openai-compatible video hint only for openai-compatible video add forms', () => { expect(shouldShowOpenAICompatVideoHint('openai-compatible:oa-1', 'video')).toBe(true) expect(shouldShowOpenAICompatVideoHint('openai-compatible:oa-1', 'image')).toBe(false) expect(shouldShowOpenAICompatVideoHint('gemini-compatible:gm-1', 'video')).toBe(false) expect(shouldShowOpenAICompatVideoHint('ark', 'video')).toBe(false) }) it('keeps payload without customPricing when pricing toggle is off', () => { const result = buildCustomPricingFromModelForm( 'image', { name: 'Image', modelId: 'gpt-image-1', enableCustomPricing: false, basePrice: '0.8', }, { needsCustomPricing: true }, ) expect(result).toEqual({ ok: true }) }) it('builds llm customPricing payload when pricing toggle is on', () => { const result = buildCustomPricingFromModelForm( 'llm', { name: 'GPT', modelId: 'gpt-4.1', enableCustomPricing: true, priceInput: '2.5', priceOutput: '8', }, { needsCustomPricing: true }, ) expect(result).toEqual({ ok: true, customPricing: { llm: { inputPerMillion: 2.5, outputPerMillion: 8, }, }, }) }) it('builds media customPricing payload with option prices when enabled', () => { const result = buildCustomPricingFromModelForm( 'video', { name: 'Sora', modelId: 'sora-2', enableCustomPricing: true, basePrice: '0.9', optionPricesJson: '{"resolution":{"720x1280":0.1},"duration":{"8":0.4}}', }, { needsCustomPricing: true }, ) expect(result).toEqual({ ok: true, customPricing: { video: { basePrice: 0.9, optionPrices: { resolution: { '720x1280': 0.1, }, duration: { '8': 0.4, }, }, }, }, }) }) it('rejects invalid media optionPrices JSON when enabled', () => { const result = buildCustomPricingFromModelForm( 'image', { name: 'Image', modelId: 'gpt-image-1', enableCustomPricing: true, basePrice: '0.3', optionPricesJson: '{"resolution":{"1024x1024":"free"}}', }, { needsCustomPricing: true }, ) expect(result).toEqual({ ok: false, reason: 'invalid' }) }) it('bugfix: includes baseUrl for openai-compatible provider connection test payload', () => { const payload = buildProviderConnectionPayload({ providerKey: 'openai-compatible', apiKey: ' sk-test ', baseUrl: ' https://api.openai-proxy.example/v1 ', }) expect(payload).toEqual({ apiType: 'openai-compatible', apiKey: 'sk-test', baseUrl: 'https://api.openai-proxy.example/v1', }) }) it('omits baseUrl for non-compatible provider connection test payload', () => { const payload = buildProviderConnectionPayload({ providerKey: 'ark', apiKey: ' ark-key ', baseUrl: ' https://ignored.example/v1 ', }) expect(payload).toEqual({ apiType: 'ark', apiKey: 'ark-key', }) }) it('includes llmModel in provider connection test payload when configured', () => { const payload = buildProviderConnectionPayload({ providerKey: 'openai-compatible', apiKey: ' sk-test ', baseUrl: ' https://compat.example.com/v1 ', llmModel: ' gpt-4.1-mini ', }) expect(payload).toEqual({ apiType: 'openai-compatible', apiKey: 'sk-test', baseUrl: 'https://compat.example.com/v1', llmModel: 'gpt-4.1-mini', }) }) })