test: add vitest config and unit tests

This commit is contained in:
2026-05-27 23:28:41 +08:00
parent f35f73dca0
commit 13846a0b61
13 changed files with 1087 additions and 1 deletions
+155
View File
@@ -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('网络超时')
})
})