|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- import { fireEvent, render, screen } from '@testing-library/react'
- import '@testing-library/jest-dom'
- import SegmentedControl from './index'
-
- describe('SegmentedControl', () => {
- const options = [
- { value: 'option1', text: 'Option 1' },
- { value: 'option2', text: 'Option 2' },
- { value: 'option3', text: 'Option 3' },
- ]
-
- const optionsWithDisabled = [
- { value: 'option1', text: 'Option 1' },
- { value: 'option2', text: 'Option 2', disabled: true },
- { value: 'option3', text: 'Option 3' },
- ]
-
- const onSelectMock = jest.fn((value: string | number | symbol) => value)
-
- beforeEach(() => {
- onSelectMock.mockClear()
- })
-
- it('renders all options correctly', () => {
- render(<SegmentedControl options={options} value='option1' onChange={onSelectMock} />)
-
- options.forEach((option) => {
- expect(screen.getByText(option.text)).toBeInTheDocument()
- })
-
- const divider = screen.getByTestId('segmented-control-divider-1')
- expect(divider).toBeInTheDocument()
- })
-
- it('renders with custom activeClassName when provided', () => {
- render(
- <SegmentedControl
- options={options}
- value='option1'
- onChange={onSelectMock}
- activeClassName='custom-active-class'
- />,
- )
-
- const selectedOption = screen.getByText('Option 1').closest('button')
- expect(selectedOption).toHaveClass('custom-active-class')
- })
-
- it('highlights the selected option', () => {
- render(<SegmentedControl options={options} value='option2' onChange={onSelectMock} />)
-
- const selectedOption = screen.getByText('Option 2').closest('button')
- expect(selectedOption).toHaveClass('active')
- })
-
- it('calls onChange when an option is clicked', () => {
- render(<SegmentedControl options={options} value='option1' onChange={onSelectMock} />)
-
- fireEvent.click(screen.getByText('Option 3'))
- expect(onSelectMock).toHaveBeenCalledWith('option3')
- })
-
- it('does not call onChange when clicking the already selected option', () => {
- render(<SegmentedControl options={options} value='option1' onChange={onSelectMock} />)
-
- fireEvent.click(screen.getByText('Option 1'))
- expect(onSelectMock).not.toHaveBeenCalled()
- })
-
- it('handles disabled state correctly', () => {
- render(<SegmentedControl options={optionsWithDisabled} value='option1' onChange={onSelectMock} />)
-
- fireEvent.click(screen.getByText('Option 2'))
- expect(onSelectMock).not.toHaveBeenCalled()
-
- const optionElement = screen.getByText('Option 2').closest('button')
- expect(optionElement).toHaveAttribute('disabled')
- expect(optionElement).toHaveClass('disabled')
-
- fireEvent.click(screen.getByText('Option 3'))
- expect(onSelectMock).toHaveBeenCalledWith('option3')
- })
-
- it('renders with custom className when provided', () => {
- const customClass = 'my-custom-class'
- render(
- <SegmentedControl
- options={options}
- value='option1'
- onChange={onSelectMock}
- className={customClass}
- />,
- )
-
- const selectedOption = screen.getByText('Option 1').closest('button')?.closest('div')
- expect(selectedOption).toHaveClass(customClass)
- })
- })
|