import React from 'react'
import { render, screen, fireEvent } from '@testing-library/react'
import { QueryInput } from '../../components/QueryInput'
describe('QueryInput', () => {
const mockOnSubmit = vi.fn()
beforeEach(() => {
mockOnSubmit.mockClear()
})
it('renders textarea with placeholder text', () => {
render()
const textarea = screen.getByPlaceholderText('Ask a question about your documents...')
expect(textarea).toBeInTheDocument()
})
it('renders submit button', () => {
render()
const button = screen.getByRole('button', { name: /submit/i })
expect(button).toBeInTheDocument()
})
it('button is disabled when textarea is empty', () => {
render()
const button = screen.getByRole('button', { name: /submit/i })
expect(button).toBeDisabled()
})
it('button is disabled when textarea contains only whitespace', () => {
render()
const textarea = screen.getByPlaceholderText('Ask a question about your documents...')
const button = screen.getByRole('button', { name: /submit/i })
fireEvent.change(textarea, { target: { value: ' ' } })
expect(button).toBeDisabled()
})
it('button is disabled when isLoading is true', () => {
render()
const button = screen.getByRole('button', { name: /processing/i })
expect(button).toBeDisabled()
})
it('textarea is disabled when isLoading is true', () => {
render()
const textarea = screen.getByPlaceholderText('Ask a question about your documents...')
expect(textarea).toBeDisabled()
})
it('button is disabled when isLoading is true even with text', () => {
render()
const textarea = screen.getByPlaceholderText('Ask a question about your documents...')
const button = screen.getByRole('button', { name: /processing/i })
fireEvent.change(textarea, { target: { value: 'Some question' } })
expect(button).toBeDisabled()
})
it('calls onSubmit with trimmed text when button is clicked', () => {
render()
const textarea = screen.getByPlaceholderText('Ask a question about your documents...')
const button = screen.getByRole('button', { name: /submit/i })
fireEvent.change(textarea, { target: { value: ' Test question ' } })
fireEvent.click(button)
expect(mockOnSubmit).toHaveBeenCalledTimes(1)
expect(mockOnSubmit).toHaveBeenCalledWith('Test question')
})
it('clears textarea after submit', () => {
render()
const textarea = screen.getByPlaceholderText('Ask a question about your documents...')
const button = screen.getByRole('button', { name: /submit/i })
fireEvent.change(textarea, { target: { value: 'Test question' } })
fireEvent.click(button)
expect(textarea).toHaveValue('')
})
it('calls onSubmit when pressing Enter without Shift', () => {
render()
const textarea = screen.getByPlaceholderText('Ask a question about your documents...')
fireEvent.change(textarea, { target: { value: 'Test question' } })
fireEvent.keyDown(textarea, { key: 'Enter', shiftKey: false })
expect(mockOnSubmit).toHaveBeenCalledTimes(1)
expect(mockOnSubmit).toHaveBeenCalledWith('Test question')
})
it('does not call onSubmit when pressing Enter with Shift', () => {
render()
const textarea = screen.getByPlaceholderText('Ask a question about your documents...')
fireEvent.change(textarea, { target: { value: 'Test question' } })
fireEvent.keyDown(textarea, { key: 'Enter', shiftKey: true })
expect(mockOnSubmit).not.toHaveBeenCalled()
})
it('does not submit when textarea is empty and Enter is pressed', () => {
render()
const textarea = screen.getByPlaceholderText('Ask a question about your documents...')
fireEvent.keyDown(textarea, { key: 'Enter', shiftKey: false })
expect(mockOnSubmit).not.toHaveBeenCalled()
})
it('shows submitted question after clicking submit', () => {
render()
const textarea = screen.getByPlaceholderText('Ask a question about your documents...')
const button = screen.getByRole('button', { name: /submit/i })
fireEvent.change(textarea, { target: { value: 'What is NEC4?' } })
fireEvent.click(button)
expect(screen.getByTestId('submitted-question')).toHaveTextContent('What is NEC4?')
})
it('clears submitted question when user starts typing a new question', () => {
render()
const textarea = screen.getByPlaceholderText('Ask a question about your documents...')
const button = screen.getByRole('button', { name: /submit/i })
fireEvent.change(textarea, { target: { value: 'First question' } })
fireEvent.click(button)
expect(screen.getByTestId('submitted-question')).toBeInTheDocument()
fireEvent.change(textarea, { target: { value: 'New question' } })
expect(screen.queryByTestId('submitted-question')).not.toBeInTheDocument()
})
it('does not show submitted question before any submission', () => {
render()
expect(screen.queryByTestId('submitted-question')).not.toBeInTheDocument()
})
it('does not clear submitted question when typing only whitespace', () => {
render()
const textarea = screen.getByPlaceholderText('Ask a question about your documents...')
const button = screen.getByRole('button', { name: /submit/i })
fireEvent.change(textarea, { target: { value: 'My question' } })
fireEvent.click(button)
expect(screen.getByTestId('submitted-question')).toBeInTheDocument()
fireEvent.change(textarea, { target: { value: ' ' } })
expect(screen.getByTestId('submitted-question')).toBeInTheDocument()
})
})