import MockAdapter from 'axios-mock-adapter';
import { api } from './auth'; // 添加api导入
import { likeHelpPostComment, getHelpCommentReplies, addHelpCommentReply, deleteHelpComment } from './helpComment';

describe('求助帖评论API', () => {
  let mockAxios;

  beforeEach(() => {
    mockAxios = new MockAdapter(api);
  });

  afterEach(() => {
    mockAxios.restore();
  });

  describe('likeHelpPostComment - 点赞求助帖评论', () => {
    it('应该成功发送点赞请求', async () => {
      const mockResponse = { code: 200, message: '点赞成功' };
      mockAxios.onPost('/help/comments/123/like').reply(200, mockResponse);

      const response = await likeHelpPostComment('123');
      expect(response.data).toEqual(mockResponse);
    });
  });

  describe('getHelpCommentReplies - 获取评论回复', () => {
    it('应该返回正确的回复数据结构', async () => {
      const mockData = [{ id: '1', content: '回复内容' }];
      mockAxios.onGet('/help/comments/456/replies').reply(200, { code: 200, data: mockData });

      const response = await getHelpCommentReplies('456');
      expect(response.data.data).toEqual(mockData);
    });
  });

  describe('addHelpCommentReply - 添加评论回复', () => {
    it('应该正确发送回复内容（无图片）', async () => {
      const commentId = '789';
      const replyData = {
        authorId: 'user1',
        content: '测试回复'
      };
      
      mockAxios.onPost(`/help/comments/${commentId}/replies`).reply(config => {
        const data = config.data;
        expect(data.get('authorId')).toBe(replyData.authorId);
        expect(data.get('content')).toBe(replyData.content);
        expect(data.has('image')).toBe(false);
        return [200, { code: 200 }];
      });

      const response = await addHelpCommentReply(commentId, replyData);
      expect(response.status).toBe(200);
    });
    it('应该正确处理带图片的回复', async () => {
      const commentId = '789';
      const replyData = {
        authorId: 'user1',
        content: '测试回复',
        image: new File(['content'], 'reply.jpg')
      };
      
      mockAxios.onPost(`/help/comments/${commentId}/replies`).reply(config => {
        const data = config.data;
        expect(data.get('image')).toBeInstanceOf(File);
        return [200, { code: 200 }];
      });

      const response = await addHelpCommentReply(commentId, replyData);
      expect(response.status).toBe(200);
    });
  });
  describe('deleteHelpComment - 删除评论', () => {
    it('应该正确发送删除请求', async () => {
      const commentId = '101112';
      const authorId = 'user1';
      
      mockAxios.onDelete(`/help/comments/${commentId}`).reply(config => {
        expect(config.params).toEqual({ authorId });
        return [200, { code: 200 }];
      });

      const response = await deleteHelpComment(commentId, authorId);
      expect(response.status).toBe(200);
    });
  });
});