import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; describe('resolveEvalModel', () => { const ORIG_ENV = process.env; beforeEach(() => { process.env = { ...ORIG_ENV }; vi.resetModules(); }); afterEach(() => { process.env = ORIG_ENV; vi.restoreAllMocks(); }); it('throws a helpful error when env var is unset and no fallback is given', async () => { delete process.env.EVAL_FOO_MODEL; vi.doMock('@/lib/server/resolve-model', () => ({ resolveModel: vi.fn(), })); const { resolveEvalModel } = await import('@/eval/shared/resolve-model'); await expect(resolveEvalModel('EVAL_FOO_MODEL')).rejects.toThrow(/EVAL_FOO_MODEL/); }); it('uses the env var when set', async () => { process.env.EVAL_FOO_MODEL = 'openai:gpt-4.1'; const resolveModel = vi.fn().mockResolvedValue({ model: 'resolved', modelInfo: {} }); vi.doMock('@/lib/server/resolve-model', () => ({ resolveModel })); const { resolveEvalModel } = await import('@/eval/shared/resolve-model'); await resolveEvalModel('EVAL_FOO_MODEL'); expect(resolveModel).toHaveBeenCalledWith({ modelString: 'openai:gpt-4.1' }); }); it('uses the explicit fallback when env var is unset', async () => { delete process.env.EVAL_FOO_MODEL; const resolveModel = vi.fn().mockResolvedValue({ model: 'resolved', modelInfo: {} }); vi.doMock('@/lib/server/resolve-model', () => ({ resolveModel })); const { resolveEvalModel } = await import('@/eval/shared/resolve-model'); await resolveEvalModel('EVAL_FOO_MODEL', 'google:gemini-2.5-flash'); expect(resolveModel).toHaveBeenCalledWith({ modelString: 'google:gemini-2.5-flash' }); }); it('env var takes precedence over fallback', async () => { process.env.EVAL_FOO_MODEL = 'anthropic:claude-haiku-4-5'; const resolveModel = vi.fn().mockResolvedValue({ model: 'resolved', modelInfo: {} }); vi.doMock('@/lib/server/resolve-model', () => ({ resolveModel })); const { resolveEvalModel } = await import('@/eval/shared/resolve-model'); await resolveEvalModel('EVAL_FOO_MODEL', 'google:gemini-2.5-flash'); expect(resolveModel).toHaveBeenCalledWith({ modelString: 'anthropic:claude-haiku-4-5' }); }); });