import { render, screen, fireEvent } from '@testing-library/react'
import { ConversationTimeline } from '../session/ConversationTimeline'
import type { ChatMessageData } from '../chat/types'
beforeAll(() => {
Element.prototype.scrollIntoView = jest.fn()
})
const entries: ChatMessageData[] = [
{ id: '1', role: 'assistant', content: 'Started the task' },
{ id: '2', role: 'tool', kind: 'tool', toolName: 'bash', content: 'npm test' },
{ id: '3', role: 'user', content: 'Focus on the billing page' },
]
describe('ConversationTimeline', () => {
it('renders the timeline entries', () => {
render()
expect(screen.getByText('Started the task')).toBeInTheDocument()
expect(screen.getByText('npm test')).toBeInTheDocument()
expect(screen.getByText('Focus on the billing page')).toBeInTheDocument()
})
it('renders header title, status label, and a progress bar', () => {
render()
expect(screen.getByText('Session goal')).toBeInTheDocument()
expect(screen.getByText('Connected')).toBeInTheDocument()
const bar = screen.getByRole('progressbar')
expect(bar).toHaveAttribute('aria-valuenow', '42')
})
it('sends composed text via onSend', () => {
const onSend = jest.fn()
render()
const textarea = screen.getByRole('textbox')
fireEvent.change(textarea, { target: { value: 'steer left' } })
fireEvent.keyDown(textarea, { key: 'Enter' })
expect(onSend).toHaveBeenCalledWith('steer left')
})
it('does not render a composer when onSend is omitted', () => {
render()
expect(screen.queryByRole('textbox')).not.toBeInTheDocument()
})
it('renders a "Load earlier messages" control when hasMore', () => {
const onLoadMore = jest.fn()
render()
fireEvent.click(screen.getByRole('button', { name: /load earlier messages/i }))
expect(onLoadMore).toHaveBeenCalledTimes(1)
})
it('shows the working indicator when isLoading', () => {
render()
expect(screen.getByTestId('chat-working-indicator')).toBeInTheDocument()
})
})