review-copilot
Version:
ReviewCopilot - AI-powered code review assistant with customizable prompts
102 lines (101 loc) • 4.01 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const config_manager_1 = require("../config/config-manager");
const promises_1 = require("fs/promises");
jest.mock('fs/promises');
describe('ConfigManager', () => {
let configManager;
const mockConfig = {
providers: {
openai: {
enabled: true,
apiKey: 'test-key',
model: 'gpt-4o-mini',
baseURL: 'https://api.openai.com/v1',
reviewLanguage: 'zh',
},
},
triggers: [{ on: 'pull_request' }, { on: 'merge_request' }],
rules: {
commitMessage: {
enabled: true,
pattern: '^(feat|fix)',
prompt: 'Review commit message',
},
branchName: {
enabled: true,
pattern: '^(feature|bugfix)',
prompt: 'Review branch name',
},
codeChanges: {
enabled: true,
filePatterns: ['**/*.ts'],
prompt: 'Review code changes',
},
},
customReviewPoints: [
{
name: 'Security',
prompt: 'Check security',
},
],
};
beforeEach(async () => {
jest.resetAllMocks();
promises_1.readFile.mockResolvedValue(JSON.stringify(mockConfig));
// Reset the singleton instance before each test
config_manager_1.ConfigManager.instance = undefined;
configManager = await config_manager_1.ConfigManager.getInstance();
});
it('should be a singleton', async () => {
const instance1 = await config_manager_1.ConfigManager.getInstance();
const instance2 = await config_manager_1.ConfigManager.getInstance();
expect(instance1).toBe(instance2);
});
it('should load and validate config', async () => {
const config = configManager.getConfig();
expect(config).toBeDefined();
const openaiConfig = config.providers.openai;
expect(openaiConfig).toBeDefined();
expect(openaiConfig?.apiKey).toBe('test-key');
});
it('should replace environment variables', async () => {
process.env.TEST_API_KEY = 'env-key';
const configWithEnv = {
...mockConfig,
providers: {
...mockConfig.providers,
openai: {
...mockConfig.providers.openai,
apiKey: '${TEST_API_KEY}',
},
},
};
promises_1.readFile.mockResolvedValue(JSON.stringify(configWithEnv));
// Reset the singleton instance
config_manager_1.ConfigManager.instance = undefined;
const newConfigManager = await config_manager_1.ConfigManager.getInstance();
const config = newConfigManager.getConfig();
const openaiConfig = config.providers.openai;
expect(openaiConfig).toBeDefined();
expect(openaiConfig?.apiKey).toBe('env-key');
});
it('should throw error for invalid config', async () => {
const invalidConfig = {
...mockConfig,
providers: undefined, // Remove required providers field
};
promises_1.readFile.mockResolvedValue(JSON.stringify(invalidConfig));
// Reset the singleton instance and its internal state
config_manager_1.ConfigManager.instance = undefined;
const instance = new config_manager_1.ConfigManager();
instance.configPromise = null;
instance.config = null;
await expect(config_manager_1.ConfigManager.getInstance()).rejects.toThrow('Failed to load config');
});
it('should throw error when getting config before loading', async () => {
// Create a new instance without loading config
const newInstance = new config_manager_1.ConfigManager();
expect(() => newInstance.getConfig()).toThrow('Config not loaded');
});
});