import React from 'react';
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import { message } from 'antd';
import TabContainer from '../components/dashboard/TabContainer';
import ProcessAPIService from '../services/ProcessAPIService';
import { getMergedParams } from '../utils/urlParams';
// Mock依赖
jest.mock('../services/ProcessAPIService');
jest.mock('../utils/urlParams');
jest.mock('antd', () => ({
message: {
success: jest.fn(),
error: jest.fn()
},
Spin: ({ children }) =>
{children}
,
Modal: ({ children, visible, onOk, onCancel, title, confirmLoading }) => (
visible ? (
{title}
{children}
) : null
)
}));
jest.mock('../contexts/CaseDataContext', () => ({
useCaseData: () => ({
caseData: {
mediation: {
state: 0, // 测试终止状态
id: 'test-mediation-id'
}
},
refreshData: jest.fn()
})
}));
describe('AI调解状态控制功能测试', () => {
beforeEach(() => {
jest.clearAllMocks();
getMergedParams.mockReturnValue({ caseId: 'test-case-id' });
});
test('应该显示终止按钮当caseState为0', () => {
render();
// 等待组件渲染完成
expect(screen.getByText('终止')).toBeInTheDocument();
});
test('应该显示恢复按钮当caseState为5', () => {
// 修改mock数据
jest.mock('../contexts/CaseDataContext', () => ({
useCaseData: () => ({
caseData: {
mediation: {
state: 5, // 恢复状态
id: 'test-mediation-id'
}
},
refreshData: jest.fn()
})
}));
render();
expect(screen.getByText('恢复')).toBeInTheDocument();
});
test('点击终止按钮应该显示确认对话框', () => {
render();
const terminateButton = screen.getByText('终止');
fireEvent.click(terminateButton);
expect(screen.getByTestId('modal')).toBeInTheDocument();
expect(screen.getByText('确认终止调解')).toBeInTheDocument();
});
test('确认终止应该调用API并显示成功消息', async () => {
ProcessAPIService.updateMediationState.mockResolvedValue({ code: 200 });
render();
// 点击终止按钮
const terminateButton = screen.getByText('终止');
fireEvent.click(terminateButton);
// 点击确认按钮
const confirmButton = screen.getByText('确定');
fireEvent.click(confirmButton);
// 验证API调用
await waitFor(() => {
expect(ProcessAPIService.updateMediationState).toHaveBeenCalledWith(
'test-case-id',
{
action: 0,
userName: '调解员'
}
);
});
// 验证成功消息
expect(message.success).toHaveBeenCalledWith('案件状态更新成功');
});
test('API调用失败应该显示错误消息', async () => {
ProcessAPIService.updateMediationState.mockRejectedValue(new Error('网络错误'));
render();
// 点击终止按钮
const terminateButton = screen.getByText('终止');
fireEvent.click(terminateButton);
// 点击确认按钮
const confirmButton = screen.getByText('确定');
fireEvent.click(confirmButton);
// 验证错误消息
await waitFor(() => {
expect(message.error).toHaveBeenCalledWith('网络错误');
});
});
test('不应该显示按钮当caseState为其他值', () => {
// 修改mock数据为不支持的状态
jest.mock('../contexts/CaseDataContext', () => ({
useCaseData: () => ({
caseData: {
mediation: {
state: 2, // 不支持的状态
id: 'test-mediation-id'
}
},
refreshData: jest.fn()
})
}));
render();
expect(screen.queryByText('终止')).not.toBeInTheDocument();
expect(screen.queryByText('恢复')).not.toBeInTheDocument();
});
});