import { useState } from 'react'; import { fireEvent, render, screen } from '@testing-library/react'; import { Toggle } from './toggle'; describe('Toggle', () => { it('should render buttons successfully', () => { render( ); expect(screen.getByText('Option 1')).toBeInTheDocument(); expect(screen.getByText('Option 2')).toBeInTheDocument(); }); it('supports more than 2 inputs', () => { render( ); expect(screen.getByText('Option 3')).toBeInTheDocument(); }); it('allow less than 2 inputs', () => { render( ); expect(screen.getByText('Option 1')).toBeInTheDocument(); }); it('uncontrolled toggle initially has no checked item', () => { render( ); expect(screen.getByDisplayValue('test-1').matches(':checked')).toBeFalsy(); expect(screen.getByDisplayValue('test-2').matches(':checked')).toBeFalsy(); }); it('uncontrolled toggle displays correct checked item after click', () => { render( ); const button = screen.getByText('Option 1'); fireEvent.click(button); expect(screen.getByDisplayValue('test-1').matches(':checked')).toBeTruthy(); expect(screen.getByDisplayValue('test-2').matches(':checked')).toBeFalsy(); }); it('controlled toggle displays correct checked value, first option selected', () => { render( null} /> ); expect(screen.getByDisplayValue('test-1')).toHaveProperty('checked', true); }); it('controlled toggle displays correct checked value, second option selected', () => { render( null} /> ); expect(screen.getByDisplayValue('test-2')).toHaveProperty('checked', true); }); it('onchange handler returning null results in nothing happening', () => { render( null} /> ); expect(screen.getByDisplayValue('test-2')).toHaveProperty('checked', true); const button = screen.getByText('Option 1'); fireEvent.click(button); expect(screen.getByDisplayValue('test-2')).toHaveProperty('checked', true); }); it('onchange handler controlling state sets new value', () => { const ComponentWrapper = () => { const [value, setValue] = useState('test-2'); return ( setValue(e.target.value)} /> ); }; render(); expect(screen.getByDisplayValue('test-2')).toHaveProperty('checked', true); const button = screen.getByText('Option 1'); fireEvent.click(button); expect(screen.getByDisplayValue('test-1')).toHaveProperty('checked', true); }); });