hermes-agent/ui-tui/src/__tests__/modelPicker.test.ts
kshitijk4poor 58919f68ab fix: also preserve provider selection on Esc-clear-filter path
The back() handler had the same filtered-index drift bug as the Enter
and Ctrl+D transitions: when the user presses Esc to clear an active
filter on the provider stage, providerIdx was reset to 0, losing the
highlighted provider. Apply the same providerIndexAfterClearingFilter
fix as the other three transition paths.

Also adds edge-case tests for the helper: undefined provider, slug not
found, empty rows, and duplicate slug first-match behavior.

Found by hermes-pr-review Phase 2 + hermes-agent-dev 3-agent review.
2026-06-27 04:33:48 +05:30

54 lines
1.7 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { providerIndexAfterClearingFilter } from '../components/modelPicker.js'
import type { ModelOptionProvider } from '../gatewayTypes.js'
const provider = (slug: string, name = slug): ModelOptionProvider => ({ name, slug })
describe('ModelPicker provider filtering', () => {
it('keeps the selected provider when clearing the provider filter', () => {
const nous = provider('nous', 'Nous Portal')
const ollama = provider('ollama-cloud', 'Ollama Cloud')
const rows = [
{ name: nous.name, provider: nous },
{ name: ollama.name, provider: ollama }
]
// With a provider-stage filter like "ollama", the selected row is index 0
// in the filtered list, but index 1 in the full list after setFilter('').
expect(providerIndexAfterClearingFilter(rows, ollama)).toBe(1)
})
it('returns -1 when provider is undefined', () => {
const rows = [
{ name: 'A', provider: provider('a') }
]
expect(providerIndexAfterClearingFilter(rows, undefined)).toBe(-1)
})
it('returns -1 when provider slug is not in rows', () => {
const rows = [
{ name: 'A', provider: provider('a') },
{ name: 'B', provider: provider('b') }
]
expect(providerIndexAfterClearingFilter(rows, provider('missing'))).toBe(-1)
})
it('returns -1 for empty rows', () => {
expect(providerIndexAfterClearingFilter([], provider('a'))).toBe(-1)
})
it('finds the first match when multiple rows share a slug', () => {
const p = provider('dup')
const rows = [
{ name: 'First', provider: p },
{ name: 'Second', provider: p }
]
expect(providerIndexAfterClearingFilter(rows, p)).toBe(0)
})
})