import React, { FocusEvent, ReactElement } from 'react';
import { fireEvent } from '@testing-library/react';
import renderWithTheme from '../../../testUtils/renderWithTheme';
import Input from '..';
import Typography from '../../Typography';
import Button from '../../Button';
describe('rendering', () => {
it('renders input', () => {
const { getByLabelText } = renderWithTheme(
Email
);
expect(getByLabelText('Email')).toBeInTheDocument();
});
describe('Affixes rendering', () => {
describe('Affixes are string', () => {
it('renders icon with prefix', () => {
const { container } = renderWithTheme();
expect(container.querySelectorAll('i')).toHaveLength(1);
});
it('renders icon with suffix', () => {
const { container } = renderWithTheme();
expect(container.querySelectorAll('i')).toHaveLength(1);
});
it('renders icon with prefix & suffix', () => {
const { container } = renderWithTheme(
);
expect(container.querySelectorAll('i')).toHaveLength(2);
});
});
describe('Affixes are custom react element', () => {
it('renders icon with prefix', () => {
const { getByText } = renderWithTheme(
My prefix} />
);
expect(getByText('My prefix')).toBeInTheDocument();
});
it('renders icon with suffix', () => {
const { getByText } = renderWithTheme(
My suffix} />
);
expect(getByText('My suffix')).toBeInTheDocument();
});
it('renders icon with prefix & suffix', () => {
const { getByText } = renderWithTheme(
My suffix}
prefix={My prefix}
/>
);
expect(getByText('My prefix')).toBeInTheDocument();
expect(getByText('My suffix')).toBeInTheDocument();
});
});
});
});
describe('interaction', () => {
it('works as uncontrolled component', () => {
const { getByLabelText } = renderWithTheme(
Email
);
expect((getByLabelText('Email') as HTMLInputElement).value).toEqual('');
fireEvent.change(getByLabelText('Email'), {
target: { value: 'new value' },
});
expect((getByLabelText('Email') as HTMLInputElement).value).toEqual(
'new value'
);
});
it('works as controlled component', () => {
const onChange = jest.fn();
const { getByLabelText } = renderWithTheme(
Email
onChange(e.target.value)} />
);
expect((getByLabelText('Email') as HTMLInputElement).value).toEqual(
'fixed'
);
fireEvent.change(getByLabelText('Email'), {
target: { value: 'new value' },
});
expect(onChange).toHaveBeenCalledTimes(1);
expect(onChange).toHaveBeenCalledWith('new value');
expect((getByLabelText('Email') as HTMLInputElement).value).toEqual(
'fixed'
);
});
it('can get auto focus', () => {
const onFocus = jest.fn();
renderWithTheme();
expect(onFocus).toHaveBeenCalledTimes(1);
});
it('can be controlled via ref', () => {
const mockOnFocus = jest.fn();
const Component = ({
onFocus,
}: {
onFocus?: (e: FocusEvent) => void;
}): ReactElement => {
const ref = React.useRef(null);
return (
<>