import { describe, test, expect, vi } from 'vitest'
import { render, screen, fireEvent } from '@testing-library/react'
import { ChatFooter } from './chat-footer'
describe('ChatFooter', () => {
const defaultProps = {
value: '',
onChange: vi.fn(),
onSend: vi.fn(),
}
test('renders send button', () => {
render()
expect(screen.getByLabelText('Send')).toBeTruthy()
})
test('send button is disabled when value is empty', () => {
render()
expect(screen.getByLabelText('Send').hasAttribute('disabled')).toBeTruthy()
})
test('renders stop button when generating', () => {
render()
expect(screen.getByLabelText('Stop')).toBeTruthy()
})
test('calls onChange when typing', () => {
const onChange = vi.fn()
render()
const input = screen.getByPlaceholderText('Type a message...')
fireEvent.change(input, { target: { value: 'hello' } })
expect(onChange).toHaveBeenCalledWith('hello')
})
const MODELS = [
{ value: 'gpt-4o', label: 'gpt-4o' },
{ value: 'gemini-2.5-pro', label: 'gemini-2.5-pro' },
]
test('no model selector when models is empty/undefined', () => {
render()
expect(screen.queryByLabelText('Select model')).toBeNull()
})
test('no model selector when only one model is available', () => {
render(
,
)
expect(screen.queryByLabelText('Select model')).toBeNull()
})
test('renders the selected model label', () => {
render(
,
)
const trigger = screen.getByLabelText('Select model')
expect(trigger.textContent).toContain('gpt-4o')
})
test('opens the menu and fires onModelChange', () => {
const onModelChange = vi.fn()
render(
,
)
fireEvent.click(screen.getByLabelText('Select model'))
fireEvent.click(screen.getByRole('menuitem', { name: 'gemini-2.5-pro' }))
expect(onModelChange).toHaveBeenCalledWith('gemini-2.5-pro')
})
test('model selector is disabled while generating', () => {
render(
,
)
expect(
screen.getByLabelText('Select model').hasAttribute('disabled'),
).toBeTruthy()
})
})