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('网络超时') }) })