同步完整源码至远程:i18n 多语种 settings 文案 + AI 供应商设置与终端工作区进行中的修改(13 文件)
CI / Lint & TypeCheck (push) Canceled after 0s
CI / Test (push) Canceled after 0s
CI / Tauri Foundation Acceptance (push) Canceled after 0s
CI / Build (macos-latest) (push) Canceled after 0s
CI / Build (ubuntu-latest) (push) Canceled after 0s
CI / Build (windows-latest) (push) Canceled after 0s
CI / Lint & TypeCheck (push) Canceled after 0s
CI / Test (push) Canceled after 0s
CI / Tauri Foundation Acceptance (push) Canceled after 0s
CI / Build (macos-latest) (push) Canceled after 0s
CI / Build (ubuntu-latest) (push) Canceled after 0s
CI / Build (windows-latest) (push) Canceled after 0s
This commit is contained in:
1 parent
b43f1574a9
commit
fcd244637c
13 files changed
+350
-124
No files matched your search
@@ -1,5 +1,6 @@
|
||||
import { fireEvent, render, screen, waitFor } from '@testing-library/react'
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { createProviderFromPreset } from '../../src/ai/providerPresets'
|
||||
import AiProviderSettings from '../../src/components/settings/AiProviderSettings'
|
||||
import { useAiProviderStore } from '../../src/stores/aiProviderStore'
|
||||
import { mockDesktopApi } from '../setup'
|
||||
@@ -39,9 +40,13 @@ describe('AI provider settings', () => {
|
||||
expect(mockDesktopApi.aiProviderSaveKey).not.toHaveBeenCalled()
|
||||
expect(await screen.findByText(/可用/)).toBeVisible()
|
||||
expect(save).toBeEnabled()
|
||||
expect(screen.queryByRole('button', { name: '测试' })).not.toBeInTheDocument()
|
||||
|
||||
fireEvent.click(save)
|
||||
await waitFor(() => expect(useAiProviderStore.getState().providers).toHaveLength(1))
|
||||
await waitFor(() => expect(screen.queryByRole('button', { name: '保存' })).not.toBeInTheDocument())
|
||||
expect(screen.queryByRole('button', { name: '测试' })).not.toBeInTheDocument()
|
||||
expect(screen.queryByText(/可用/)).not.toBeInTheDocument()
|
||||
expect(mockDesktopApi.aiProviderSaveKey).toHaveBeenCalledWith(expect.any(String), 'sk-test-only')
|
||||
expect(JSON.stringify(vi.mocked(mockDesktopApi.settingsSet).mock.calls)).not.toContain('sk-test-only')
|
||||
})
|
||||
@@ -59,4 +64,65 @@ describe('AI provider settings', () => {
|
||||
expect(save).toBeDisabled()
|
||||
expect(screen.getByText('请重新测试')).toBeVisible()
|
||||
})
|
||||
|
||||
function loadSavedProvider() {
|
||||
const provider = { ...createProviderFromPreset('deepseek'), hasApiKey: true }
|
||||
useAiProviderStore.setState({ providers: [provider], activeProviderId: '' })
|
||||
return provider
|
||||
}
|
||||
|
||||
it('hides clean actions, saves name changes without testing, and offers a default action', async () => {
|
||||
loadSavedProvider()
|
||||
render(<AiProviderSettings />)
|
||||
expect(screen.queryByRole('button', { name: '测试' })).not.toBeInTheDocument()
|
||||
expect(screen.queryByRole('button', { name: '保存' })).not.toBeInTheDocument()
|
||||
expect(screen.getByRole('button', { name: '设为默认' })).toBeVisible()
|
||||
|
||||
fireEvent.change(screen.getByLabelText('名称'), { target: { value: 'Work' } })
|
||||
expect(screen.queryByRole('button', { name: '测试' })).not.toBeInTheDocument()
|
||||
expect(screen.queryByRole('button', { name: '设为默认' })).not.toBeInTheDocument()
|
||||
fireEvent.click(screen.getByRole('button', { name: '保存' }))
|
||||
await waitFor(() => expect(screen.queryByRole('button', { name: '保存' })).not.toBeInTheDocument())
|
||||
expect(useAiProviderStore.getState().providers[0].name).toBe('Work')
|
||||
expect(mockDesktopApi.aiTestProvider).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('requires validation for token edits and returns to clean state on revert or cancel', () => {
|
||||
const provider = loadSavedProvider()
|
||||
render(<AiProviderSettings />)
|
||||
fireEvent.change(screen.getByLabelText('API 密钥'), { target: { value: 'sk-new' } })
|
||||
expect(screen.getByRole('button', { name: '测试' })).toBeEnabled()
|
||||
expect(screen.getByRole('button', { name: '保存' })).toBeDisabled()
|
||||
fireEvent.change(screen.getByLabelText('API 密钥'), { target: { value: '' } })
|
||||
expect(screen.queryByRole('button', { name: '保存' })).not.toBeInTheDocument()
|
||||
|
||||
fireEvent.click(screen.getByRole('button', { name: '高级' }))
|
||||
fireEvent.change(screen.getByLabelText('接口地址'), { target: { value: 'https://proxy.example.com/v1' } })
|
||||
expect(screen.getByRole('button', { name: '保存' })).toBeDisabled()
|
||||
fireEvent.click(screen.getByRole('button', { name: '取消修改' }))
|
||||
expect(screen.queryByRole('button', { name: '保存' })).not.toBeInTheDocument()
|
||||
expect(useAiProviderStore.getState().providers[0]).toEqual(provider)
|
||||
})
|
||||
|
||||
it('keeps manual connection checks in advanced settings without requiring another save', async () => {
|
||||
loadSavedProvider()
|
||||
render(<AiProviderSettings />)
|
||||
fireEvent.click(screen.getByRole('button', { name: '高级' }))
|
||||
fireEvent.click(screen.getByRole('button', { name: '重新测试连接' }))
|
||||
expect(await screen.findByText(/可用/)).toBeVisible()
|
||||
expect(screen.queryByRole('button', { name: '保存' })).not.toBeInTheDocument()
|
||||
expect(mockDesktopApi.settingsSet).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('keeps edits available when saving fails', async () => {
|
||||
loadSavedProvider()
|
||||
vi.mocked(mockDesktopApi.settingsSet).mockRejectedValueOnce(new Error('Write failed'))
|
||||
render(<AiProviderSettings />)
|
||||
fireEvent.change(screen.getByLabelText('名称'), { target: { value: 'Unsaved name' } })
|
||||
fireEvent.click(screen.getByRole('button', { name: '保存' }))
|
||||
expect(await screen.findByRole('alert')).toHaveTextContent('Write failed')
|
||||
expect(screen.getByRole('button', { name: '保存' })).toBeEnabled()
|
||||
expect(screen.getByLabelText('名称')).toHaveValue('Unsaved name')
|
||||
expect(useAiProviderStore.getState().providers[0].name).toBe('DeepSeek')
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user