| jest.mock('axios'); |
| jest.mock('~/cache/getLogStores'); |
| jest.mock('~/utils/loadYaml'); |
|
|
| const axios = require('axios'); |
| const loadCustomConfig = require('./loadCustomConfig'); |
| const getLogStores = require('~/cache/getLogStores'); |
| const loadYaml = require('~/utils/loadYaml'); |
| const { logger } = require('~/config'); |
|
|
| describe('loadCustomConfig', () => { |
| const mockSet = jest.fn(); |
| const mockCache = { set: mockSet }; |
|
|
| beforeEach(() => { |
| jest.resetAllMocks(); |
| delete process.env.CONFIG_PATH; |
| getLogStores.mockReturnValue(mockCache); |
| }); |
|
|
| it('should return null and log error if remote config fetch fails', async () => { |
| process.env.CONFIG_PATH = 'http://example.com/config.yaml'; |
| axios.get.mockRejectedValue(new Error('Network error')); |
| const result = await loadCustomConfig(); |
| expect(logger.error).toHaveBeenCalledTimes(1); |
| expect(result).toBeNull(); |
| }); |
|
|
| it('should return null for an invalid local config file', async () => { |
| process.env.CONFIG_PATH = 'localConfig.yaml'; |
| loadYaml.mockReturnValueOnce(null); |
| const result = await loadCustomConfig(); |
| expect(result).toBeNull(); |
| }); |
|
|
| it('should parse, validate, and cache a valid local configuration', async () => { |
| const mockConfig = { |
| version: '1.0', |
| cache: true, |
| endpoints: { |
| custom: [ |
| { |
| name: 'mistral', |
| apiKey: 'user_provided', |
| baseURL: 'https://api.mistral.ai/v1', |
| }, |
| ], |
| }, |
| }; |
| process.env.CONFIG_PATH = 'validConfig.yaml'; |
| loadYaml.mockReturnValueOnce(mockConfig); |
| const result = await loadCustomConfig(); |
|
|
| expect(result).toEqual(mockConfig); |
| expect(mockSet).toHaveBeenCalledWith(expect.anything(), mockConfig); |
| }); |
|
|
| it('should return null and log if config schema validation fails', async () => { |
| const invalidConfig = { invalidField: true }; |
| process.env.CONFIG_PATH = 'invalidConfig.yaml'; |
| loadYaml.mockReturnValueOnce(invalidConfig); |
|
|
| const result = await loadCustomConfig(); |
|
|
| expect(result).toBeNull(); |
| }); |
|
|
| it('should handle and return null on YAML parse error for a string response from remote', async () => { |
| process.env.CONFIG_PATH = 'http://example.com/config.yaml'; |
| axios.get.mockResolvedValue({ data: 'invalidYAMLContent' }); |
|
|
| const result = await loadCustomConfig(); |
|
|
| expect(result).toBeNull(); |
| }); |
|
|
| it('should return the custom config object for a valid remote config file', async () => { |
| const mockConfig = { |
| version: '1.0', |
| cache: true, |
| endpoints: { |
| custom: [ |
| { |
| name: 'mistral', |
| apiKey: 'user_provided', |
| baseURL: 'https://api.mistral.ai/v1', |
| }, |
| ], |
| }, |
| }; |
| process.env.CONFIG_PATH = 'http://example.com/config.yaml'; |
| axios.get.mockResolvedValue({ data: mockConfig }); |
| const result = await loadCustomConfig(); |
| expect(result).toEqual(mockConfig); |
| expect(mockSet).toHaveBeenCalledWith(expect.anything(), mockConfig); |
| }); |
|
|
| it('should return null if the remote config file is not found', async () => { |
| process.env.CONFIG_PATH = 'http://example.com/config.yaml'; |
| axios.get.mockRejectedValue({ response: { status: 404 } }); |
| const result = await loadCustomConfig(); |
| expect(result).toBeNull(); |
| }); |
|
|
| it('should return null if the local config file is not found', async () => { |
| process.env.CONFIG_PATH = 'nonExistentConfig.yaml'; |
| loadYaml.mockReturnValueOnce(null); |
| const result = await loadCustomConfig(); |
| expect(result).toBeNull(); |
| }); |
|
|
| it('should not cache the config if cache is set to false', async () => { |
| const mockConfig = { |
| version: '1.0', |
| cache: false, |
| endpoints: { |
| custom: [ |
| { |
| name: 'mistral', |
| apiKey: 'user_provided', |
| baseURL: 'https://api.mistral.ai/v1', |
| }, |
| ], |
| }, |
| }; |
| process.env.CONFIG_PATH = 'validConfig.yaml'; |
| loadYaml.mockReturnValueOnce(mockConfig); |
| await loadCustomConfig(); |
| expect(mockSet).not.toHaveBeenCalled(); |
| }); |
|
|
| it('should log the loaded custom config', async () => { |
| const mockConfig = { |
| version: '1.0', |
| cache: true, |
| endpoints: { |
| custom: [ |
| { |
| name: 'mistral', |
| apiKey: 'user_provided', |
| baseURL: 'https://api.mistral.ai/v1', |
| }, |
| ], |
| }, |
| }; |
| process.env.CONFIG_PATH = 'validConfig.yaml'; |
| loadYaml.mockReturnValueOnce(mockConfig); |
| await loadCustomConfig(); |
| expect(logger.info).toHaveBeenCalledWith('Custom config file loaded:'); |
| expect(logger.info).toHaveBeenCalledWith(JSON.stringify(mockConfig, null, 2)); |
| expect(logger.debug).toHaveBeenCalledWith('Custom config:', mockConfig); |
| }); |
| }); |
|
|