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);
});
});