| import { afterEach, beforeEach, expect, mock, test } from 'bun:test' |
|
|
| import { resetModelStringsForTestingOnly } from '../../bootstrap/state.js' |
| import { saveGlobalConfig } from '../config.js' |
|
|
| async function importFreshModelOptionsModule() { |
| mock.restore() |
| mock.module('./providers.js', () => ({ |
| getAPIProvider: () => 'github', |
| })) |
| const nonce = `${Date.now()}-${Math.random()}` |
| return import(`./modelOptions.js?ts=${nonce}`) |
| } |
|
|
| const originalEnv = { |
| CLAUDE_CODE_USE_GITHUB: process.env.CLAUDE_CODE_USE_GITHUB, |
| CLAUDE_CODE_USE_OPENAI: process.env.CLAUDE_CODE_USE_OPENAI, |
| CLAUDE_CODE_USE_GEMINI: process.env.CLAUDE_CODE_USE_GEMINI, |
| CLAUDE_CODE_USE_BEDROCK: process.env.CLAUDE_CODE_USE_BEDROCK, |
| CLAUDE_CODE_USE_VERTEX: process.env.CLAUDE_CODE_USE_VERTEX, |
| CLAUDE_CODE_USE_FOUNDRY: process.env.CLAUDE_CODE_USE_FOUNDRY, |
| OPENAI_MODEL: process.env.OPENAI_MODEL, |
| OPENAI_BASE_URL: process.env.OPENAI_BASE_URL, |
| ANTHROPIC_CUSTOM_MODEL_OPTION: process.env.ANTHROPIC_CUSTOM_MODEL_OPTION, |
| } |
|
|
| beforeEach(() => { |
| mock.restore() |
| delete process.env.CLAUDE_CODE_USE_GITHUB |
| delete process.env.CLAUDE_CODE_USE_OPENAI |
| delete process.env.CLAUDE_CODE_USE_GEMINI |
| delete process.env.CLAUDE_CODE_USE_BEDROCK |
| delete process.env.CLAUDE_CODE_USE_VERTEX |
| delete process.env.CLAUDE_CODE_USE_FOUNDRY |
| delete process.env.OPENAI_MODEL |
| delete process.env.OPENAI_BASE_URL |
| delete process.env.ANTHROPIC_CUSTOM_MODEL_OPTION |
| resetModelStringsForTestingOnly() |
| }) |
|
|
| afterEach(() => { |
| process.env.CLAUDE_CODE_USE_GITHUB = originalEnv.CLAUDE_CODE_USE_GITHUB |
| process.env.CLAUDE_CODE_USE_OPENAI = originalEnv.CLAUDE_CODE_USE_OPENAI |
| process.env.CLAUDE_CODE_USE_GEMINI = originalEnv.CLAUDE_CODE_USE_GEMINI |
| process.env.CLAUDE_CODE_USE_BEDROCK = originalEnv.CLAUDE_CODE_USE_BEDROCK |
| process.env.CLAUDE_CODE_USE_VERTEX = originalEnv.CLAUDE_CODE_USE_VERTEX |
| process.env.CLAUDE_CODE_USE_FOUNDRY = originalEnv.CLAUDE_CODE_USE_FOUNDRY |
| process.env.OPENAI_MODEL = originalEnv.OPENAI_MODEL |
| process.env.OPENAI_BASE_URL = originalEnv.OPENAI_BASE_URL |
| process.env.ANTHROPIC_CUSTOM_MODEL_OPTION = |
| originalEnv.ANTHROPIC_CUSTOM_MODEL_OPTION |
| saveGlobalConfig(current => ({ |
| ...current, |
| additionalModelOptionsCache: [], |
| additionalModelOptionsCacheScope: undefined, |
| openaiAdditionalModelOptionsCache: [], |
| openaiAdditionalModelOptionsCacheByProfile: {}, |
| providerProfiles: [], |
| activeProviderProfileId: undefined, |
| })) |
| resetModelStringsForTestingOnly() |
| }) |
|
|
| test('GitHub provider exposes default + all Copilot models in /model options', async () => { |
| process.env.CLAUDE_CODE_USE_GITHUB = '1' |
| delete process.env.CLAUDE_CODE_USE_OPENAI |
| delete process.env.CLAUDE_CODE_USE_GEMINI |
| delete process.env.CLAUDE_CODE_USE_BEDROCK |
| delete process.env.CLAUDE_CODE_USE_VERTEX |
| delete process.env.CLAUDE_CODE_USE_FOUNDRY |
|
|
| process.env.OPENAI_MODEL = 'gpt-4o' |
| delete process.env.ANTHROPIC_CUSTOM_MODEL_OPTION |
|
|
| const { getModelOptions } = await importFreshModelOptionsModule() |
| const options = getModelOptions(false) |
| const nonDefault = options.filter( |
| (option: { value: unknown }) => option.value !== null, |
| ) |
|
|
| expect(nonDefault.length).toBeGreaterThan(1) |
| expect(nonDefault.some((o: { value: unknown }) => o.value === 'gpt-4o')).toBe(true) |
| expect(nonDefault.some((o: { value: unknown }) => o.value === 'gpt-5.3-codex')).toBe(true) |
| }) |
|
|