| import { describe, expect, it, vi } from 'vitest' |
| import { mount } from '@vue/test-utils' |
| import { nextTick } from 'vue' |
|
|
| vi.mock('vue-i18n', () => ({ |
| useI18n: () => ({ |
| t: (key: string) => key |
| }) |
| })) |
|
|
| vi.mock('@/composables/useClipboard', () => ({ |
| useClipboard: () => ({ |
| copyToClipboard: vi.fn().mockResolvedValue(true) |
| }) |
| })) |
|
|
| import UseKeyModal from '../UseKeyModal.vue' |
|
|
| describe('UseKeyModal', () => { |
| it('renders GPT-5.5 and goals feature in OpenAI Codex config', () => { |
| const wrapper = mount(UseKeyModal, { |
| props: { |
| show: true, |
| apiKey: 'sk-test', |
| baseUrl: 'https://example.com/v1', |
| platform: 'openai' |
| }, |
| global: { |
| stubs: { |
| BaseDialog: { |
| template: '<div><slot /><slot name="footer" /></div>' |
| }, |
| Icon: { |
| template: '<span />' |
| } |
| } |
| } |
| }) |
|
|
| const codeBlocks = wrapper.findAll('pre code').map((code) => code.text()) |
| const configToml = codeBlocks.find((content) => content.includes('model_provider = "OpenAI"')) |
|
|
| expect(configToml).toBeDefined() |
| expect(configToml).toContain('model = "gpt-5.5"') |
| expect(configToml).toContain('review_model = "gpt-5.5"') |
| expect(configToml).not.toContain('model = "gpt-5.4"') |
| expect(configToml).not.toContain('model_context_window') |
| expect(configToml).not.toContain('model_auto_compact_token_limit') |
| expect(configToml).toContain('[features]\ngoals = true') |
| }) |
|
|
| it('renders GPT-5.5 and goals feature in OpenAI Codex WebSocket config', async () => { |
| const wrapper = mount(UseKeyModal, { |
| props: { |
| show: true, |
| apiKey: 'sk-test', |
| baseUrl: 'https://example.com/v1', |
| platform: 'openai' |
| }, |
| global: { |
| stubs: { |
| BaseDialog: { |
| template: '<div><slot /><slot name="footer" /></div>' |
| }, |
| Icon: { |
| template: '<span />' |
| } |
| } |
| } |
| }) |
|
|
| const wsTab = wrapper.findAll('button').find((button) => |
| button.text().includes('keys.useKeyModal.cliTabs.codexCliWs') |
| ) |
|
|
| expect(wsTab).toBeDefined() |
| await wsTab!.trigger('click') |
| await nextTick() |
|
|
| const codeBlocks = wrapper.findAll('pre code').map((code) => code.text()) |
| const configToml = codeBlocks.find((content) => content.includes('supports_websockets = true')) |
|
|
| expect(configToml).toBeDefined() |
| expect(configToml).toContain('model = "gpt-5.5"') |
| expect(configToml).toContain('review_model = "gpt-5.5"') |
| expect(configToml).not.toContain('model = "gpt-5.4"') |
| expect(configToml).not.toContain('model_context_window') |
| expect(configToml).not.toContain('model_auto_compact_token_limit') |
| expect(configToml).toContain('[features]\nresponses_websockets_v2 = true\ngoals = true') |
| }) |
|
|
| it('renders GPT-5.4 mini entry in OpenCode config', async () => { |
| const wrapper = mount(UseKeyModal, { |
| props: { |
| show: true, |
| apiKey: 'sk-test', |
| baseUrl: 'https://example.com/v1', |
| platform: 'openai' |
| }, |
| global: { |
| stubs: { |
| BaseDialog: { |
| template: '<div><slot /><slot name="footer" /></div>' |
| }, |
| Icon: { |
| template: '<span />' |
| } |
| } |
| } |
| }) |
|
|
| const opencodeTab = wrapper.findAll('button').find((button) => |
| button.text().includes('keys.useKeyModal.cliTabs.opencode') |
| ) |
|
|
| expect(opencodeTab).toBeDefined() |
| await opencodeTab!.trigger('click') |
| await nextTick() |
|
|
| const codeBlock = wrapper.find('pre code') |
| expect(codeBlock.exists()).toBe(true) |
| expect(codeBlock.text()).toContain('"name": "GPT-5.4 Mini"') |
| expect(codeBlock.text()).not.toContain('"name": "GPT-5.4 Nano"') |
| }) |
| }) |
|
|