“实现帖子与评论上传图片,删除评论,评论计数,管理员界面”
Change-Id: I33d5331e41de0411f2d6f1913f3a939db61f665d
diff --git a/src/components/Administer.test.jsx b/src/components/Administer.test.jsx
new file mode 100644
index 0000000..5a452fa
--- /dev/null
+++ b/src/components/Administer.test.jsx
@@ -0,0 +1,195 @@
+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();
+ });
+ });
+});
\ No newline at end of file