import { render, fireEvent, screen, mockMatchMedia } from '../test-utils';
import Checkbox, { CheckboxProps } from '.';
import { Field } from '../field/Field';
mockMatchMedia();
describe('Checkbox', () => {
let props: CheckboxProps;
beforeEach(() => {
props = {
label: hello,
onChange: jest.fn(),
};
});
afterAll(() => {
jest.clearAllMocks();
});
it('is enabled by default', () => {
const { container } = render();
expect(getCheckboxContainer(container)).not.toHaveClass('disabled');
});
it('does not render secondary text', () => {
const { container } = render();
expect(container.querySelector('small')).not.toBeInTheDocument();
});
it('calls change handler with new checked value when checkbox button is clicked', () => {
const onChange = jest.fn();
const { rerender } = render();
expect(onChange).not.toHaveBeenCalled();
fireEvent.click(getLabel());
expect(onChange).toHaveBeenCalledWith(true);
rerender();
fireEvent.click(getLabel());
expect(onChange).toHaveBeenCalledWith(false);
});
it('does not call change handler on checkbox button click when disabled', () => {
const onChange = jest.fn();
render();
fireEvent.click(getLabel());
expect(onChange).not.toHaveBeenCalled();
});
it('does not call change handler on checkbox button click when readOnly', () => {
const onChange = jest.fn();
render();
fireEvent.click(getLabel());
expect(onChange).not.toHaveBeenCalled();
});
it('has disabled class when the disabled prop is true', () => {
const { container } = render();
expect(getCheckboxContainer(container)?.firstChild).toHaveClass('disabled');
});
it('passes required to checkbox button', () => {
render();
expect(getCheckbox()).toBeRequired();
});
it('ignores required if disabled or readOnly', () => {
const { rerender } = render();
expect(getCheckbox()).not.toBeRequired();
rerender();
expect(getCheckbox()).not.toBeRequired();
});
it(`doesn't passes checked to checkbox button`, () => {
render();
expect(getCheckbox()).not.toBeChecked();
});
it('passes checked to checkbox button', () => {
render();
expect(getCheckbox()).toHaveAttribute('checked');
});
it('passes disabled to checkbox button', () => {
const { rerender } = render();
expect(getCheckbox()).toBeEnabled();
rerender();
expect(getCheckbox()).toHaveAttribute('disabled');
});
it('disables checkbox button if readOnly', () => {
const { rerender } = render();
expect(getCheckbox()).toBeEnabled();
rerender();
expect(getCheckbox()).toHaveAttribute('disabled');
});
it('displays secondary text when supplied', () => {
const { container } = render();
expect(screen.getByText('secondary text')).toBeInTheDocument();
expect(getCheckboxContainer(container)).toHaveClass('checkbox-lg');
});
it('supports `Field` for error messages', () => {
render(
,
);
const checkbox = screen.getByRole('checkbox');
expect(checkbox).toBeInvalid();
expect(checkbox).toHaveAccessibleDescription('Something went wrong');
});
const getCheckboxContainer = (container: HTMLElement) => container.querySelector('.np-checkbox');
const getLabel = () => screen.getByText('hello').parentElement!;
const getCheckbox = () => screen.getByRole('checkbox');
});