test: add vitest config and unit tests
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
||||
import { ref } from 'vue'
|
||||
|
||||
const mockInfo = vi.fn()
|
||||
const mockSuccess = vi.fn()
|
||||
const mockError = vi.fn()
|
||||
const mockWarning = vi.fn()
|
||||
const mockConfirm = vi.fn()
|
||||
|
||||
vi.mock('element-plus', () => ({
|
||||
ElMessage: {
|
||||
success: mockSuccess,
|
||||
error: mockError,
|
||||
warning: mockWarning,
|
||||
info: mockInfo,
|
||||
},
|
||||
ElMessageBox: {
|
||||
confirm: (...args: any[]) => mockConfirm(...args),
|
||||
},
|
||||
}))
|
||||
|
||||
vi.mock('@/api/reportFragments', () => ({
|
||||
createFragments: vi.fn(),
|
||||
}))
|
||||
|
||||
import { createFragments } from '@/api/reportFragments'
|
||||
|
||||
describe('useStudyFragment composable logic', () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
mockConfirm.mockResolvedValue('confirm')
|
||||
})
|
||||
|
||||
it('openFragmentDialog resets content and shows dialog', () => {
|
||||
const fragmentContent = ref('old content')
|
||||
const fragmentsDialogVisible = ref(false)
|
||||
|
||||
fragmentContent.value = ''
|
||||
fragmentsDialogVisible.value = true
|
||||
|
||||
expect(fragmentContent.value).toBe('')
|
||||
expect(fragmentsDialogVisible.value).toBe(true)
|
||||
})
|
||||
|
||||
it('closeFragmentDialog hides dialog on confirm', async () => {
|
||||
const fragmentsDialogVisible = ref(true)
|
||||
|
||||
await mockConfirm('确定取消生成吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
}).then(() => {
|
||||
fragmentsDialogVisible.value = false
|
||||
mockInfo('已取消生成')
|
||||
})
|
||||
|
||||
expect(fragmentsDialogVisible.value).toBe(false)
|
||||
expect(mockInfo).toHaveBeenCalledWith('已取消生成')
|
||||
})
|
||||
|
||||
it('closeFragmentDialog keeps dialog open on cancel', async () => {
|
||||
const fragmentsDialogVisible = ref(true)
|
||||
mockConfirm.mockRejectedValue('cancel')
|
||||
|
||||
try {
|
||||
await mockConfirm('确定取消生成吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
}).then(() => {
|
||||
fragmentsDialogVisible.value = false
|
||||
})
|
||||
} catch {
|
||||
// User cancelled
|
||||
}
|
||||
|
||||
expect(fragmentsDialogVisible.value).toBe(true)
|
||||
})
|
||||
|
||||
it('confirmGenerateFragment warns if content is empty', async () => {
|
||||
const fragmentContent = ref(' ')
|
||||
|
||||
if (!fragmentContent.value.trim()) {
|
||||
mockWarning('请输入学习内容!')
|
||||
}
|
||||
|
||||
expect(mockWarning).toHaveBeenCalledWith('请输入学习内容!')
|
||||
expect(createFragments).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('confirmGenerateFragment calls API and shows success', async () => {
|
||||
vi.mocked(createFragments).mockResolvedValue({ code: 200 } as any)
|
||||
const fragmentContent = ref('学习了递归算法')
|
||||
const fragmentsDialogVisible = ref(true)
|
||||
|
||||
if (fragmentContent.value.trim()) {
|
||||
await mockConfirm('确定要生成学习残片吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'info',
|
||||
}).then(async () => {
|
||||
const res = await createFragments('S001', fragmentContent.value)
|
||||
if (res.code === 200) {
|
||||
mockSuccess('学习残片生成成功!')
|
||||
fragmentsDialogVisible.value = false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
expect(createFragments).toHaveBeenCalledWith('S001', '学习了递归算法')
|
||||
expect(mockSuccess).toHaveBeenCalledWith('学习残片生成成功!')
|
||||
expect(fragmentsDialogVisible.value).toBe(false)
|
||||
})
|
||||
|
||||
it('confirmGenerateFragment handles API failure', async () => {
|
||||
vi.mocked(createFragments).mockResolvedValue({ code: 500, message: '生成失败' } as any)
|
||||
const fragmentContent = ref('学习内容')
|
||||
|
||||
if (fragmentContent.value.trim()) {
|
||||
await mockConfirm('确定要生成学习残片吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'info',
|
||||
}).then(async () => {
|
||||
const res = await createFragments('S001', fragmentContent.value)
|
||||
if (res.code !== 200) {
|
||||
mockError(res.message || '生成学习残片失败')
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
expect(mockError).toHaveBeenCalledWith('生成失败')
|
||||
})
|
||||
|
||||
it('confirmGenerateFragment handles network error', async () => {
|
||||
vi.mocked(createFragments).mockRejectedValue(new Error('网络超时'))
|
||||
const fragmentContent = ref('学习内容')
|
||||
|
||||
if (fragmentContent.value.trim()) {
|
||||
await mockConfirm('确定要生成学习残片吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'info',
|
||||
}).then(async () => {
|
||||
try {
|
||||
await createFragments('S001', fragmentContent.value)
|
||||
} catch (error: any) {
|
||||
mockError(error.message || '请求失败')
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
expect(mockError).toHaveBeenCalledWith('网络超时')
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user