前段
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