156 lines
4.6 KiB
TypeScript
156 lines
4.6 KiB
TypeScript
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('网络超时')
|
|
})
|
|
})
|