个人中心全部,模糊乱序搜索,类型筛选

Change-Id: Id635654fccccaea80bfbf4d1480abd55f7d12046
diff --git a/src/components/Personal/Upload.test.jsx b/src/components/Personal/Upload.test.jsx
new file mode 100644
index 0000000..9c72182
--- /dev/null
+++ b/src/components/Personal/Upload.test.jsx
@@ -0,0 +1,206 @@
+// Upload.test.jsx

+import React from 'react';

+import { render, screen, waitFor, fireEvent } from '@testing-library/react';

+import { MemoryRouter, useNavigate, useLocation } from 'react-router-dom';

+import Upload from './Upload';

+import { getUserTorrents, deleteTorrent } from '../../api/personal';

+

+// Mock API 调用

+jest.mock('../../api/personal', () => ({

+  getUserTorrents: jest.fn(),

+  deleteTorrent: jest.fn()

+}));

+

+// Mock react-router-dom hooks

+jest.mock('react-router-dom', () => ({

+  ...jest.requireActual('react-router-dom'),

+  useNavigate: jest.fn(),

+  useLocation: jest.fn()

+}));

+

+// Mock window.confirm

+global.confirm = jest.fn(() => true);

+

+describe('Upload Component', () => {

+  const mockNavigate = jest.fn();

+  const mockLocation = {

+    pathname: '/personal/upload',

+    state: { dashboardTab: 'uploads' }

+  };

+

+  const mockTorrents = [

+    {

+      id: 1,

+      torrentName: 'Test Torrent 1',

+      formattedSize: '1.2 GB',

+      createTime: '2023-01-01T12:00:00Z',

+      downloadCount: 10

+    },

+    {

+      id: 2,

+      torrentName: 'Test Torrent 2',

+      formattedSize: '2.5 GB',

+      createTime: '2023-01-02T12:00:00Z',

+      downloadCount: 5

+    }

+  ];

+

+  beforeEach(() => {

+    useNavigate.mockReturnValue(mockNavigate);

+    useLocation.mockReturnValue(mockLocation);

+    jest.clearAllMocks();

+    getUserTorrents.mockResolvedValue({

+      records: mockTorrents,

+      total: 10

+    });

+    deleteTorrent.mockResolvedValue({ success: true });

+  });

+

+  it('应该正确加载并显示上传记录', async () => {

+    render(

+      <MemoryRouter>

+        <Upload />

+      </MemoryRouter>

+    );

+

+    // 初始加载状态

+    expect(screen.getByText('加载中...')).toBeInTheDocument();

+

+    // 等待数据加载完成

+    await waitFor(() => {

+      expect(screen.getByText('上传记录')).toBeInTheDocument();

+      expect(screen.getByText('Test Torrent 1')).toBeInTheDocument();

+      expect(screen.getByText('Test Torrent 2')).toBeInTheDocument();

+      expect(screen.getByText('1.2 GB')).toBeInTheDocument();

+      expect(screen.getByText('2.5 GB')).toBeInTheDocument();

+      expect(screen.getAllByText('删除')).toHaveLength(2);

+    });

+  });

+

+  it('应该处理删除操作', async () => {

+    render(

+      <MemoryRouter>

+        <Upload />

+      </MemoryRouter>

+    );

+

+    await waitFor(() => {

+      const deleteButtons = screen.getAllByText('删除');

+      fireEvent.click(deleteButtons[0]);

+    });

+

+    expect(global.confirm).toHaveBeenCalledWith('确定要删除这个种子吗?此操作不可撤销!');

+    await waitFor(() => {

+      expect(deleteTorrent).toHaveBeenCalledWith(1);

+      expect(getUserTorrents).toHaveBeenCalledTimes(2); // 初始加载 + 删除后刷新

+    });

+  });

+

+  it('应该处理分页变化', async () => {

+    render(

+      <MemoryRouter>

+        <Upload />

+      </MemoryRouter>

+    );

+

+    await waitFor(() => {

+      const nextPageButton = screen.getByText('下一页');

+      fireEvent.click(nextPageButton);

+    });

+

+    await waitFor(() => {

+      expect(getUserTorrents).toHaveBeenLastCalledWith(2, 5);

+    });

+  });

+

+  it('应该处理直接跳转页码', async () => {

+    render(

+      <MemoryRouter>

+        <Upload />

+      </MemoryRouter>

+    );

+

+    await waitFor(() => {

+      const pageInput = screen.getByRole('spinbutton');

+      fireEvent.change(pageInput, { target: { value: '2' } });

+      fireEvent.keyDown(pageInput, { key: 'Enter' });

+    });

+

+    await waitFor(() => {

+      expect(getUserTorrents).toHaveBeenLastCalledWith(2, 5);

+    }, { timeout: 1000 });

+  });

+

+  it('应该处理返回按钮点击', async () => {

+    render(

+      <MemoryRouter>

+        <Upload />

+      </MemoryRouter>

+    );

+

+    await waitFor(() => {

+      const backButton = screen.getByText((content) => 

+        content.includes('返回个人中心')

+      );

+      fireEvent.click(backButton);

+      

+      expect(mockNavigate).toHaveBeenCalledWith('/personal', {

+        state: {

+          fromSubpage: true,

+          dashboardTab: 'uploads'

+        },

+        replace: true

+      });

+    });

+  });

+

+  it('应该显示错误信息当API调用失败', async () => {

+    getUserTorrents.mockRejectedValue(new Error('获取上传记录失败'));

+

+    render(

+      <MemoryRouter>

+        <Upload />

+      </MemoryRouter>

+    );

+

+    await waitFor(() => {

+      expect(screen.getByText('错误: 获取上传记录失败')).toBeInTheDocument();

+    });

+  });

+

+

+  it('应该禁用分页按钮当在第一页或最后一页', async () => {

+    render(

+      <MemoryRouter>

+        <Upload />

+      </MemoryRouter>

+    );

+

+    await waitFor(() => {

+      const prevButton = screen.getByText('上一页');

+      const firstPageButton = screen.getByText('首页');

+      

+      expect(prevButton).toBeDisabled();

+      expect(firstPageButton).toBeDisabled();

+    });

+  });

+

+  it('应该显示正确的页码导航', async () => {

+    // 模拟有更多页的情况

+    getUserTorrents.mockResolvedValue({

+      records: mockTorrents,

+      total: 50

+    });

+

+    render(

+      <MemoryRouter>

+        <Upload />

+      </MemoryRouter>

+    );

+

+    await waitFor(() => {

+      expect(screen.getByText('...')).toBeInTheDocument();

+      expect(screen.getByText('共 10 页')).toBeInTheDocument();

+    });

+  });

+});
\ No newline at end of file