FileManagement.test.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 API客户端
  6. vi.mock('../../src/api/fileClient', () => ({
  7. fileClient: {
  8. $get: vi.fn(),
  9. ':id': {
  10. $put: vi.fn(),
  11. $delete: vi.fn(),
  12. },
  13. },
  14. }));
  15. // Mock 文件上传组件
  16. vi.mock('../../src/components/MinioUploader', () => ({
  17. default: () => <div data-testid="minio-uploader">MinioUploader</div>,
  18. }));
  19. describe('FileManagement', () => {
  20. let queryClient: QueryClient;
  21. beforeEach(() => {
  22. queryClient = new QueryClient({
  23. defaultOptions: {
  24. queries: { retry: false },
  25. mutations: { retry: false },
  26. },
  27. });
  28. vi.clearAllMocks();
  29. });
  30. const renderWithQueryClient = (component: React.ReactElement) => {
  31. return render(
  32. <QueryClientProvider client={queryClient}>
  33. {component}
  34. </QueryClientProvider>
  35. );
  36. };
  37. it('应该渲染文件管理组件', () => {
  38. renderWithQueryClient(<FileManagement />);
  39. expect(screen.getByText('文件管理')).toBeInTheDocument();
  40. expect(screen.getByText('上传文件')).toBeInTheDocument();
  41. expect(screen.getByText('文件列表')).toBeInTheDocument();
  42. });
  43. it('应该显示搜索功能', () => {
  44. renderWithQueryClient(<FileManagement showSearch={true} />);
  45. expect(screen.getByPlaceholderText('搜索文件名称或类型')).toBeInTheDocument();
  46. expect(screen.getByText('搜索')).toBeInTheDocument();
  47. });
  48. it('应该隐藏搜索功能', () => {
  49. renderWithQueryClient(<FileManagement showSearch={false} />);
  50. expect(screen.queryByPlaceholderText('搜索文件名称或类型')).not.toBeInTheDocument();
  51. expect(screen.queryByText('搜索')).not.toBeInTheDocument();
  52. });
  53. it('应该隐藏上传按钮', () => {
  54. renderWithQueryClient(<FileManagement showUploadButton={false} />);
  55. expect(screen.queryByText('上传文件')).not.toBeInTheDocument();
  56. });
  57. it('应该打开上传对话框', async () => {
  58. renderWithQueryClient(<FileManagement />);
  59. const uploadButton = screen.getByText('上传文件');
  60. fireEvent.click(uploadButton);
  61. await waitFor(() => {
  62. expect(screen.getByText('上传文件')).toBeInTheDocument();
  63. expect(screen.getByTestId('minio-uploader')).toBeInTheDocument();
  64. });
  65. });
  66. it('应该显示加载状态', () => {
  67. // Mock API调用返回加载状态
  68. const { fileClient } = require('../../src/api/fileClient');
  69. fileClient.$get.mockReturnValue(new Promise(() => {}));
  70. renderWithQueryClient(<FileManagement />);
  71. expect(screen.getByRole('table')).toBeInTheDocument();
  72. });
  73. it('应该显示空状态', async () => {
  74. const { fileClient } = require('../../src/api/fileClient');
  75. fileClient.$get.mockResolvedValue({
  76. ok: true,
  77. json: async () => ({
  78. data: [],
  79. pagination: { current: 1, pageSize: 10, total: 0 }
  80. })
  81. });
  82. renderWithQueryClient(<FileManagement />);
  83. await waitFor(() => {
  84. expect(screen.getByText('暂无文件')).toBeInTheDocument();
  85. });
  86. });
  87. });