78 lines
2.4 KiB
TypeScript
78 lines
2.4 KiB
TypeScript
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')
|
|
})
|
|
})
|