blob: 5a452fad358f7def7b8511f3786d7325cd18dbdb [file] [log] [blame]
import React from 'react';
import { render, screen, waitFor, fireEvent, act } from '@testing-library/react';
import { MemoryRouter } from 'react-router-dom';
import '@testing-library/jest-dom';
import axios from 'axios';
import Administer from './Administer';
// Mock axios
jest.mock('axios');
// Mock localStorage
const localStorageMock = {
getItem: jest.fn(),
setItem: jest.fn(),
removeItem: jest.fn(),
clear: jest.fn(),
};
global.localStorage = localStorageMock;
describe('Administer Component', () => {
beforeEach(() => {
localStorageMock.getItem.mockReturnValue('test-token');
jest.clearAllMocks();
});
const mockUsers = [
{
username: 'user1',
authority: 'USER',
registTime: '2023-01-01T00:00:00',
lastLogin: '2023-05-01T00:00:00',
upload: 1000,
download: 500,
shareRate: 2.0,
magicPoints: 100
},
{
username: 'admin1',
authority: 'ADMIN',
registTime: '2023-01-15T00:00:00',
lastLogin: '2023-05-10T00:00:00',
upload: 5000,
download: 1000,
shareRate: 5.0,
magicPoints: 500
}
];
const mockDiscounts = [
{
id: 1,
name: '五一活动',
discountType: 'FREE',
startTime: '2023-05-01T00:00:00',
endTime: '2023-05-07T23:59:59',
createTime: '2023-04-25T10:00:00',
status: '已过期'
},
{
id: 2,
name: '端午节活动',
discountType: 'HALF',
startTime: '2023-06-10T00:00:00',
endTime: '2023-06-15T23:59:59',
createTime: '2023-05-30T10:00:00',
status: '已过期'
}
];
const mockCurrentDiscount = {
id: 3,
name: '国庆活动',
discountType: 'DOUBLE',
startTime: '2023-10-01T00:00:00',
endTime: '2023-10-07T23:59:59',
createTime: '2023-09-25T10:00:00',
status: '进行中'
};
const renderAdminister = () => {
return render(
<MemoryRouter>
<Administer />
</MemoryRouter>
);
};
test('renders Administer component with user tab by default', async () => {
axios.get.mockResolvedValueOnce({
data: {
code: 200,
data: { data: mockUsers }
}
});
renderAdminister();
expect(screen.getByText('系统管理')).toBeInTheDocument();
expect(screen.getByText('用户管理')).toBeInTheDocument();
expect(screen.getByText('折扣管理')).toBeInTheDocument();
await waitFor(() => {
expect(screen.getByText('user1')).toBeInTheDocument();
});
expect(screen.getByText('admin1')).toBeInTheDocument();
});
test('switches between user and discount tabs', async () => {
axios.get
.mockResolvedValueOnce({
data: {
code: 200,
data: { data: mockUsers }
}
})
.mockResolvedValueOnce({
data: {
code: 200,
data: { data: mockDiscounts }
}
})
.mockResolvedValueOnce({
data: {
code: 200,
data: { data: mockCurrentDiscount }
}
});
renderAdminister();
await waitFor(() => {
expect(screen.getByText('user1')).toBeInTheDocument();
});
fireEvent.click(screen.getByText('折扣管理'));
await waitFor(() => {
expect(screen.getByText('五一活动')).toBeInTheDocument();
});
expect(screen.getByText('国庆活动')).toBeInTheDocument();
});
test('changes user authority', async () => {
axios.get.mockResolvedValueOnce({
data: {
code: 200,
data: { data: mockUsers }
}
});
axios.put.mockResolvedValueOnce({
data: {
code: 200,
message: '修改用户权限成功'
}
});
renderAdminister();
await waitFor(() => {
expect(screen.getByText('user1')).toBeInTheDocument();
});
const selectElement = screen.getAllByRole('combobox')[0];
fireEvent.change(selectElement, { target: { value: 'ADMIN' } });
await waitFor(() => {
expect(axios.put).toHaveBeenCalled();
});
expect(axios.put).toHaveBeenCalledWith(
expect.stringContaining('/user/changeAuthority'),
{
changeUsername: 'user1',
authority: 'ADMIN'
},
expect.any(Object)
);
});
test('shows error messages', async () => {
axios.get.mockRejectedValueOnce(new Error('Network Error'));
renderAdminister();
await waitFor(() => {
expect(screen.getByText(/获取用户列表失败/)).toBeInTheDocument();
});
});
});