import MockAdapter from 'axios-mock-adapter';
import { api, login, register, getUserInfo } from './auth';

describe('auth API', () => {
  let mockAxios;

  beforeEach(() => {
    // 确保使用我们导出的 api 实例
    mockAxios = new MockAdapter(api);
    localStorage.clear();
  });

  afterEach(() => {
    mockAxios.restore();
  });

  describe('login', () => {
    it('should send login request with username and password', async () => {
        const mockResponse = {
          code: 200,
          data: { 
            token: 'mock-token',
            // 确保响应结构与实际API一致
            userInfo: { username: 'testuser' }
          },
          message: '登录成功'
        };
        
        mockAxios.onPost('/user/login').reply(200, mockResponse);
    
        const response = await login('testuser', 'testpass');
        
        expect(response.data).toEqual(mockResponse);
        // 检查token是否存入localStorage
        expect(localStorage.getItem('token')).toBe('mock-token');
      });
    

    it('should handle login failure', async () => {
      mockAxios.onPost('/user/login').reply(401);
      
      await expect(login('wronguser', 'wrongpass')).rejects.toThrow();
    });
  });

  describe('register', () => {
    it('should send register request with username, password and code', async () => {
      const mockResponse = {
        code: 200,
        message: '注册成功'
      };
      
      mockAxios.onPost('/user/regist').reply(200, mockResponse);

      const response = await register('newuser', 'newpass', 'invite123');
      
      expect(response.data).toEqual(mockResponse);
    });

    it('should handle registration failure', async () => {
      mockAxios.onPost('/user/regist').reply(400);
      
      await expect(register('newuser', 'newpass', 'wrongcode')).rejects.toThrow();
    });
  });

  describe('getUserInfo', () => {
    it('should send request with token to get user info', async () => {
      const mockResponse = {
        code: 200,
        data: { username: 'testuser', role: 'user' }
      };
      
      mockAxios.onGet('/user/info').reply(200, mockResponse);

      const response = await getUserInfo('test-token');
      
      expect(response.data).toEqual(mockResponse);
    });

    it('should handle unauthorized request', async () => {
      mockAxios.onGet('/user/info').reply(401);
      
      await expect(getUserInfo('invalid-token')).rejects.toThrow();
    });
  });

  describe('request interceptor', () => {
    it('should add Authorization header when token exists', async () => {
      localStorage.setItem('token', 'test-token');
      const mockResponse = { data: 'success' };
      
      mockAxios.onGet('/test').reply((config) => {
        expect(config.headers.Authorization).toBe('Bearer test-token');
        return [200, mockResponse];
      });

      const response = await api.get('/test');
      expect(response.data).toEqual(mockResponse);
    });

    it('should not add Authorization header when token does not exist', async () => {
      const mockResponse = { data: 'success' };
      
      mockAxios.onGet('/test').reply((config) => {
        expect(config.headers.Authorization).toBeUndefined();
        return [200, mockResponse];
      });

      const response = await api.get('/test');
      expect(response.data).toEqual(mockResponse);
    });
  });
});