mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-09-22 06:00:56 +02:00

* fix: bump mongoose to fix nested schema errors * fix: Enhance Axios instance creation with improved proxy handling and error logging * fix: Refactor Axios instance creation and remove proxy handling from file upload functions * fix: Update proxy configuration in Axios instance creation and add unit tests
126 lines
3.5 KiB
JavaScript
126 lines
3.5 KiB
JavaScript
const axios = require('axios');
|
|
const { createAxiosInstance } = require('./index');
|
|
|
|
// Mock 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.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,
|
|
});
|
|
});
|
|
});
|