import { describe, expect, it } from 'bun:test'; import { applyDeepSeekModelPreset, DEEPSEEK_THINKING_LEVELS, mergeModelOptions, reconcileModelSelection, } from '../src/services/modelService'; describe('model discovery selection', () => { const discovered = [ { name: 'deepseek-chat' }, { name: 'deepseek-reasoner' }, { name: 'deepseek-new-model' }, ]; it('selects every discovered model on the first fetch for a new connection', () => { expect(Array.from(reconcileModelSelection(discovered, [], [], 'initial'))).toEqual([ 'deepseek-chat', 'deepseek-reasoner', 'deepseek-new-model', ]); }); it('keeps saved selections and leaves newly discovered models unchecked', () => { expect(Array.from(reconcileModelSelection( discovered, [{ name: 'deepseek-chat' }], ['deepseek-chat'], 'initial', ))).toEqual(['deepseek-chat']); }); it('preserves refresh selections, drops unavailable discoveries, and keeps configured models', () => { expect(Array.from(reconcileModelSelection( [{ name: 'deepseek-reasoner' }, { name: 'deepseek-new-model' }], [{ name: 'custom-model' }], ['DEEPSEEK-REASONER', 'removed-model', 'custom-model'], 'refresh', ))).toEqual(['deepseek-reasoner', 'custom-model']); }); it('deduplicates model names case-insensitively and keeps configured metadata', () => { expect(mergeModelOptions( [{ name: 'deepseek-chat' }], [{ name: ' DEEPSEEK-CHAT ', alias: 'Chat' }], )).toEqual([{ name: 'DEEPSEEK-CHAT', alias: 'Chat' }]); }); }); describe('DeepSeek model preset', () => { it('adds built-in thinking levels while preserving existing metadata', () => { expect(applyDeepSeekModelPreset([{ name: 'deepseek-reasoner', thinking: { custom: true, levels: ['legacy'] }, }])).toEqual([{ name: 'deepseek-reasoner', thinking: { custom: true, levels: [...DEEPSEEK_THINKING_LEVELS] }, }]); }); });