chore: linting and prettier
This commit is contained in:
@@ -182,7 +182,7 @@ describe('Config Manager Module', () => {
|
||||
|
||||
// Dynamically import the module under test AFTER mocking dependencies
|
||||
configManager = await import('../../scripts/modules/config-manager.js');
|
||||
|
||||
|
||||
// --- Default Mock Implementations ---
|
||||
mockFindProjectRoot.mockReturnValue(MOCK_PROJECT_ROOT); // Default for utils.findProjectRoot
|
||||
mockExistsSync.mockReturnValue(true); // Assume files exist by default
|
||||
@@ -256,7 +256,10 @@ describe('Config Manager Module', () => {
|
||||
configManager.validateProviderModelCombination('ollama', 'any-model')
|
||||
).toBe(false);
|
||||
expect(
|
||||
configManager.validateProviderModelCombination('openrouter', 'any/model')
|
||||
configManager.validateProviderModelCombination(
|
||||
'openrouter',
|
||||
'any/model'
|
||||
)
|
||||
).toBe(false);
|
||||
});
|
||||
|
||||
@@ -367,7 +370,8 @@ describe('Config Manager Module', () => {
|
||||
test('should merge defaults for partial config file', () => {
|
||||
// Arrange
|
||||
mockReadFileSync.mockImplementation((filePath) => {
|
||||
if (filePath === MOCK_CONFIG_PATH) return JSON.stringify(PARTIAL_CONFIG);
|
||||
if (filePath === MOCK_CONFIG_PATH)
|
||||
return JSON.stringify(PARTIAL_CONFIG);
|
||||
if (path.basename(filePath) === 'supported-models.json') {
|
||||
return JSON.stringify({
|
||||
openai: [{ id: 'gpt-4-turbo' }],
|
||||
@@ -391,7 +395,10 @@ describe('Config Manager Module', () => {
|
||||
// Assert: Construct expected merged config
|
||||
const expectedMergedConfig = {
|
||||
models: {
|
||||
main: { ...DEFAULT_CONFIG.models.main, ...PARTIAL_CONFIG.models.main },
|
||||
main: {
|
||||
...DEFAULT_CONFIG.models.main,
|
||||
...PARTIAL_CONFIG.models.main
|
||||
},
|
||||
research: { ...DEFAULT_CONFIG.models.research },
|
||||
fallback: { ...DEFAULT_CONFIG.models.fallback }
|
||||
},
|
||||
@@ -456,7 +463,9 @@ describe('Config Manager Module', () => {
|
||||
// Assert
|
||||
expect(config).toEqual(DEFAULT_CONFIG);
|
||||
expect(consoleErrorSpy).toHaveBeenCalledWith(
|
||||
expect.stringContaining(`Permission denied. Using default configuration.`)
|
||||
expect.stringContaining(
|
||||
`Permission denied. Using default configuration.`
|
||||
)
|
||||
);
|
||||
});
|
||||
|
||||
@@ -688,72 +697,182 @@ describe('Config Manager Module', () => {
|
||||
// Test cases: [providerName, envVarName, keyValue, expectedResult, testName]
|
||||
const testCases = [
|
||||
// Valid Keys
|
||||
['anthropic', 'ANTHROPIC_API_KEY', 'sk-valid-key', true, 'valid Anthropic key'],
|
||||
['openai', 'OPENAI_API_KEY', 'sk-another-valid-key', true, 'valid OpenAI key'],
|
||||
['perplexity', 'PERPLEXITY_API_KEY', 'pplx-valid', true, 'valid Perplexity key'],
|
||||
['google', 'GOOGLE_API_KEY', 'google-valid-key', true, 'valid Google key'],
|
||||
['mistral', 'MISTRAL_API_KEY', 'mistral-valid-key', true, 'valid Mistral key'],
|
||||
['openrouter', 'OPENROUTER_API_KEY', 'or-valid-key', true, 'valid OpenRouter key'],
|
||||
[
|
||||
'anthropic',
|
||||
'ANTHROPIC_API_KEY',
|
||||
'sk-valid-key',
|
||||
true,
|
||||
'valid Anthropic key'
|
||||
],
|
||||
[
|
||||
'openai',
|
||||
'OPENAI_API_KEY',
|
||||
'sk-another-valid-key',
|
||||
true,
|
||||
'valid OpenAI key'
|
||||
],
|
||||
[
|
||||
'perplexity',
|
||||
'PERPLEXITY_API_KEY',
|
||||
'pplx-valid',
|
||||
true,
|
||||
'valid Perplexity key'
|
||||
],
|
||||
[
|
||||
'google',
|
||||
'GOOGLE_API_KEY',
|
||||
'google-valid-key',
|
||||
true,
|
||||
'valid Google key'
|
||||
],
|
||||
[
|
||||
'mistral',
|
||||
'MISTRAL_API_KEY',
|
||||
'mistral-valid-key',
|
||||
true,
|
||||
'valid Mistral key'
|
||||
],
|
||||
[
|
||||
'openrouter',
|
||||
'OPENROUTER_API_KEY',
|
||||
'or-valid-key',
|
||||
true,
|
||||
'valid OpenRouter key'
|
||||
],
|
||||
['xai', 'XAI_API_KEY', 'xai-valid-key', true, 'valid XAI key'],
|
||||
['azure', 'AZURE_OPENAI_API_KEY', 'azure-valid-key', true, 'valid Azure key'],
|
||||
[
|
||||
'azure',
|
||||
'AZURE_OPENAI_API_KEY',
|
||||
'azure-valid-key',
|
||||
true,
|
||||
'valid Azure key'
|
||||
],
|
||||
|
||||
// Ollama (special case - no key needed)
|
||||
['ollama', 'OLLAMA_API_KEY', undefined, true, 'Ollama provider (no key needed)'], // OLLAMA_API_KEY might not be in keyMap
|
||||
[
|
||||
'ollama',
|
||||
'OLLAMA_API_KEY',
|
||||
undefined,
|
||||
true,
|
||||
'Ollama provider (no key needed)'
|
||||
], // OLLAMA_API_KEY might not be in keyMap
|
||||
|
||||
// Invalid / Missing Keys
|
||||
['anthropic', 'ANTHROPIC_API_KEY', undefined, false, 'missing Anthropic key'],
|
||||
[
|
||||
'anthropic',
|
||||
'ANTHROPIC_API_KEY',
|
||||
undefined,
|
||||
false,
|
||||
'missing Anthropic key'
|
||||
],
|
||||
['anthropic', 'ANTHROPIC_API_KEY', null, false, 'null Anthropic key'],
|
||||
['openai', 'OPENAI_API_KEY', '', false, 'empty OpenAI key'],
|
||||
['perplexity', 'PERPLEXITY_API_KEY', ' ', false, 'whitespace Perplexity key'],
|
||||
[
|
||||
'perplexity',
|
||||
'PERPLEXITY_API_KEY',
|
||||
' ',
|
||||
false,
|
||||
'whitespace Perplexity key'
|
||||
],
|
||||
|
||||
// Placeholder Keys
|
||||
['google', 'GOOGLE_API_KEY', 'YOUR_GOOGLE_API_KEY_HERE', false, 'placeholder Google key (YOUR_..._HERE)'],
|
||||
['mistral', 'MISTRAL_API_KEY', 'MISTRAL_KEY_HERE', false, 'placeholder Mistral key (..._KEY_HERE)'],
|
||||
['openrouter', 'OPENROUTER_API_KEY', 'ENTER_OPENROUTER_KEY_HERE', false, 'placeholder OpenRouter key (general ...KEY_HERE)'],
|
||||
[
|
||||
'google',
|
||||
'GOOGLE_API_KEY',
|
||||
'YOUR_GOOGLE_API_KEY_HERE',
|
||||
false,
|
||||
'placeholder Google key (YOUR_..._HERE)'
|
||||
],
|
||||
[
|
||||
'mistral',
|
||||
'MISTRAL_API_KEY',
|
||||
'MISTRAL_KEY_HERE',
|
||||
false,
|
||||
'placeholder Mistral key (..._KEY_HERE)'
|
||||
],
|
||||
[
|
||||
'openrouter',
|
||||
'OPENROUTER_API_KEY',
|
||||
'ENTER_OPENROUTER_KEY_HERE',
|
||||
false,
|
||||
'placeholder OpenRouter key (general ...KEY_HERE)'
|
||||
],
|
||||
|
||||
// Unknown provider
|
||||
['unknownprovider', 'UNKNOWN_KEY', 'any-key', false, 'unknown provider'],
|
||||
['unknownprovider', 'UNKNOWN_KEY', 'any-key', false, 'unknown provider']
|
||||
];
|
||||
|
||||
testCases.forEach(([providerName, envVarName, keyValue, expectedResult, testName]) => {
|
||||
test(`should return ${expectedResult} for ${testName} (CLI context)`, () => {
|
||||
// CLI context (resolveEnvVariable uses process.env or .env via projectRoot)
|
||||
mockResolveEnvVariable.mockImplementation((key) => {
|
||||
return key === envVarName ? keyValue : undefined;
|
||||
testCases.forEach(
|
||||
([providerName, envVarName, keyValue, expectedResult, testName]) => {
|
||||
test(`should return ${expectedResult} for ${testName} (CLI context)`, () => {
|
||||
// CLI context (resolveEnvVariable uses process.env or .env via projectRoot)
|
||||
mockResolveEnvVariable.mockImplementation((key) => {
|
||||
return key === envVarName ? keyValue : undefined;
|
||||
});
|
||||
expect(
|
||||
configManager.isApiKeySet(providerName, null, MOCK_PROJECT_ROOT)
|
||||
).toBe(expectedResult);
|
||||
if (providerName !== 'ollama' && providerName !== 'unknownprovider') {
|
||||
// Ollama and unknown don't try to resolve
|
||||
expect(mockResolveEnvVariable).toHaveBeenCalledWith(
|
||||
envVarName,
|
||||
null,
|
||||
MOCK_PROJECT_ROOT
|
||||
);
|
||||
}
|
||||
});
|
||||
expect(configManager.isApiKeySet(providerName, null, MOCK_PROJECT_ROOT)).toBe(expectedResult);
|
||||
if (providerName !== 'ollama' && providerName !== 'unknownprovider') { // Ollama and unknown don't try to resolve
|
||||
expect(mockResolveEnvVariable).toHaveBeenCalledWith(envVarName, null, MOCK_PROJECT_ROOT);
|
||||
}
|
||||
});
|
||||
|
||||
test(`should return ${expectedResult} for ${testName} (MCP context)`, () => {
|
||||
// MCP context (resolveEnvVariable uses session.env)
|
||||
const mcpSession = { env: { [envVarName]: keyValue } };
|
||||
mockResolveEnvVariable.mockImplementation((key, sessionArg) => {
|
||||
return sessionArg && sessionArg.env ? sessionArg.env[key] : undefined;
|
||||
test(`should return ${expectedResult} for ${testName} (MCP context)`, () => {
|
||||
// MCP context (resolveEnvVariable uses session.env)
|
||||
const mcpSession = { env: { [envVarName]: keyValue } };
|
||||
mockResolveEnvVariable.mockImplementation((key, sessionArg) => {
|
||||
return sessionArg && sessionArg.env
|
||||
? sessionArg.env[key]
|
||||
: undefined;
|
||||
});
|
||||
expect(
|
||||
configManager.isApiKeySet(providerName, mcpSession, null)
|
||||
).toBe(expectedResult);
|
||||
if (providerName !== 'ollama' && providerName !== 'unknownprovider') {
|
||||
expect(mockResolveEnvVariable).toHaveBeenCalledWith(
|
||||
envVarName,
|
||||
mcpSession,
|
||||
null
|
||||
);
|
||||
}
|
||||
});
|
||||
expect(configManager.isApiKeySet(providerName, mcpSession, null)).toBe(expectedResult);
|
||||
if (providerName !== 'ollama' && providerName !== 'unknownprovider') {
|
||||
expect(mockResolveEnvVariable).toHaveBeenCalledWith(envVarName, mcpSession, null);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
test('isApiKeySet should log a warning for an unknown provider', () => {
|
||||
mockLog.mockClear(); // Clear previous log calls
|
||||
configManager.isApiKeySet('nonexistentprovider');
|
||||
expect(mockLog).toHaveBeenCalledWith('warn', expect.stringContaining('Unknown provider name: nonexistentprovider'));
|
||||
expect(mockLog).toHaveBeenCalledWith(
|
||||
'warn',
|
||||
expect.stringContaining('Unknown provider name: nonexistentprovider')
|
||||
);
|
||||
});
|
||||
|
||||
test('isApiKeySet should handle provider names case-insensitively for keyMap lookup', () => {
|
||||
mockResolveEnvVariable.mockReturnValue('a-valid-key');
|
||||
expect(configManager.isApiKeySet('Anthropic', null, MOCK_PROJECT_ROOT)).toBe(true);
|
||||
expect(mockResolveEnvVariable).toHaveBeenCalledWith('ANTHROPIC_API_KEY', null, MOCK_PROJECT_ROOT);
|
||||
expect(
|
||||
configManager.isApiKeySet('Anthropic', null, MOCK_PROJECT_ROOT)
|
||||
).toBe(true);
|
||||
expect(mockResolveEnvVariable).toHaveBeenCalledWith(
|
||||
'ANTHROPIC_API_KEY',
|
||||
null,
|
||||
MOCK_PROJECT_ROOT
|
||||
);
|
||||
|
||||
mockResolveEnvVariable.mockReturnValue('another-valid-key');
|
||||
expect(configManager.isApiKeySet('OPENAI', null, MOCK_PROJECT_ROOT)).toBe(true);
|
||||
expect(mockResolveEnvVariable).toHaveBeenCalledWith('OPENAI_API_KEY', null, MOCK_PROJECT_ROOT);
|
||||
expect(configManager.isApiKeySet('OPENAI', null, MOCK_PROJECT_ROOT)).toBe(
|
||||
true
|
||||
);
|
||||
expect(mockResolveEnvVariable).toHaveBeenCalledWith(
|
||||
'OPENAI_API_KEY',
|
||||
null,
|
||||
MOCK_PROJECT_ROOT
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user