22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 1 | import React from 'react'; |
DREW | 5b1883e | 2025-06-07 10:41:32 +0800 | [diff] [blame^] | 2 | import { render, screen, waitFor, fireEvent } from '@testing-library/react'; |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 3 | import { MemoryRouter } from 'react-router-dom'; |
| 4 | import '@testing-library/jest-dom'; |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 5 | import Administer from './Administer'; |
| 6 | |
DREW | 5b1883e | 2025-06-07 10:41:32 +0800 | [diff] [blame^] | 7 | // 导入要模拟的API函数 |
| 8 | import { |
| 9 | getAllUsers, |
| 10 | searchUsers, |
| 11 | getAllDiscounts, |
| 12 | getCurrentDiscount |
| 13 | } from '../api/administer'; |
| 14 | import { getAnnouncements } from '../api/announcement'; |
DREW | ae420b2 | 2025-06-02 14:07:20 +0800 | [diff] [blame] | 15 | |
DREW | 5b1883e | 2025-06-07 10:41:32 +0800 | [diff] [blame^] | 16 | // 模拟API模块 |
| 17 | jest.mock('../api/administer'); |
| 18 | jest.mock('../api/announcement'); |
| 19 | |
| 20 | describe('Administer Component', () => { |
| 21 | beforeEach(() => { |
| 22 | // 清除所有模拟的调用信息 |
| 23 | jest.clearAllMocks(); |
DREW | ae420b2 | 2025-06-02 14:07:20 +0800 | [diff] [blame] | 24 | localStorage.setItem('token', 'test-token'); |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 25 | }); |
| 26 | |
DREW | ae420b2 | 2025-06-02 14:07:20 +0800 | [diff] [blame] | 27 | test('renders user management tab by default', async () => { |
DREW | 5b1883e | 2025-06-07 10:41:32 +0800 | [diff] [blame^] | 28 | getAllUsers.mockResolvedValue([]); |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 29 | |
DREW | ae420b2 | 2025-06-02 14:07:20 +0800 | [diff] [blame] | 30 | render( |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 31 | <MemoryRouter> |
| 32 | <Administer /> |
| 33 | </MemoryRouter> |
| 34 | ); |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 35 | |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 36 | expect(screen.getByText('用户管理')).toBeInTheDocument(); |
| 37 | expect(screen.getByText('折扣管理')).toBeInTheDocument(); |
DREW | ae420b2 | 2025-06-02 14:07:20 +0800 | [diff] [blame] | 38 | expect(screen.getByText('公告管理')).toBeInTheDocument(); |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 39 | }); |
| 40 | |
DREW | ae420b2 | 2025-06-02 14:07:20 +0800 | [diff] [blame] | 41 | test('fetches and displays users', async () => { |
| 42 | const mockUsers = [ |
| 43 | { |
| 44 | username: 'testuser', |
| 45 | authority: 'USER', |
| 46 | registTime: '2023-01-01', |
| 47 | lastLogin: '2023-05-01', |
| 48 | upload: 1000, |
| 49 | download: 500, |
| 50 | shareRate: 2.0, |
| 51 | magicPoints: 100 |
| 52 | } |
| 53 | ]; |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 54 | |
DREW | 5b1883e | 2025-06-07 10:41:32 +0800 | [diff] [blame^] | 55 | getAllUsers.mockResolvedValue(mockUsers); |
DREW | ae420b2 | 2025-06-02 14:07:20 +0800 | [diff] [blame] | 56 | |
| 57 | render( |
| 58 | <MemoryRouter> |
| 59 | <Administer /> |
| 60 | </MemoryRouter> |
| 61 | ); |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 62 | |
| 63 | await waitFor(() => { |
DREW | ae420b2 | 2025-06-02 14:07:20 +0800 | [diff] [blame] | 64 | expect(screen.getByText('testuser')).toBeInTheDocument(); |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 65 | }); |
DREW | ae420b2 | 2025-06-02 14:07:20 +0800 | [diff] [blame] | 66 | }); |
| 67 | |
| 68 | test('handles user search', async () => { |
| 69 | const mockUsers = [ |
| 70 | { |
| 71 | username: 'searchuser', |
DREW | 5b1883e | 2025-06-07 10:41:32 +0800 | [diff] [blame^] | 72 | authority: 'USER', |
| 73 | registTime: '2023-01-01', |
| 74 | lastLogin: '2023-05-01', |
| 75 | upload: 1000, |
| 76 | download: 500, |
| 77 | shareRate: 2.0, |
| 78 | magicPoints: 100 |
DREW | ae420b2 | 2025-06-02 14:07:20 +0800 | [diff] [blame] | 79 | } |
| 80 | ]; |
| 81 | |
DREW | 5b1883e | 2025-06-07 10:41:32 +0800 | [diff] [blame^] | 82 | searchUsers.mockResolvedValue(mockUsers); |
DREW | ae420b2 | 2025-06-02 14:07:20 +0800 | [diff] [blame] | 83 | |
| 84 | render( |
| 85 | <MemoryRouter> |
| 86 | <Administer /> |
| 87 | </MemoryRouter> |
| 88 | ); |
| 89 | |
| 90 | fireEvent.change(screen.getByPlaceholderText('输入用户名搜索'), { |
| 91 | target: { value: 'search' } |
| 92 | }); |
| 93 | fireEvent.click(screen.getByText('搜索')); |
| 94 | |
| 95 | await waitFor(() => { |
| 96 | expect(screen.getByText('searchuser')).toBeInTheDocument(); |
| 97 | }); |
| 98 | }); |
| 99 | |
| 100 | test('switches between tabs', async () => { |
DREW | 5b1883e | 2025-06-07 10:41:32 +0800 | [diff] [blame^] | 101 | // 设置初始用户数据 |
| 102 | getAllUsers.mockResolvedValue([]); |
| 103 | // 设置折扣数据 |
| 104 | getAllDiscounts.mockResolvedValue([]); |
| 105 | getCurrentDiscount.mockResolvedValue(null); |
| 106 | // 设置公告数据 |
| 107 | getAnnouncements.mockResolvedValue([]); |
DREW | ae420b2 | 2025-06-02 14:07:20 +0800 | [diff] [blame] | 108 | |
| 109 | render( |
| 110 | <MemoryRouter> |
| 111 | <Administer /> |
| 112 | </MemoryRouter> |
| 113 | ); |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 114 | |
DREW | 5b1883e | 2025-06-07 10:41:32 +0800 | [diff] [blame^] | 115 | // 切换到折扣管理标签 |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 116 | fireEvent.click(screen.getByText('折扣管理')); |
| 117 | |
| 118 | await waitFor(() => { |
DREW | ae420b2 | 2025-06-02 14:07:20 +0800 | [diff] [blame] | 119 | expect(screen.getByText('添加新折扣')).toBeInTheDocument(); |
DREW | 5b1883e | 2025-06-07 10:41:32 +0800 | [diff] [blame^] | 120 | // 可以添加更多断言来验证折扣管理页面的内容 |
22301080 | a93bebb | 2025-05-27 19:48:11 +0800 | [diff] [blame] | 121 | }); |
| 122 | }); |
| 123 | }); |