import React from 'react';
import { fireEvent } from '@testing-library/react';
import renderWithTheme from '../../../testUtils/renderWithTheme';
import Switch from '..';
import Typography from '../../Typography';
describe('rendering', () => {
it('renders switch as input', () => {
const { getByLabelText } = renderWithTheme(
Toggle
);
expect(getByLabelText('Toggle')).toBeInTheDocument();
});
describe('Icon', () => {
it('renders icon when icon has value', () => {
const { getByTestId } = renderWithTheme(
Toggle
);
expect(getByTestId('switch-icon')).toBeInTheDocument();
});
it('does not render icon when icon is undefined', () => {
const { queryByTestId } = renderWithTheme(
Toggle
);
expect(queryByTestId('switch-icon')).not.toBeInTheDocument();
});
});
describe('Loading', () => {
it('renders loading icon when loading is true', () => {
const { getByTestId } = renderWithTheme(
Toggle
);
expect(getByTestId('loading-icon')).toBeInTheDocument();
});
it('does not render loading icon when loading is false', () => {
const { queryByTestId } = renderWithTheme(
Toggle
);
expect(queryByTestId('loading-icon')).not.toBeInTheDocument();
});
});
});
describe('interaction', () => {
it('toggles state as an uncontrolled component', () => {
const onChange = jest.fn();
const { getByLabelText } = renderWithTheme(
Toggle
onChange(e.target.checked)} />
);
expect((getByLabelText('Toggle') as HTMLInputElement).checked).toBe(false);
fireEvent.click(getByLabelText('Toggle'));
expect((getByLabelText('Toggle') as HTMLInputElement).checked).toBe(true);
fireEvent.click(getByLabelText('Toggle'));
expect((getByLabelText('Toggle') as HTMLInputElement).checked).toBe(false);
});
it('allows to be controlled', () => {
const onChange = jest.fn();
const { getByLabelText } = renderWithTheme(
Toggle
onChange(e.target.checked)}
/>
);
expect((getByLabelText('Toggle') as HTMLInputElement).checked).toBe(false);
fireEvent.click(getByLabelText('Toggle'));
expect(onChange).toHaveBeenCalledTimes(1);
expect(onChange).toHaveBeenCalledWith(true);
fireEvent.click(getByLabelText('Toggle'));
expect(onChange).toHaveBeenCalledTimes(2);
expect(onChange).toHaveBeenCalledWith(true);
});
});