File size: 2,873 Bytes
5090f42 | 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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | import { afterEach, describe, expect, it, vi } from 'vitest';
import { resolveOpenCodeModel, resolveModelString, resolvePhaseModel } from '../src/index.js';
afterEach(() => vi.unstubAllEnvs());
const env = {
COMPATIBLE_URL: 'https://example.test/v1',
COMPATIBLE_MODEL: 'MiniMax-M2.7',
COMPATIBLE_API_KEY: 'secret',
};
describe('OpenCode model identity', () => {
it('migrates the production bare model without changing native selections', () => {
expect(resolveOpenCodeModel('MiniMax-M2.7', undefined, env)).toEqual({
provider: 'automaker-compatible',
model: 'MiniMax-M2.7',
id: 'automaker-compatible/MiniMax-M2.7',
});
for (const model of [
'opencode/MiniMax-M2.7',
'openrouter/anthropic/claude-sonnet',
'opencode-big-pickle',
]) {
expect(resolveOpenCodeModel(model, undefined, env).id).toBe(
model.replace(/^opencode-/, 'opencode/')
);
}
expect(resolveOpenCodeModel('MiniMax-M2.7', 'opencode', env).id).toBe('opencode/MiniMax-M2.7');
expect(resolveOpenCodeModel('opencode-MiniMax-M2.7', undefined, env).id).toBe(
'opencode/MiniMax-M2.7'
);
});
it('does not infer a managed provider from an incomplete environment', () => {
expect(
resolveOpenCodeModel('MiniMax-M2.7', undefined, { COMPATIBLE_MODEL: 'MiniMax-M2.7' }).id
).toBe('opencode/MiniMax-M2.7');
});
it('keeps structured managed selections canonical, including nested model IDs', () => {
expect(resolveOpenCodeModel('vendor/model', 'automaker-compatible', env).id).toBe(
'automaker-compatible/vendor/model'
);
expect(resolveOpenCodeModel('auto', 'automaker-compatible-provider', env).id).toBe(
'automaker-compatible/MiniMax-M2.7'
);
expect(resolveOpenCodeModel('automaker-compatible/MiniMax-M2.7', undefined, env).id).toBe(
'automaker-compatible/MiniMax-M2.7'
);
expect(() => resolveOpenCodeModel('automaker-compatible/', undefined, env)).toThrow(
'OPENCODE_MODEL_NOT_CONFIGURED'
);
});
it('resolves persisted phases while preserving explicit Claude aliases and native IDs', () => {
Object.entries(env).forEach(([name, value]) => vi.stubEnv(name, value));
expect(
resolvePhaseModel({ model: 'MiniMax-M2.7', providerId: 'automaker-compatible' })
).toMatchObject({
model: 'automaker-compatible/MiniMax-M2.7',
providerId: 'automaker-compatible',
});
expect(resolvePhaseModel('MiniMax-M2.7').model).toBe('automaker-compatible/MiniMax-M2.7');
expect(resolveModelString('claude-sonnet')).toContain('claude-sonnet');
expect(resolveModelString('openrouter/anthropic/claude-sonnet')).toBe(
'openrouter/anthropic/claude-sonnet'
);
expect(
resolvePhaseModel({ model: 'opencode/MiniMax-M2.7', providerId: 'opencode' }).model
).toBe('opencode/MiniMax-M2.7');
});
});
|