import { describe, expect, it, vi } from 'vitest' import { defineComponent } from 'vue' import { mount } from '@vue/test-utils' const { updateAccountMock, checkMixedChannelRiskMock } = vi.hoisted(() => ({ updateAccountMock: vi.fn(), checkMixedChannelRiskMock: vi.fn() })) vi.mock('@/stores/app', () => ({ useAppStore: () => ({ showError: vi.fn(), showSuccess: vi.fn(), showInfo: vi.fn() }) })) vi.mock('@/stores/auth', () => ({ useAuthStore: () => ({ isSimpleMode: true }) })) vi.mock('@/api/admin', () => ({ adminAPI: { accounts: { update: updateAccountMock, checkMixedChannelRisk: checkMixedChannelRiskMock } } })) vi.mock('@/api/admin/accounts', () => ({ getAntigravityDefaultModelMapping: vi.fn() })) vi.mock('vue-i18n', async () => { const actual = await vi.importActual('vue-i18n') return { ...actual, useI18n: () => ({ t: (key: string) => key }) } }) import EditAccountModal from '../EditAccountModal.vue' const BaseDialogStub = defineComponent({ name: 'BaseDialog', props: { show: { type: Boolean, default: false } }, template: '
' }) const ModelWhitelistSelectorStub = defineComponent({ name: 'ModelWhitelistSelector', props: { modelValue: { type: Array, default: () => [] } }, emits: ['update:modelValue'], template: `
{{ Array.isArray(modelValue) ? modelValue.join(',') : '' }}
` }) function buildAccount() { return { id: 1, name: 'OpenAI Key', notes: '', platform: 'openai', type: 'apikey', credentials: { api_key: 'sk-test', base_url: 'https://api.openai.com', model_mapping: { 'gpt-5.2': 'gpt-5.2' } }, extra: {}, proxy_id: null, concurrency: 1, priority: 1, rate_multiplier: 1, status: 'active', group_ids: [], expires_at: null, auto_pause_on_expired: false } as any } function mountModal(account = buildAccount()) { return mount(EditAccountModal, { props: { show: true, account, proxies: [], groups: [] }, global: { stubs: { BaseDialog: BaseDialogStub, Select: true, Icon: true, ProxySelector: true, GroupSelector: true, ModelWhitelistSelector: ModelWhitelistSelectorStub } } }) } describe('EditAccountModal', () => { it('reopening the same account rehydrates the OpenAI whitelist from props', async () => { const account = buildAccount() updateAccountMock.mockReset() checkMixedChannelRiskMock.mockReset() checkMixedChannelRiskMock.mockResolvedValue({ has_risk: false }) updateAccountMock.mockResolvedValue(account) const wrapper = mountModal(account) expect(wrapper.get('[data-testid="model-whitelist-value"]').text()).toBe('gpt-5.2') await wrapper.get('[data-testid="rewrite-to-snapshot"]').trigger('click') expect(wrapper.get('[data-testid="model-whitelist-value"]').text()).toBe('gpt-5.2-2025-12-11') await wrapper.setProps({ show: false }) await wrapper.setProps({ show: true }) expect(wrapper.get('[data-testid="model-whitelist-value"]').text()).toBe('gpt-5.2') await wrapper.get('form#edit-account-form').trigger('submit.prevent') expect(updateAccountMock).toHaveBeenCalledTimes(1) expect(updateAccountMock.mock.calls[0]?.[1]?.credentials?.model_mapping).toEqual({ 'gpt-5.2': 'gpt-5.2' }) }) })