import React from 'react';
import { fireEvent, render } from '@testing-library/react';
import { axe } from 'jest-axe';
import 'jest-styled-components';
import 'jest-axe/extend-expect';
import 'regenerator-runtime/runtime';
import { Grommet } from '../../Grommet';
import { TextArea, TextAreaProps } from '..';
describe('TextArea', () => {
test('should not have accessibility violations', async () => {
const { container } = render(
,
);
const results = await axe(container);
expect(results).toHaveNoViolations();
});
test('basic', () => {
const { container } = render(
,
);
expect(container.firstChild).toMatchSnapshot();
});
test('placeholder', () => {
const { container } = render(
,
);
expect(container.firstChild).toMatchSnapshot();
});
test('plain', () => {
const { container } = render(
,
);
expect(container.firstChild).toMatchSnapshot();
});
test('disabled', () => {
const { container } = render(
,
);
expect(container.firstChild).toMatchSnapshot();
});
test('focusIndicator', () => {
const { container } = render(
,
);
expect(container.firstChild).toMatchSnapshot();
});
test('fill', () => {
const { container } = render(
,
);
expect(container.firstChild).toMatchSnapshot();
});
const resizes: TextAreaProps['resize'][] = [
true,
false,
'horizontal',
'vertical',
];
resizes.forEach((resize) => {
test(`resize ${resize}`, () => {
const { container } = render(
,
);
expect(container.firstChild).toMatchSnapshot();
});
});
['small', 'medium', 'large'].forEach((size) => {
test(`size ${size}`, () => {
const { container } = render(
,
);
expect(container.firstChild).toMatchSnapshot();
});
});
describe('Event tests', () => {
const keyEvent = {
key: 'Backspace',
keyCode: 8,
which: 8,
};
test(`onKeyDown`, () => {
let capturedEvent: React.KeyboardEvent | null = null;
const callback: React.KeyboardEventHandler = (
event,
) => {
capturedEvent = event;
};
const component = render(
,
);
const textArea = component.getByPlaceholderText('item');
fireEvent.keyDown(textArea, keyEvent);
expect(capturedEvent).toEqual(expect.objectContaining(keyEvent));
});
test(`onKeyUp`, () => {
let capturedEvent: React.KeyboardEvent | null = null;
const callback: React.KeyboardEventHandler = (
event,
) => {
capturedEvent = event;
};
const component = render(
,
);
const textArea = component.getByPlaceholderText('item');
fireEvent.keyUp(textArea, keyEvent);
expect(capturedEvent).toEqual(expect.objectContaining(keyEvent));
});
test('onFocus', () => {
const onFocus = jest.fn();
const { container, getByPlaceholderText } = render(
,
);
fireEvent.focus(getByPlaceholderText('item'));
expect(container.firstChild).toMatchSnapshot();
expect(onFocus).toHaveBeenCalledTimes(1);
});
test('onChange', () => {
const onChange = jest.fn();
const { getByPlaceholderText } = render(
,
);
const input = getByPlaceholderText('item') as HTMLInputElement;
fireEvent.change(input, {
target: { value: 'Test' },
});
expect(input.value).toEqual('Test');
expect(onChange).toHaveBeenCalledTimes(1);
});
test('onBlur is being called', () => {
const onBlur = jest.fn();
const { getByPlaceholderText } = render(
,
);
fireEvent.blur(getByPlaceholderText('item'));
expect(onBlur).toHaveBeenCalledTimes(1);
});
test('renders size', () => {
const { container } = render(
,
);
expect(container.children).toMatchSnapshot();
});
});
test('custom theme input font size', () => {
const { container } = render(
,
);
expect(container.firstChild).toMatchSnapshot();
});
test('should apply a11yTitle or aria-label', () => {
const { container, getByLabelText } = render(
,
);
expect(getByLabelText('item')).toBeTruthy();
expect(getByLabelText('item-2')).toBeTruthy();
expect(container.firstChild).toMatchSnapshot();
});
});