import '@testing-library/jest-dom'

import { fireEvent, render } from '@testing-library/react'
import { axe, toHaveNoViolations } from 'jest-axe'

import { PktTextinput } from './Textinput'

expect.extend(toHaveNoViolations)

const inputId = 'inputId'
const label = 'Input Label'

describe('PktTextinput', () => {
  test('renders input field with correct props', async () => {
    const { getByLabelText } = render(<PktTextinput label={label} id={inputId} />)

    const inputElement = getByLabelText('Input Label')
    expect(inputElement).toBeInTheDocument()
    expect(inputElement.tagName).toBe('INPUT')
    expect(inputElement.id).toBe('inputId')
  })

  test('renders error message when hasError prop is true', async () => {
    const { getByText } = render(<PktTextinput label={label} id={inputId} hasError errorMessage="Input error" />)

    const errorMessage = getByText('Input error')
    expect(errorMessage).toBeInTheDocument()
    const alertContainer = errorMessage.closest('pkt-alert')
    expect(alertContainer).not.toBeNull()
    expect(alertContainer).toHaveAttribute('id', 'inputId-error')
  })

  describe('PktTextinput', () => {
    test('toggles helptext class', async () => {
      const { getByText, container } = render(
        <PktTextinput label={label} id={inputId} helptext="Help Text" helptextDropdown="Help Text" />,
      )

      const expandButton = getByText('Les mer').closest('button') as HTMLButtonElement
      const helptextElement = container.querySelector('.pkt-inputwrapper__helptext-expandable-closed')

      await fireEvent.click(expandButton)
      expect(helptextElement).toHaveClass('pkt-inputwrapper__helptext-expandable-open')

      await fireEvent.click(expandButton)
      expect(helptextElement).toHaveClass('pkt-inputwrapper__helptext-expandable-closed')
    })
  })

  describe('accessibility', () => {
    it('renders with no wcag errors with axe', async () => {
      const { container } = render(<PktTextinput label={label} id={inputId} />)

      const results = await axe(container)
      expect(results).toHaveNoViolations()
    })
  })
})
