import { describe, expect, test } from 'bun:test'; import { mergeCatalogue } from './store'; import { SHIPPED_CATALOGUE } from './shipped'; import type { Catalogue } from './types'; const price = (c: Catalogue, id: string) => c.providers[0]!.models.find((m) => m.id === id)?.pricing as { imageOutput?: number } | undefined; describe('catalogue merge', () => { test('a refresh that establishes nothing changes nothing', () => { expect(mergeCatalogue(SHIPPED_CATALOGUE, null)).toEqual(SHIPPED_CATALOGUE); }); test('an id-only refresh never wipes curated facts', () => { const merged = mergeCatalogue(SHIPPED_CATALOGUE, { revision: 1, providers: [{ name: 'openai', label: 'OpenAI', envVar: 'OPENAI_API_KEY', models: [{ id: 'gpt-image-1', kind: 'image', source: 'api' }] }], }); const model = merged.providers[0]!.models.find((m) => m.id === 'gpt-image-1')!; expect(model.sizes).toHaveLength(4); expect(price(merged, 'gpt-image-1')?.imageOutput).toBe(40); expect(model.source).toBe('api'); }); test('a model we have never shipped is added, without an invented price', () => { const merged = mergeCatalogue(SHIPPED_CATALOGUE, { revision: 1, providers: [{ name: 'openai', label: 'OpenAI', envVar: 'OPENAI_API_KEY', models: [{ id: 'gpt-image-2', kind: 'image', source: 'api' }] }], }); expect(merged.providers[0]!.models.some((m) => m.id === 'gpt-image-2')).toBe(true); expect(price(merged, 'gpt-image-2')).toBeUndefined(); }); test('a file from another revision is ignored entirely', () => { const merged = mergeCatalogue(SHIPPED_CATALOGUE, { revision: 99, providers: [{ name: 'openai', label: 'nonsense', envVar: '', models: [] }], }); expect(merged.providers[0]!.label).toBe('OpenAI'); }); });