Files
tolaria/src/hooks/useAiAgentPreferences.test.ts
2026-04-29 11:16:52 +02:00

94 lines
2.8 KiB
TypeScript

import { renderHook, act } from '@testing-library/react'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { useAiAgentPreferences } from './useAiAgentPreferences'
const settings = {
auto_pull_interval_minutes: 5,
telemetry_consent: true,
crash_reporting_enabled: false,
analytics_enabled: false,
anonymous_id: null,
release_channel: 'stable',
default_ai_agent: 'claude_code' as const,
}
const aiAgentsStatus = {
claude_code: { status: 'installed' as const, version: '1.0.20' },
codex: { status: 'missing' as const, version: null },
opencode: { status: 'missing' as const, version: null },
pi: { status: 'missing' as const, version: null },
gemini: { status: 'missing' as const, version: null },
}
describe('useAiAgentPreferences', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('resolves the selected label and readiness', () => {
const { result } = renderHook(() => useAiAgentPreferences({
settings,
settingsLoaded: true,
saveSettings: vi.fn(),
aiAgentsStatus,
}))
expect(result.current.defaultAiAgent).toBe('claude_code')
expect(result.current.defaultAiAgentLabel).toBe('Claude Code')
expect(result.current.defaultAiAgentReadiness).toBe('ready')
expect(result.current.defaultAiAgentReady).toBe(true)
})
it('keeps the selected agent unavailable while settings are loading', () => {
const { result } = renderHook(() => useAiAgentPreferences({
settings,
settingsLoaded: false,
saveSettings: vi.fn(),
aiAgentsStatus,
}))
expect(result.current.defaultAiAgentReadiness).toBe('checking')
expect(result.current.defaultAiAgentReady).toBe(false)
})
it('cycles to the next agent and persists the selection', () => {
const saveSettings = vi.fn()
const onToast = vi.fn()
const { result } = renderHook(() => useAiAgentPreferences({
settings,
settingsLoaded: true,
saveSettings,
aiAgentsStatus,
onToast,
}))
act(() => {
result.current.cycleDefaultAiAgent()
})
expect(saveSettings).toHaveBeenCalledWith({
...settings,
default_ai_agent: 'codex',
})
expect(onToast).toHaveBeenCalledWith('Default AI agent: Codex')
})
it('keeps the browser mock agent composer enabled when no CLI is installed', () => {
const { result } = renderHook(() => useAiAgentPreferences({
settings,
settingsLoaded: true,
saveSettings: vi.fn(),
aiAgentsStatus: {
claude_code: { status: 'missing', version: null },
codex: { status: 'missing', version: null },
opencode: { status: 'missing', version: null },
pi: { status: 'missing', version: null },
gemini: { status: 'missing', version: null },
},
}))
expect(result.current.defaultAiAgentReady).toBe(true)
})
})