printTaskQuery.simple.test.tsx 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. import { describe, it, expect, vi, beforeEach } from 'vitest';
  2. import { render, screen, fireEvent, waitFor } from '@testing-library/react';
  3. import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
  4. import { PrintTaskQuery } from '../../src/components/PrintTaskQuery';
  5. import { createFeiePrinterClient } from '../../src/api/feiePrinterClient';
  6. import { PrintTaskStatus, CancelReason } from '../../src/types/feiePrinter';
  7. // Mock API client
  8. vi.mock('../../src/api/feiePrinterClient', () => {
  9. const mockClient = {
  10. getPrintTasks: vi.fn(),
  11. getPrintTask: vi.fn(),
  12. retryPrintTask: vi.fn(),
  13. cancelPrintTask: vi.fn(),
  14. setAuthToken: vi.fn(),
  15. setTenantId: vi.fn(),
  16. };
  17. return {
  18. createFeiePrinterClient: vi.fn(() => mockClient),
  19. };
  20. });
  21. // Mock toast
  22. vi.mock('sonner', () => ({
  23. toast: {
  24. success: vi.fn(() => {}),
  25. error: vi.fn(() => {}),
  26. info: vi.fn(() => {}),
  27. },
  28. }));
  29. // Mock date-fns format
  30. vi.mock('date-fns', () => ({
  31. format: vi.fn(() => '2024-01-01 10:00:00'),
  32. }));
  33. const createTestQueryClient = () =>
  34. new QueryClient({
  35. defaultOptions: {
  36. queries: {
  37. retry: false,
  38. },
  39. },
  40. });
  41. const renderWithProviders = (component: React.ReactElement) => {
  42. const queryClient = createTestQueryClient();
  43. return render(
  44. <QueryClientProvider client={queryClient}>
  45. {component as any}
  46. </QueryClientProvider>
  47. );
  48. };
  49. describe('打印任务查询组件简化集成测试', () => {
  50. let mockClient: any;
  51. beforeEach(() => {
  52. vi.clearAllMocks();
  53. mockClient = (createFeiePrinterClient as any)();
  54. });
  55. it('应该正确渲染组件并加载数据', async () => {
  56. const mockTasksData = {
  57. data: [
  58. {
  59. id: 1,
  60. taskId: 'TASK001',
  61. orderId: 1001,
  62. printerSn: 'SN001',
  63. content: '订单号: 1001\n商品: 商品A x 2\n合计: ¥100.00',
  64. printType: 'RECEIPT',
  65. printStatus: PrintTaskStatus.SUCCESS,
  66. errorMessage: null,
  67. retryCount: 0,
  68. maxRetries: 3,
  69. scheduledAt: '2024-01-01T10:00:00Z',
  70. printedAt: '2024-01-01T10:00:05Z',
  71. cancelledAt: null,
  72. cancelReason: null,
  73. createdAt: '2024-01-01T10:00:00Z',
  74. updatedAt: '2024-01-01T10:00:05Z',
  75. tenantId: 123,
  76. },
  77. ],
  78. pagination: {
  79. total: 1,
  80. page: 1,
  81. pageSize: 10,
  82. totalPages: 1,
  83. },
  84. };
  85. mockClient.getPrintTasks.mockResolvedValue(mockTasksData);
  86. renderWithProviders(
  87. <PrintTaskQuery
  88. baseURL="/api/v1/feie"
  89. tenantId={123}
  90. authToken="test-token"
  91. />
  92. );
  93. // 验证API调用
  94. await waitFor(() => {
  95. expect(mockClient.getPrintTasks).toHaveBeenCalledWith({
  96. page: 1,
  97. pageSize: 10,
  98. });
  99. });
  100. // 验证组件标题
  101. expect(screen.getByText('打印任务查询')).toBeInTheDocument();
  102. // 验证搜索框存在
  103. expect(screen.getByPlaceholderText('搜索订单ID或任务ID...')).toBeInTheDocument();
  104. // 验证刷新按钮存在
  105. expect(screen.getByText('刷新')).toBeInTheDocument();
  106. // 验证状态筛选器存在
  107. expect(screen.getAllByText('全部状态').length).toBeGreaterThan(0);
  108. });
  109. it('应该处理API错误', async () => {
  110. mockClient.getPrintTasks.mockRejectedValue(new Error('获取打印任务列表失败'));
  111. renderWithProviders(
  112. <PrintTaskQuery
  113. baseURL="/api/v1/feie"
  114. tenantId={123}
  115. authToken="test-token"
  116. />
  117. );
  118. // 应该显示错误UI
  119. await waitFor(() => {
  120. expect(screen.getByText('加载打印任务列表失败')).toBeInTheDocument();
  121. });
  122. // 验证重试按钮存在
  123. expect(screen.getByText('重试')).toBeInTheDocument();
  124. });
  125. it('应该支持多租户场景', async () => {
  126. const mockTasksData = {
  127. data: [],
  128. pagination: {
  129. total: 0,
  130. page: 1,
  131. pageSize: 10,
  132. totalPages: 0,
  133. },
  134. };
  135. mockClient.getPrintTasks.mockResolvedValue(mockTasksData);
  136. renderWithProviders(
  137. <PrintTaskQuery
  138. baseURL="/api/v1/feie"
  139. tenantId={456}
  140. authToken="test-token"
  141. />
  142. );
  143. await waitFor(() => {
  144. expect(mockClient.getPrintTasks).toHaveBeenCalled();
  145. });
  146. // 验证租户ID设置
  147. expect(mockClient.setTenantId).toHaveBeenCalledWith(456);
  148. expect(mockClient.setAuthToken).toHaveBeenCalledWith('test-token');
  149. });
  150. it('应该显示空状态', async () => {
  151. const mockTasksData = {
  152. data: [],
  153. pagination: {
  154. total: 0,
  155. page: 1,
  156. pageSize: 10,
  157. totalPages: 0,
  158. },
  159. };
  160. mockClient.getPrintTasks.mockResolvedValue(mockTasksData);
  161. renderWithProviders(
  162. <PrintTaskQuery
  163. baseURL="/api/v1/feie"
  164. tenantId={123}
  165. authToken="test-token"
  166. />
  167. );
  168. // 等待数据加载完成
  169. await waitFor(() => {
  170. expect(mockClient.getPrintTasks).toHaveBeenCalled();
  171. }, { timeout: 5000 });
  172. // 等待加载状态消失
  173. await waitFor(() => {
  174. const loadingElements = screen.queryAllByText('加载中...');
  175. expect(loadingElements.length).toBe(0);
  176. }, { timeout: 5000 });
  177. // 验证空状态显示 - 使用更灵活的选择器
  178. const emptyStateTexts = screen.getAllByText(/暂无打印任务|还没有打印任务记录/i);
  179. expect(emptyStateTexts.length).toBeGreaterThan(0);
  180. });
  181. });