import MockAdapter from 'axios-mock-adapter';
import { api } from './auth';
import {
  createTorrent,
  getTorrents,
  getTorrentDetail,
  likeTorrent,
  addTorrentComment,
  searchTorrents
} from './torrent';

describe('种子资源API', () => {
  let mockAxios;

  beforeEach(() => {
    mockAxios = new MockAdapter(api);
    localStorage.setItem('token', 'test-token');
  });

  afterEach(() => {
    mockAxios.restore();
    localStorage.clear();
  });


  describe('getTorrents - 获取种子列表', () => {
    it('应该发送带分页参数的请求', async () => {
      const mockResponse = {
        code: 200,
        data: {
          list: [{ id: 1, name: '种子1' }, { id: 2, name: '种子2' }],
          total: 2
        }
      };

      mockAxios.onGet('/torrent', { params: { page: 2, size: 10 } })
        .reply(200, mockResponse);

      const response = await getTorrents(2, 10);
      expect(response.data).toEqual(mockResponse);
    });
  });

  describe('getTorrentDetail - 获取种子详情', () => {
    it('应该规范化返回的数据结构', async () => {
      const mockResponse = {
        code: 200,
        data: {
          torrent: { id: '123', name: '测试种子' },
          comments: [{ id: '1', content: '评论1' }]
        }
      };

      mockAxios.onGet('/torrent/123').reply(200, mockResponse);

      const response = await getTorrentDetail('123');
      expect(response.data.data.torrent.name).toBe('测试种子');
      expect(response.data.data.comments).toHaveLength(1);
    });

    it('应该处理没有评论的情况', async () => {
      const mockResponse = {
        code: 200,
        data: {
          torrent: { id: '123', name: '测试种子' },
          comments: null
        }
      };

      mockAxios.onGet('/torrent/123').reply(200, mockResponse);

      const response = await getTorrentDetail('123');
      expect(response.data.data.comments).toEqual([]);
    });
  });

  describe('likeTorrent - 点赞种子', () => {
    it('应该发送点赞请求', async () => {
      const mockResponse = { code: 200, message: '点赞成功' };
      mockAxios.onPost('/torrent/123/like').reply(200, mockResponse);

      const response = await likeTorrent('123');
      expect(response.data).toEqual(mockResponse);
    });
  });

  describe('addTorrentComment - 添加种子评论', () => {
    it('应该发送评论数据', async () => {
      const commentData = { content: '测试评论' };
      const mockResponse = { code: 200, message: '评论成功' };

      mockAxios.onPost('/torrent/123/comments', commentData)
        .reply(200, mockResponse);

      const response = await addTorrentComment('123', commentData);
      expect(response.data).toEqual(mockResponse);
    });
  });

  describe('searchTorrents - 搜索种子', () => {
    it('应该发送带搜索关键词和分页的请求', async () => {
      const mockResponse = {
        code: 200,
        data: {
          list: [{ id: 1, name: '匹配的种子' }],
          total: 1
        }
      };

      mockAxios.onGet('/torrent/search', { 
        params: { keyword: '测试', page: 1, size: 5 } 
      }).reply(200, mockResponse);

      const response = await searchTorrents('测试');
      expect(response.data).toEqual(mockResponse);
    });
  });
});