Skip to content

Commit 990d2ae

Browse files
test: add coverage for provider registry (#43)
1 parent bd8f4ef commit 990d2ae

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

tests/lib/provider.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { describe, expect, it, vi } from 'vitest'
2+
3+
vi.mock('$lib/providers/registry', () => ({
4+
getDefaultProvider: vi.fn(() => 'openai'),
5+
}))
6+
7+
describe('provider module', () => {
8+
it('exports the default provider when registry succeeds', async () => {
9+
const mod = await import('$lib/provider')
10+
expect(mod.DEFAULT_PROVIDER).toBe('openai')
11+
})
12+
13+
it('sets null when registry throws', async () => {
14+
vi.resetModules()
15+
vi.doMock('$lib/providers/registry', () => ({
16+
getDefaultProvider: vi.fn(() => {
17+
throw new Error('no providers')
18+
}),
19+
}))
20+
21+
const mod = await import('$lib/provider')
22+
expect(mod.DEFAULT_PROVIDER).toBeNull()
23+
})
24+
})
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { beforeEach, describe, expect, it, vi } from 'vitest'
2+
3+
vi.mock('$lib/config', () => ({ settings: {} }))
4+
5+
// Helper to reload the module with fresh state
6+
async function loadRegistry() {
7+
const mod = await import('$lib/providers/registry')
8+
return mod
9+
}
10+
11+
describe('provider registry', () => {
12+
beforeEach(() => {
13+
vi.resetModules()
14+
})
15+
16+
it('returns only providers with configured settings', async () => {
17+
const { settings } = await import('$lib/config')
18+
settings.OPENAI_API_KEY = 'key'
19+
settings.GROK_API_KEY = 'grok'
20+
settings.KHOJ_API_URL = ''
21+
settings.ANTHROPIC_API_KEY = ''
22+
23+
const { getAvailableProviders } = await loadRegistry()
24+
const providers = getAvailableProviders()
25+
26+
expect(providers.map((p) => p.id)).toEqual(['openai', 'grok'])
27+
expect(providers.every((p) => p.isAvailable)).toBe(true)
28+
})
29+
30+
it('prefers khoj as default when available', async () => {
31+
const { settings } = await import('$lib/config')
32+
settings.KHOJ_API_URL = 'http://khoj.test'
33+
settings.OPENAI_API_KEY = 'key'
34+
35+
const { getDefaultProvider } = await loadRegistry()
36+
expect(getDefaultProvider()).toBe('khoj')
37+
})
38+
39+
it('throws when no providers are configured', async () => {
40+
const { settings } = await import('$lib/config')
41+
Object.keys(settings).forEach((k) => delete (settings as any)[k])
42+
43+
const { getDefaultProvider } = await loadRegistry()
44+
expect(() => getDefaultProvider()).toThrow(
45+
'No AI providers are configured. Please set at least one provider in settings.'
46+
)
47+
})
48+
49+
it('detects multiple providers', async () => {
50+
const { settings } = await import('$lib/config')
51+
settings.OPENAI_API_KEY = 'key'
52+
settings.ANTHROPIC_API_KEY = 'a'
53+
54+
const { hasMultipleProviders } = await loadRegistry()
55+
expect(hasMultipleProviders()).toBe(true)
56+
})
57+
})

0 commit comments

Comments
 (0)