feat: initial release v0.3.0
This commit is contained in:
77
tests/unit/worker/resolve-analysis-model.test.ts
Normal file
77
tests/unit/worker/resolve-analysis-model.test.ts
Normal file
@@ -0,0 +1,77 @@
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
|
||||
const prismaMock = vi.hoisted(() => ({
|
||||
userPreference: {
|
||||
findUnique: vi.fn(),
|
||||
},
|
||||
}))
|
||||
|
||||
vi.mock('@/lib/prisma', () => ({
|
||||
prisma: prismaMock,
|
||||
}))
|
||||
|
||||
import { resolveAnalysisModel } from '@/lib/workers/handlers/resolve-analysis-model'
|
||||
|
||||
describe('resolveAnalysisModel', () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
prismaMock.userPreference.findUnique.mockResolvedValue({
|
||||
analysisModel: 'openai-compatible:pref::gpt-4.1-mini',
|
||||
})
|
||||
})
|
||||
|
||||
it('uses inputModel override when provided', async () => {
|
||||
const result = await resolveAnalysisModel({
|
||||
userId: 'user-1',
|
||||
inputModel: 'openai-compatible:input::gpt-4.1',
|
||||
projectAnalysisModel: 'openai-compatible:project::gpt-4.1',
|
||||
})
|
||||
|
||||
expect(result).toBe('openai-compatible:input::gpt-4.1')
|
||||
expect(prismaMock.userPreference.findUnique).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('uses project analysisModel when inputModel is missing', async () => {
|
||||
const result = await resolveAnalysisModel({
|
||||
userId: 'user-1',
|
||||
projectAnalysisModel: 'openai-compatible:project::gpt-4.1',
|
||||
})
|
||||
|
||||
expect(result).toBe('openai-compatible:project::gpt-4.1')
|
||||
expect(prismaMock.userPreference.findUnique).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('falls back to user preference analysisModel when project is missing', async () => {
|
||||
const result = await resolveAnalysisModel({
|
||||
userId: 'user-1',
|
||||
projectAnalysisModel: null,
|
||||
})
|
||||
|
||||
expect(result).toBe('openai-compatible:pref::gpt-4.1-mini')
|
||||
expect(prismaMock.userPreference.findUnique).toHaveBeenCalledWith({
|
||||
where: { userId: 'user-1' },
|
||||
select: { analysisModel: true },
|
||||
})
|
||||
})
|
||||
|
||||
it('skips invalid input/project model keys and still falls back to user preference', async () => {
|
||||
const result = await resolveAnalysisModel({
|
||||
userId: 'user-1',
|
||||
inputModel: 'gpt-4.1',
|
||||
projectAnalysisModel: 'invalid-model-key',
|
||||
})
|
||||
|
||||
expect(result).toBe('openai-compatible:pref::gpt-4.1-mini')
|
||||
expect(prismaMock.userPreference.findUnique).toHaveBeenCalledTimes(1)
|
||||
})
|
||||
|
||||
it('throws explicit error when all levels are missing', async () => {
|
||||
prismaMock.userPreference.findUnique.mockResolvedValueOnce({ analysisModel: null })
|
||||
|
||||
await expect(resolveAnalysisModel({
|
||||
userId: 'user-1',
|
||||
inputModel: '',
|
||||
projectAnalysisModel: null,
|
||||
})).rejects.toThrow('ANALYSIS_MODEL_NOT_CONFIGURED')
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user