import { Field } from '../field/Field';
import { render, userEvent, fireEvent, screen } from '../test-utils';
import Switch from './Switch';
const props = {
'aria-label': 'a label',
checked: true,
className: 'a-class-name',
id: 'id',
onClick: jest.fn(),
};
describe('Switch', () => {
it('renders component when checked', () => {
const { container } = render(
,
);
expect(screen.getByRole('switch')).toBeChecked();
});
it('renders component associated with label', () => {
render(
<>
,
>,
);
expect(screen.getByLabelText('A switch with a label')).toBeInTheDocument();
});
it('renders component when unchecked', () => {
const { container } = render(
,
);
expect(screen.getByLabelText(props['aria-label'])).not.toBeChecked();
});
it('calls onClick when user press space or enter key', async () => {
render(
,
);
expect(props.onClick).not.toHaveBeenCalled();
await userEvent.tab();
await userEvent.keyboard(' ');
expect(props.onClick).toHaveBeenCalledTimes(1);
await userEvent.keyboard('{Enter}');
expect(props.onClick).toHaveBeenCalledTimes(2);
});
it('should not call onClick if disabled', () => {
const mockCallback = jest.fn();
render();
const input = screen.getByRole('switch');
fireEvent.click(input);
expect(mockCallback).not.toHaveBeenCalled();
});
it('supports `Field` for labeling', () => {
render(
,
);
expect(screen.getByLabelText(/Dark mode/)).toHaveAttribute('role', 'switch');
});
});