import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { PrintTaskQuery } from '../../src/components/PrintTaskQuery';
import { createFeiePrinterClient } from '../../src/api/feiePrinterClient';
import { PrintTaskStatus, CancelReason } from '../../src/types/feiePrinter';
// Mock API client
vi.mock('../../src/api/feiePrinterClient', () => {
const mockClient = {
getPrintTasks: vi.fn(),
getPrintTask: vi.fn(),
retryPrintTask: vi.fn(),
cancelPrintTask: vi.fn(),
setAuthToken: vi.fn(),
setTenantId: vi.fn(),
};
return {
createFeiePrinterClient: vi.fn(() => mockClient),
};
});
// Mock toast
vi.mock('sonner', () => ({
toast: {
success: vi.fn(() => {}),
error: vi.fn(() => {}),
info: vi.fn(() => {}),
},
}));
// Mock date-fns format
vi.mock('date-fns', () => ({
format: vi.fn(() => '2024-01-01 10:00:00'),
}));
const createTestQueryClient = () =>
new QueryClient({
defaultOptions: {
queries: {
retry: false,
},
},
});
const renderWithProviders = (component: React.ReactElement) => {
const queryClient = createTestQueryClient();
return render(
{component as any}
);
};
describe('打印任务查询组件简化集成测试', () => {
let mockClient: any;
beforeEach(() => {
vi.clearAllMocks();
mockClient = (createFeiePrinterClient as any)();
});
it('应该正确渲染组件并加载数据', async () => {
const mockTasksData = {
data: [
{
id: 1,
taskId: 'TASK001',
orderId: 1001,
printerSn: 'SN001',
content: '订单号: 1001\n商品: 商品A x 2\n合计: ¥100.00',
printType: 'RECEIPT',
printStatus: PrintTaskStatus.SUCCESS,
errorMessage: null,
retryCount: 0,
maxRetries: 3,
scheduledAt: '2024-01-01T10:00:00Z',
printedAt: '2024-01-01T10:00:05Z',
cancelledAt: null,
cancelReason: null,
createdAt: '2024-01-01T10:00:00Z',
updatedAt: '2024-01-01T10:00:05Z',
tenantId: 123,
},
],
pagination: {
total: 1,
page: 1,
pageSize: 10,
totalPages: 1,
},
};
mockClient.getPrintTasks.mockResolvedValue(mockTasksData);
renderWithProviders(
);
// 验证API调用
await waitFor(() => {
expect(mockClient.getPrintTasks).toHaveBeenCalledWith({
page: 1,
pageSize: 10,
});
});
// 验证组件标题
expect(screen.getByText('打印任务查询')).toBeInTheDocument();
// 验证搜索框存在
expect(screen.getByPlaceholderText('搜索订单ID或任务ID...')).toBeInTheDocument();
// 验证刷新按钮存在
expect(screen.getByText('刷新')).toBeInTheDocument();
// 验证状态筛选器存在
expect(screen.getAllByText('全部状态').length).toBeGreaterThan(0);
});
it('应该处理API错误', async () => {
mockClient.getPrintTasks.mockRejectedValue(new Error('获取打印任务列表失败'));
renderWithProviders(
);
// 应该显示错误UI
await waitFor(() => {
expect(screen.getByText('加载打印任务列表失败')).toBeInTheDocument();
});
// 验证重试按钮存在
expect(screen.getByText('重试')).toBeInTheDocument();
});
it('应该支持多租户场景', async () => {
const mockTasksData = {
data: [],
pagination: {
total: 0,
page: 1,
pageSize: 10,
totalPages: 0,
},
};
mockClient.getPrintTasks.mockResolvedValue(mockTasksData);
renderWithProviders(
);
await waitFor(() => {
expect(mockClient.getPrintTasks).toHaveBeenCalled();
});
// 验证租户ID设置
expect(mockClient.setTenantId).toHaveBeenCalledWith(456);
expect(mockClient.setAuthToken).toHaveBeenCalledWith('test-token');
});
it('应该显示空状态', async () => {
const mockTasksData = {
data: [],
pagination: {
total: 0,
page: 1,
pageSize: 10,
totalPages: 0,
},
};
mockClient.getPrintTasks.mockResolvedValue(mockTasksData);
renderWithProviders(
);
// 等待数据加载完成
await waitFor(() => {
expect(mockClient.getPrintTasks).toHaveBeenCalled();
}, { timeout: 5000 });
// 等待加载状态消失
await waitFor(() => {
const loadingElements = screen.queryAllByText('加载中...');
expect(loadingElements.length).toBe(0);
}, { timeout: 5000 });
// 验证空状态显示 - 使用更灵活的选择器
const emptyStateTexts = screen.getAllByText(/暂无打印任务|还没有打印任务记录/i);
expect(emptyStateTexts.length).toBeGreaterThan(0);
});
});