前段

Change-Id: I718d4d07ea03c6d2b6bcbd4d426c5d1af2201bf4
diff --git a/src/components/TorrentDetail.test.jsx b/src/components/TorrentDetail.test.jsx
new file mode 100644
index 0000000..309942f
--- /dev/null
+++ b/src/components/TorrentDetail.test.jsx
@@ -0,0 +1,168 @@
+import React from 'react';

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

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

+import TorrentDetail from './TorrentDetail';

+import * as torrentApi from '../api/torrent';

+import * as torrentCommentApi from '../api/torrentComment';

+

+// Mock API 模块

+jest.mock('../api/torrent');

+jest.mock('../api/torrentComment');

+

+// Mock useLocation 钩子

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

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

+  useLocation: jest.fn(),

+}));

+

+describe('TorrentDetail 组件', () => {

+  const mockTorrent = {

+    id: '1',

+    torrentName: '测试种子',

+    category: '电影',

+    region: '美国',

+    resolution: '1080P',

+    subtitle: '中文字幕',

+    username: 'user1',

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

+    likeCount: 5,

+    replyCount: 3,

+    description: '这是一个测试种子描述',

+  };

+

+  const mockComments = [

+    {

+      id: 'c1',

+      content: '测试评论1',

+      authorId: 'user2',

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

+      likeCount: 2,

+      replies: [

+        {

+          id: 'c1r1',

+          content: '测试回复1',

+          authorId: 'user3',

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

+          likeCount: 1,

+        }

+      ]

+    }

+  ];

+

+  beforeEach(() => {

+    // 设置模拟的 API 响应

+    torrentApi.getTorrentDetail.mockResolvedValue({

+      data: {

+        code: 200,

+        data: {

+          torrent: mockTorrent,

+          comments: mockComments,

+        }

+      }

+    });

+

+    torrentApi.likeTorrent.mockResolvedValue({ data: { code: 200 } });

+    torrentApi.addTorrentComment.mockResolvedValue({ data: { code: 200 } });

+    torrentCommentApi.likeTorrentComment.mockResolvedValue({ data: { code: 200 } });

+    torrentCommentApi.addCommentReply.mockResolvedValue({ data: { code: 200 } });

+

+    // 模拟 useLocation

+    useLocation.mockReturnValue({

+      state: { fromTab: 'share' }

+    });

+

+    // 设置 localStorage

+    Storage.prototype.getItem = jest.fn((key) => {

+      if (key === 'username') return 'testuser';

+      return null;

+    });

+  });

+

+  afterEach(() => {

+    jest.clearAllMocks();

+  });

+

+  const renderComponent = () => {

+    return render(

+      <MemoryRouter initialEntries={['/torrent/1']}>

+        <Routes>

+          <Route path="/torrent/:id" element={<TorrentDetail />} />

+        </Routes>

+      </MemoryRouter>

+    );

+  };

+

+  it('应该正确加载和显示种子详情', async () => {

+    renderComponent();

+

+    // 检查加载状态

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

+

+    // 等待数据加载完成

+    await waitFor(() => {

+      expect(screen.getByText('测试种子')).toBeInTheDocument();

+      expect(screen.getByText('这是一个测试种子描述')).toBeInTheDocument();

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

+    });

+  });

+

+  it('应该能够点赞种子', async () => {

+    renderComponent();

+

+    await waitFor(() => {

+      expect(screen.getByText('测试种子')).toBeInTheDocument();

+    });

+

+    fireEvent.click(screen.getByText(/点赞 \(5\)/));

+

+    await waitFor(() => {

+      expect(torrentApi.likeTorrent).toHaveBeenCalledWith('1');

+    });

+  });

+

+  it('应该能够提交评论', async () => {

+    renderComponent();

+

+    await waitFor(() => {

+      expect(screen.getByText('测试种子')).toBeInTheDocument();

+    });

+

+    const commentInput = screen.getByPlaceholderText('写下你的评论...');

+    fireEvent.change(commentInput, { target: { value: '新评论' } });

+    fireEvent.click(screen.getByText('发表评论'));

+

+    await waitFor(() => {

+      expect(torrentApi.addTorrentComment).toHaveBeenCalledWith('1', {

+        content: '新评论',

+        authorId: 'testuser'

+      });

+    });

+  });

+

+  it('应该能够点赞评论', async () => {

+    renderComponent();

+

+    await waitFor(() => {

+      expect(screen.getByText('测试评论1')).toBeInTheDocument();

+    });

+

+    fireEvent.click(screen.getAllByText(/👍 \(2\)/)[0]);

+

+    await waitFor(() => {

+      expect(torrentCommentApi.likeTorrentComment).toHaveBeenCalledWith('c1');

+    });

+  });

+

+  it('应该能够返回资源区', async () => {

+    const { container } = renderComponent();

+

+    await waitFor(() => {

+      expect(screen.getByText('测试种子')).toBeInTheDocument();

+    });

+

+    const backButton = container.querySelector('.back-button');

+    fireEvent.click(backButton);

+

+    // 这里可以添加导航验证,但需要更复杂的路由设置

+  });

+});
\ No newline at end of file