FileManagement.test.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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 { FileManagement } from '../../src/components/FileManagement';
  5. // 完整的mock响应对象
  6. const createMockResponse = (status: number, data?: any) => ({
  7. status,
  8. ok: status >= 200 && status < 300,
  9. body: null,
  10. bodyUsed: false,
  11. statusText: status === 200 ? 'OK' : status === 201 ? 'Created' : status === 204 ? 'No Content' : 'Error',
  12. headers: new Headers(),
  13. url: '',
  14. redirected: false,
  15. type: 'basic' as ResponseType,
  16. json: async () => data || {},
  17. text: async () => '',
  18. blob: async () => new Blob(),
  19. arrayBuffer: async () => new ArrayBuffer(0),
  20. formData: async () => new FormData(),
  21. clone: function() { return this; }
  22. });
  23. // Mock API客户端
  24. vi.mock('../../src/api/fileClient', () => {
  25. const mockFileClient = {
  26. index: {
  27. $get: vi.fn(() => Promise.resolve(createMockResponse(200, {
  28. data: [],
  29. pagination: { current: 1, pageSize: 10, total: 0 }
  30. }))),
  31. },
  32. ':id': {
  33. $put: vi.fn(() => Promise.resolve(createMockResponse(200, {}))),
  34. $delete: vi.fn(() => Promise.resolve(createMockResponse(204, {}))),
  35. },
  36. };
  37. const mockFileClientManager = {
  38. get: vi.fn(() => mockFileClient),
  39. };
  40. return {
  41. fileClientManager: mockFileClientManager,
  42. fileClient: mockFileClient,
  43. };
  44. });
  45. // Mock 文件上传组件
  46. vi.mock('../../src/components/MinioUploader', () => ({
  47. default: () => <div data-testid="minio-uploader">MinioUploader</div>,
  48. }));
  49. describe('FileManagement', () => {
  50. let queryClient: QueryClient;
  51. beforeEach(() => {
  52. queryClient = new QueryClient({
  53. defaultOptions: {
  54. queries: { retry: false },
  55. mutations: { retry: false },
  56. },
  57. });
  58. vi.clearAllMocks();
  59. });
  60. const renderWithQueryClient = (component: React.ReactElement) => {
  61. return render(
  62. <QueryClientProvider client={queryClient}>
  63. {component}
  64. </QueryClientProvider>
  65. );
  66. };
  67. it('应该渲染文件管理组件', () => {
  68. renderWithQueryClient(<FileManagement />);
  69. expect(screen.getByText('文件管理')).toBeInTheDocument();
  70. expect(screen.getByText('上传文件')).toBeInTheDocument();
  71. expect(screen.getByText('文件列表')).toBeInTheDocument();
  72. });
  73. it('应该显示搜索功能', () => {
  74. renderWithQueryClient(<FileManagement showSearch={true} />);
  75. expect(screen.getByPlaceholderText('搜索文件名称或类型')).toBeInTheDocument();
  76. expect(screen.getByText('搜索')).toBeInTheDocument();
  77. });
  78. it('应该隐藏搜索功能', () => {
  79. renderWithQueryClient(<FileManagement showSearch={false} />);
  80. expect(screen.queryByPlaceholderText('搜索文件名称或类型')).not.toBeInTheDocument();
  81. expect(screen.queryByText('搜索')).not.toBeInTheDocument();
  82. });
  83. it('应该隐藏上传按钮', () => {
  84. renderWithQueryClient(<FileManagement showUploadButton={false} />);
  85. expect(screen.queryByText('上传文件')).not.toBeInTheDocument();
  86. });
  87. it('应该打开上传对话框', async () => {
  88. renderWithQueryClient(<FileManagement />);
  89. const uploadButton = screen.getByTestId('upload-file-button');
  90. fireEvent.click(uploadButton);
  91. await waitFor(() => {
  92. expect(screen.getByTestId('upload-file-dialog')).toBeInTheDocument();
  93. expect(screen.getByRole('heading', { name: '上传文件' })).toBeInTheDocument();
  94. expect(screen.getByTestId('minio-uploader')).toBeInTheDocument();
  95. });
  96. });
  97. it('应该显示加载状态', async () => {
  98. // Mock API调用返回加载状态
  99. const { fileClient } = await import('../../src/api/fileClient');
  100. (fileClient.index.$get as any).mockReturnValue(new Promise(() => {}));
  101. renderWithQueryClient(<FileManagement />);
  102. expect(screen.getByRole('table')).toBeInTheDocument();
  103. });
  104. it('应该显示空状态', async () => {
  105. const { fileClient } = await import('../../src/api/fileClient');
  106. (fileClient.index.$get as any).mockResolvedValue(createMockResponse(200, {
  107. data: [],
  108. pagination: { current: 1, pageSize: 10, total: 0 }
  109. }));
  110. renderWithQueryClient(<FileManagement />);
  111. await waitFor(() => {
  112. expect(screen.getByText('暂无文件')).toBeInTheDocument();
  113. });
  114. });
  115. });