vkashti / app / quiz / __tests__ / QuizInput.test.tsx
QuizInput.test.tsx
Raw
import React from 'react'
import { render, screen, fireEvent } from '@testing-library/react'
import { QuizInput } from '../QuizInput'

describe('QuizInput', () => {
  const mockSetAnswer = jest.fn()

  beforeEach(() => {
    mockSetAnswer.mockClear()
  })

  it('renders multiple choice buttons for round 1', () => {
    render(
      <QuizInput
        currentRound={1}
        answer=""
        setAnswer={mockSetAnswer}
      />
    )

    const buttons = screen.getAllByRole('button')
    expect(buttons).toHaveLength(4)
    expect(buttons[0]).toHaveTextContent('А')
    expect(buttons[1]).toHaveTextContent('Б')
    expect(buttons[2]).toHaveTextContent('В')
    expect(buttons[3]).toHaveTextContent('Г')
  })

  it('renders textarea for rounds other than 1', () => {
    render(
      <QuizInput
        currentRound={2}
        answer=""
        setAnswer={mockSetAnswer}
      />
    )

    const textarea = screen.getByRole('textbox')
    expect(textarea).toBeInTheDocument()
    expect(textarea).toHaveAttribute('placeholder', 'Вашият отговор')
  })

  it('calls setAnswer when a multiple choice button is clicked', () => {
    render(
      <QuizInput
        currentRound={1}
        answer=""
        setAnswer={mockSetAnswer}
      />
    )

    const button = screen.getByText('А')
    fireEvent.click(button)
    expect(mockSetAnswer).toHaveBeenCalledWith('А')
  })

  it('calls setAnswer when textarea value changes', () => {
    render(
      <QuizInput
        currentRound={2}
        answer=""
        setAnswer={mockSetAnswer}
      />
    )

    const textarea = screen.getByRole('textbox')
    fireEvent.change(textarea, { target: { value: 'test answer' } })
    expect(mockSetAnswer).toHaveBeenCalledWith('test answer')
  })

  it('disables input when disabled prop is true', () => {
    render(
      <QuizInput
        currentRound={1}
        answer=""
        setAnswer={mockSetAnswer}
        disabled={true}
      />
    )

    const buttons = screen.getAllByRole('button')
    buttons.forEach(button => {
      expect(button).toBeDisabled()
    })
  })

  it('makes textarea read-only when readOnly prop is true', () => {
    render(
      <QuizInput
        currentRound={2}
        answer=""
        setAnswer={mockSetAnswer}
        readOnly={true}
      />
    )

    const textarea = screen.getByRole('textbox')
    expect(textarea).toHaveAttribute('readOnly')
  })
})