import { describe, expect, it } from 'bun:test'; import { SessionModelController } from '@/core/model-controller'; import type { Provider } from '@/contracts/provider'; import type { ModelDescriptor } from '@/contracts/model'; const openai: ModelDescriptor = { id: 'openai:gpt-4o', provider: 'openai', model: 'gpt-4o' }; const local: ModelDescriptor = { id: 'local:llama3', provider: 'local', model: 'llama3' }; const provider = (): Provider => ({ stream: async function* () { yield { kind: 'done', message: { id: 'm', role: 'assistant', content: [] }, usage: { input: 0, output: 0 } }; }, }); describe('SessionModelController', () => { it('lists immutable catalog descriptors and selects a known id', () => { const queued: Provider[] = []; const controller = new SessionModelController({ models: [openai, local], active: openai, createProvider: provider, queueProvider: (p) => queued.push(p), }); expect(controller.list()).toEqual({ models: [openai, local], active: openai }); const result = controller.set(local.id); expect(result).toEqual({ previous: openai, active: local, effective: 'next_provider_call' }); expect(queued).toHaveLength(1); const listed = controller.list(); listed.models[0]!.model = 'mutated'; expect(controller.list().models[0]!.model).toBe(openai.model); }); it('rejects an unknown selection without creating or queuing a provider', () => { let created = 0; let queued = 0; const controller = new SessionModelController({ models: [openai], active: openai, createProvider: () => { created += 1; return provider(); }, queueProvider: () => { queued += 1; }, }); expect(() => controller.set('missing')).toThrow('unknown model selection'); expect(created).toBe(0); expect(queued).toBe(0); expect(controller.list().active).toEqual(openai); }); it('does not queue a provider when selecting the active id', () => { let created = 0; const controller = new SessionModelController({ models: [openai], active: openai, createProvider: () => { created += 1; return provider(); }, queueProvider: () => undefined, }); expect(controller.set(openai.id).previous).toEqual(openai); expect(created).toBe(0); }); });