94 lines
2.8 KiB
TypeScript
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)
|
|
})
|
|
})
|