UserManagement.test.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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 { UserManagement } from '../../src/components/UserManagement';
  5. // Mock API client
  6. vi.mock('../../src/api/userClient', () => ({
  7. userClient: {
  8. $get: vi.fn(),
  9. $post: vi.fn(),
  10. ':id': {
  11. $put: vi.fn(),
  12. $delete: vi.fn(),
  13. },
  14. },
  15. }));
  16. // Mock toast
  17. vi.mock('sonner', () => ({
  18. toast: {
  19. success: vi.fn(),
  20. error: vi.fn(),
  21. },
  22. }));
  23. const createTestQueryClient = () =>
  24. new QueryClient({
  25. defaultOptions: {
  26. queries: {
  27. retry: false,
  28. },
  29. },
  30. });
  31. const renderWithProviders = (component: React.ReactElement) => {
  32. const queryClient = createTestQueryClient();
  33. return render(
  34. <QueryClientProvider client={queryClient}>
  35. {component}
  36. </QueryClientProvider>
  37. );
  38. };
  39. describe('UserManagement', () => {
  40. beforeEach(() => {
  41. vi.clearAllMocks();
  42. });
  43. it('should render user management page', () => {
  44. renderWithProviders(<UserManagement />);
  45. expect(screen.getByText('用户管理')).toBeInTheDocument();
  46. expect(screen.getByText('创建用户')).toBeInTheDocument();
  47. });
  48. it('should display user list when data is loaded', async () => {
  49. const mockUsers = {
  50. data: [
  51. {
  52. id: 1,
  53. username: 'testuser',
  54. nickname: 'Test User',
  55. email: 'test@example.com',
  56. phone: '1234567890',
  57. name: 'Test Name',
  58. isDisabled: 0,
  59. createdAt: '2024-01-01T00:00:00Z',
  60. roles: [{ id: 1, name: 'admin' }],
  61. avatarFile: null,
  62. },
  63. ],
  64. pagination: {
  65. total: 1,
  66. page: 1,
  67. pageSize: 10,
  68. },
  69. };
  70. const { userClient } = await import('../../src/api/userClient');
  71. (userClient.$get as any).mockResolvedValue({
  72. status: 200,
  73. json: async () => mockUsers,
  74. });
  75. renderWithProviders(<UserManagement />);
  76. await waitFor(() => {
  77. expect(screen.getByText('testuser')).toBeInTheDocument();
  78. expect(screen.getByText('Test User')).toBeInTheDocument();
  79. expect(screen.getByText('test@example.com')).toBeInTheDocument();
  80. });
  81. });
  82. it('should open create user modal when create button is clicked', () => {
  83. renderWithProviders(<UserManagement />);
  84. const createButton = screen.getByText('创建用户');
  85. fireEvent.click(createButton);
  86. expect(screen.getByText('创建用户')).toBeInTheDocument();
  87. expect(screen.getByPlaceholderText('请输入用户名')).toBeInTheDocument();
  88. });
  89. it('should handle search functionality', async () => {
  90. const { userClient } = await import('../../src/api/userClient');
  91. (userClient.$get as any).mockResolvedValue({
  92. status: 200,
  93. json: async () => ({
  94. data: [],
  95. pagination: { total: 0, page: 1, pageSize: 10 },
  96. }),
  97. });
  98. renderWithProviders(<UserManagement />);
  99. const searchInput = screen.getByPlaceholderText('搜索用户名、昵称或邮箱...');
  100. fireEvent.change(searchInput, { target: { value: 'test' } });
  101. await waitFor(() => {
  102. expect(userClient.$get).toHaveBeenCalledWith({
  103. query: {
  104. page: 1,
  105. pageSize: 10,
  106. keyword: 'test',
  107. filters: undefined,
  108. },
  109. });
  110. });
  111. });
  112. it('should handle filter functionality', async () => {
  113. const { userClient } = await import('../../src/api/userClient');
  114. (userClient.$get as any).mockResolvedValue({
  115. status: 200,
  116. json: async () => ({
  117. data: [],
  118. pagination: { total: 0, page: 1, pageSize: 10 },
  119. }),
  120. });
  121. renderWithProviders(<UserManagement />);
  122. // Open filters
  123. const filterButton = screen.getByText('高级筛选');
  124. fireEvent.click(filterButton);
  125. // Select status filter
  126. const statusSelect = screen.getByText('选择状态');
  127. fireEvent.click(statusSelect);
  128. const enabledOption = screen.getByText('启用');
  129. fireEvent.click(enabledOption);
  130. await waitFor(() => {
  131. expect(userClient.$get).toHaveBeenCalledWith({
  132. query: {
  133. page: 1,
  134. pageSize: 10,
  135. keyword: '',
  136. filters: expect.any(String),
  137. },
  138. });
  139. });
  140. });
  141. });