“实现帖子与评论上传图片,删除评论,评论计数,管理员界面”

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