blob: 5a452fad358f7def7b8511f3786d7325cd18dbdb [file] [log] [blame]
22301080a93bebb2025-05-27 19:48:11 +08001import React from 'react';
2import { render, screen, waitFor, fireEvent, act } from '@testing-library/react';
3import { MemoryRouter } from 'react-router-dom';
4import '@testing-library/jest-dom';
5import axios from 'axios';
6import Administer from './Administer';
7
8// Mock axios
9jest.mock('axios');
10
11// Mock localStorage
12const localStorageMock = {
13 getItem: jest.fn(),
14 setItem: jest.fn(),
15 removeItem: jest.fn(),
16 clear: jest.fn(),
17};
18global.localStorage = localStorageMock;
19
20describe('Administer Component', () => {
21 beforeEach(() => {
22 localStorageMock.getItem.mockReturnValue('test-token');
23 jest.clearAllMocks();
24 });
25
26 const mockUsers = [
27 {
28 username: 'user1',
29 authority: 'USER',
30 registTime: '2023-01-01T00:00:00',
31 lastLogin: '2023-05-01T00:00:00',
32 upload: 1000,
33 download: 500,
34 shareRate: 2.0,
35 magicPoints: 100
36 },
37 {
38 username: 'admin1',
39 authority: 'ADMIN',
40 registTime: '2023-01-15T00:00:00',
41 lastLogin: '2023-05-10T00:00:00',
42 upload: 5000,
43 download: 1000,
44 shareRate: 5.0,
45 magicPoints: 500
46 }
47 ];
48
49 const mockDiscounts = [
50 {
51 id: 1,
52 name: '五一活动',
53 discountType: 'FREE',
54 startTime: '2023-05-01T00:00:00',
55 endTime: '2023-05-07T23:59:59',
56 createTime: '2023-04-25T10:00:00',
57 status: '已过期'
58 },
59 {
60 id: 2,
61 name: '端午节活动',
62 discountType: 'HALF',
63 startTime: '2023-06-10T00:00:00',
64 endTime: '2023-06-15T23:59:59',
65 createTime: '2023-05-30T10:00:00',
66 status: '已过期'
67 }
68 ];
69
70 const mockCurrentDiscount = {
71 id: 3,
72 name: '国庆活动',
73 discountType: 'DOUBLE',
74 startTime: '2023-10-01T00:00:00',
75 endTime: '2023-10-07T23:59:59',
76 createTime: '2023-09-25T10:00:00',
77 status: '进行中'
78 };
79
80 const renderAdminister = () => {
81 return render(
82 <MemoryRouter>
83 <Administer />
84 </MemoryRouter>
85 );
86 };
87
88 test('renders Administer component with user tab by default', async () => {
89 axios.get.mockResolvedValueOnce({
90 data: {
91 code: 200,
92 data: { data: mockUsers }
93 }
94 });
95
96 renderAdminister();
97
98 expect(screen.getByText('系统管理')).toBeInTheDocument();
99 expect(screen.getByText('用户管理')).toBeInTheDocument();
100 expect(screen.getByText('折扣管理')).toBeInTheDocument();
101
102 await waitFor(() => {
103 expect(screen.getByText('user1')).toBeInTheDocument();
104 });
105
106 expect(screen.getByText('admin1')).toBeInTheDocument();
107 });
108
109 test('switches between user and discount tabs', async () => {
110 axios.get
111 .mockResolvedValueOnce({
112 data: {
113 code: 200,
114 data: { data: mockUsers }
115 }
116 })
117 .mockResolvedValueOnce({
118 data: {
119 code: 200,
120 data: { data: mockDiscounts }
121 }
122 })
123 .mockResolvedValueOnce({
124 data: {
125 code: 200,
126 data: { data: mockCurrentDiscount }
127 }
128 });
129
130 renderAdminister();
131
132 await waitFor(() => {
133 expect(screen.getByText('user1')).toBeInTheDocument();
134 });
135
136 fireEvent.click(screen.getByText('折扣管理'));
137
138 await waitFor(() => {
139 expect(screen.getByText('五一活动')).toBeInTheDocument();
140 });
141
142 expect(screen.getByText('国庆活动')).toBeInTheDocument();
143 });
144
145
146
147 test('changes user authority', async () => {
148 axios.get.mockResolvedValueOnce({
149 data: {
150 code: 200,
151 data: { data: mockUsers }
152 }
153 });
154 axios.put.mockResolvedValueOnce({
155 data: {
156 code: 200,
157 message: '修改用户权限成功'
158 }
159 });
160
161 renderAdminister();
162
163 await waitFor(() => {
164 expect(screen.getByText('user1')).toBeInTheDocument();
165 });
166
167 const selectElement = screen.getAllByRole('combobox')[0];
168 fireEvent.change(selectElement, { target: { value: 'ADMIN' } });
169
170 await waitFor(() => {
171 expect(axios.put).toHaveBeenCalled();
172 });
173
174 expect(axios.put).toHaveBeenCalledWith(
175 expect.stringContaining('/user/changeAuthority'),
176 {
177 changeUsername: 'user1',
178 authority: 'ADMIN'
179 },
180 expect.any(Object)
181 );
182 });
183
184
185
186 test('shows error messages', async () => {
187 axios.get.mockRejectedValueOnce(new Error('Network Error'));
188
189 renderAdminister();
190
191 await waitFor(() => {
192 expect(screen.getByText(/获取用户列表失败/)).toBeInTheDocument();
193 });
194 });
195});