File size: 2,240 Bytes
a0ebf39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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' });
  });
});