File size: 3,694 Bytes
f0743f4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import axios from 'axios';
import { createAxiosInstance } from './axios';

jest.mock('axios', () => ({
  interceptors: {
    request: { use: jest.fn(), eject: jest.fn() },
    response: { use: jest.fn(), eject: jest.fn() },
  },
  create: jest.fn().mockReturnValue({
    defaults: {
      proxy: null,
    },
    get: jest.fn().mockResolvedValue({ data: {} }),
    post: jest.fn().mockResolvedValue({ data: {} }),
    put: jest.fn().mockResolvedValue({ data: {} }),
    delete: jest.fn().mockResolvedValue({ data: {} }),
  }),
  get: jest.fn().mockResolvedValue({ data: {} }),
  post: jest.fn().mockResolvedValue({ data: {} }),
  put: jest.fn().mockResolvedValue({ data: {} }),
  delete: jest.fn().mockResolvedValue({ data: {} }),
  reset: jest.fn().mockImplementation(function (this: {
    get: jest.Mock;
    post: jest.Mock;
    put: jest.Mock;
    delete: jest.Mock;
    create: jest.Mock;
  }) {
    this.get.mockClear();
    this.post.mockClear();
    this.put.mockClear();
    this.delete.mockClear();
    this.create.mockClear();
  }),
}));

describe('createAxiosInstance', () => {
  const originalEnv = process.env;

  beforeEach(() => {
    // Reset mocks
    jest.clearAllMocks();
    // Create a clean copy of process.env
    process.env = { ...originalEnv };
    // Default: no proxy
    delete process.env.proxy;
  });

  afterAll(() => {
    // Restore original process.env
    process.env = originalEnv;
  });

  test('creates an axios instance without proxy when no proxy env is set', () => {
    const instance = createAxiosInstance();

    expect(axios.create).toHaveBeenCalledTimes(1);
    expect(instance.defaults.proxy).toBeNull();
  });

  test('configures proxy correctly with hostname and protocol', () => {
    process.env.proxy = 'http://example.com';

    const instance = createAxiosInstance();

    expect(axios.create).toHaveBeenCalledTimes(1);
    expect(instance.defaults.proxy).toEqual({
      host: 'example.com',
      protocol: 'http',
    });
  });

  test('configures proxy correctly with hostname, protocol and port', () => {
    process.env.proxy = 'https://proxy.example.com:8080';

    const instance = createAxiosInstance();

    expect(axios.create).toHaveBeenCalledTimes(1);
    expect(instance.defaults.proxy).toEqual({
      host: 'proxy.example.com',
      protocol: 'https',
      port: 8080,
    });
  });

  test('handles proxy URLs with authentication', () => {
    process.env.proxy = 'http://user:pass@proxy.example.com:3128';

    const instance = createAxiosInstance();

    expect(axios.create).toHaveBeenCalledTimes(1);
    expect(instance.defaults.proxy).toEqual({
      host: 'proxy.example.com',
      protocol: 'http',
      port: 3128,
      // Note: The current implementation doesn't handle auth - if needed, add this functionality
    });
  });

  test('throws error when proxy URL is invalid', () => {
    process.env.proxy = 'invalid-url';

    expect(() => createAxiosInstance()).toThrow('Invalid proxy URL');
    expect(axios.create).toHaveBeenCalledTimes(1);
  });

  // If you want to test the actual URL parsing more thoroughly
  test('handles edge case proxy URLs correctly', () => {
    // IPv6 address
    process.env.proxy = 'http://[::1]:8080';

    let instance = createAxiosInstance();

    expect(instance.defaults.proxy).toEqual({
      host: '::1',
      protocol: 'http',
      port: 8080,
    });

    // URL with path (which should be ignored for proxy config)
    process.env.proxy = 'http://proxy.example.com:8080/some/path';

    instance = createAxiosInstance();

    expect(instance.defaults.proxy).toEqual({
      host: 'proxy.example.com',
      protocol: 'http',
      port: 8080,
    });
  });
});