| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- 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(
- <QueryClientProvider client={queryClient}>
- {component as any}
- </QueryClientProvider>
- );
- };
- 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(
- <PrintTaskQuery
- baseURL="/api/v1/feie"
- tenantId={123}
- authToken="test-token"
- />
- );
- // 验证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(
- <PrintTaskQuery
- baseURL="/api/v1/feie"
- tenantId={123}
- authToken="test-token"
- />
- );
- // 应该显示错误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(
- <PrintTaskQuery
- baseURL="/api/v1/feie"
- tenantId={456}
- authToken="test-token"
- />
- );
- 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(
- <PrintTaskQuery
- baseURL="/api/v1/feie"
- tenantId={123}
- authToken="test-token"
- />
- );
- // 等待数据加载完成
- 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);
- });
- });
|