import MockAdapter from 'axios-mock-adapter';
import { api } from './auth'; // 添加api导入
import { createHelpPost, getHelpPosts, getHelpPostDetail, likeHelpPost, addHelpPostComment,deleteHelpPost,searchHelpPosts } from './helpPost';

describe('求助帖API', () => {
  let mockAxios;

  beforeEach(() => {
    mockAxios = new MockAdapter(api);
  });

  afterEach(() => {
    mockAxios.restore();
  });

  describe('createHelpPost - 创建求助帖', () => {
    it('应该正确发送无图片帖子数据', async () => {
      const postData = {
        title: '测试标题',
        content: '测试内容',
        authorId: 'user123'
      };
      // 使用函数匹配器来验证FormData内容
      mockAxios.onPost('/help/posts').reply(config => {
        const data = config.data;
        expect(data.get('title')).toBe(postData.title);
        expect(data.get('content')).toBe(postData.content);
        expect(data.get('authorId')).toBe(postData.authorId);
        expect(data.has('image')).toBe(false);
        return [201, { code: 201 }];
      });

      const response = await createHelpPost(postData.title, postData.content, postData.authorId);
      expect(response.status).toBe(201);
    });
  });
  it('应该正确处理带图片的帖子', async () => {
    const postData = {
      title: '测试标题',
      content: '测试内容',
      authorId: 'user123',
      selectedImage: new File(['content'], 'test.jpg')
    };
    
    mockAxios.onPost('/help/posts').reply(config => {
      const data = config.data;
      expect(data.get('image')).toBeInstanceOf(File);
      return [201, { code: 201 }];
    });

    const response = await createHelpPost(
      postData.title, 
      postData.content, 
      postData.authorId, 
      postData.selectedImage
    );
    expect(response.status).toBe(201);
  });


  describe('getHelpPosts - 获取求助帖列表', () => {
    it('应该支持分页参数', async () => {
      const page = 2, size = 10;
      mockAxios.onGet('/help/posts', { params: { page, size } }).reply(200, {
        code: 200,
        data: []
      });

      const response = await getHelpPosts(page, size);
      expect(response.status).toBe(200);
    });
  });

  describe('likeHelpPost - 点赞求助帖', () => {
    it('应该正确发送点赞请求', async () => {
      mockAxios.onPost('/help/posts/post123/like').reply(200, { code: 200 });
      const response = await likeHelpPost('post123');
      expect(response.status).toBe(200);
    });
  });

  
  describe('deleteHelpPost - 删除帖子', () => {
    it('应该正确发送删除请求', async () => {
      const postId = 'post789';
      const authorId = 'user1';
      
      mockAxios.onDelete(`/help/posts/${postId}`).reply(config => {
        expect(config.params).toEqual({ authorId });
        return [200, { code: 200 }];
      });

      const response = await deleteHelpPost(postId, authorId);
      expect(response.status).toBe(200);
    });
  });
  describe('searchHelpPosts - 搜索求助帖', () => {
      it('应该正确发送搜索请求', async () => {
        const keyword = '测试';
        const page = 1, size = 5;
        
        mockAxios.onGet('/help/posts/search', {
          params: { keyword, page, size }
        }).reply(200, {
          code: 200,
          data: {
            records: [],
            total: 0
          }
        });
  
        const response = await searchHelpPosts(keyword, page, size);
        expect(response.status).toBe(200);
        expect(response.data.data).toBeDefined();
      });
    });
});