Skip to content

Commit a04b927

Browse files
committed
add unit tests for providerModels
Signed-off-by: hemantch01 <hemantchaudhary905@gmail.com>
1 parent bee2684 commit a04b927

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

src/components/AIConfigPopup.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,7 @@ const AIConfigPopup = ({ isOpen, onClose }: AIConfigPopupProps) => {
418418
// Clear the in-memory AI config in Zustand so stale keys don't persist
419419
const { setAIConfig } = useAppStore.getState();
420420
setAIConfig(null);
421+
setIsCustomModel(false);
421422
}
422423
};
423424

@@ -456,7 +457,11 @@ const AIConfigPopup = ({ isOpen, onClose }: AIConfigPopupProps) => {
456457
</label>
457458
<select
458459
value={provider}
459-
onChange={(e) => setProvider(e.target.value)}
460+
onChange={(e) => {
461+
setProvider(e.target.value);
462+
setModel('');
463+
setIsCustomModel(false);
464+
}}
460465
className={`w-full p-2 border rounded-lg focus:outline-none focus:ring-2 ${theme.select}`}
461466
>
462467
<option value="">Select a provider</option>
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { describe, it, expect } from 'vitest';
2+
import { PROVIDER_MODELS, getModelsForProvider } from '../../ai-assistant/providerModels';
3+
4+
describe('PROVIDER_MODELS', () => {
5+
const expectedProviders = ['openai', 'anthropic', 'google', 'mistral', 'openrouter', 'ollama'];
6+
7+
it.each(expectedProviders)('should have models for provider "%s"', (provider) => {
8+
expect(PROVIDER_MODELS[provider]).toBeDefined();
9+
expect(PROVIDER_MODELS[provider].length).toBeGreaterThan(0);
10+
});
11+
12+
it('should have non-empty label and value for every model entry', () => {
13+
for (const provider of Object.keys(PROVIDER_MODELS)) {
14+
for (const model of PROVIDER_MODELS[provider]) {
15+
expect(model.label).toBeTruthy();
16+
expect(model.value).toBeTruthy();
17+
}
18+
}
19+
});
20+
21+
it('should not have duplicate values within the same provider', () => {
22+
for (const provider of Object.keys(PROVIDER_MODELS)) {
23+
const values = PROVIDER_MODELS[provider].map(m => m.value);
24+
expect(new Set(values).size).toBe(values.length);
25+
}
26+
});
27+
});
28+
29+
describe('getModelsForProvider', () => {
30+
it('should return models for a known provider', () => {
31+
const models = getModelsForProvider('openai');
32+
expect(models.length).toBeGreaterThan(0);
33+
expect(models[0]).toHaveProperty('label');
34+
expect(models[0]).toHaveProperty('value');
35+
});
36+
37+
it('should return an empty array for an unknown provider', () => {
38+
expect(getModelsForProvider('unknown-provider')).toEqual([]);
39+
});
40+
41+
it('should return an empty array for an empty string', () => {
42+
expect(getModelsForProvider('')).toEqual([]);
43+
});
44+
45+
it('should return correct models for each provider', () => {
46+
expect(getModelsForProvider('openai').some(m => m.value === 'gpt-5.2')).toBe(true);
47+
expect(getModelsForProvider('anthropic').some(m => m.value === 'claude-opus-4.6')).toBe(true);
48+
expect(getModelsForProvider('google').some(m => m.value === 'gemini-2.5-pro')).toBe(true);
49+
expect(getModelsForProvider('mistral').some(m => m.value === 'mistral-large-latest')).toBe(true);
50+
expect(getModelsForProvider('openrouter').some(m => m.value === 'openai/gpt-5.2')).toBe(true);
51+
expect(getModelsForProvider('ollama').some(m => m.value === 'llama3')).toBe(true);
52+
});
53+
});

0 commit comments

Comments
 (0)