import React from 'react';
import { fireEvent, render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import 'jest-styled-components';
import { Grommet } from '../../Grommet';
import { DataFilters } from '../../DataFilters';
import { DataTable } from '../../DataTable';
import { Pagination } from '../../Pagination';
import { Data } from '..';
import { createPortal, expectPortal } from '../../../utils/portal';
const data = [
{
name: 'aa',
enabled: true,
rating: 2.3,
sub: { note: 'ZZ' },
tags: ['qa', 'staging', 'prod'],
},
{
name: 'bb',
enabled: false,
rating: 4.3,
sub: { note: 'YY' },
tags: ['qa', 'staging'],
},
{ name: 'cc', sub: {}, tags: ['qa'] },
{ name: 'dd' },
];
describe('Data', () => {
window.scrollTo = jest.fn();
beforeEach(createPortal);
test('renders', () => {
const { container } = render(
,
);
expect(container.firstChild).toMatchSnapshot();
});
test('toolbar', () => {
const { getByText, container } = render(
,
);
expect(getByText('4 items')).toBeTruthy();
expect(container.firstChild).toMatchSnapshot();
});
test('view', () => {
const { getByText, container } = render(
,
);
expect(getByText('bb')).toBeTruthy();
expect(container.firstChild).toMatchSnapshot();
});
test('view search', () => {
const { getByText, queryByText, container } = render(
,
);
expect(getByText('1 result of 4 items')).toBeTruthy();
expect(getByText('aa')).toBeTruthy();
expect(queryByText('bb')).toBeFalsy();
expect(container.firstChild).toMatchSnapshot();
});
test('view property option', () => {
const { getByText, container } = render(
,
);
expect(getByText('1 result of 4 items')).toBeTruthy();
expect(getByText('aa')).toBeTruthy();
expect(container.firstChild).toMatchSnapshot();
});
test('view property range', () => {
const { getByText, container } = render(
,
);
expect(getByText('1 result of 4 items')).toBeTruthy();
expect(getByText('bb')).toBeTruthy();
expect(container.firstChild).toMatchSnapshot();
});
test('view sort', () => {
const { getByText, container } = render(
,
);
expect(getByText('4 items')).toBeTruthy();
expect(container.firstChild).toMatchSnapshot();
});
test('view all', () => {
const { getByText, container } = render(
,
);
expect(getByText('1 result of 4 items')).toBeTruthy();
expect(getByText('aa')).toBeTruthy();
expect(container.firstChild).toMatchSnapshot();
});
test('messages', () => {
const { getByText, container } = render(
,
);
expect(getByText('4 things')).toBeTruthy();
expect(getByText('aa')).toBeTruthy();
expect(container.firstChild).toMatchSnapshot();
});
test('uncontrolled search', () => {
const { getByRole, getByText, queryByText, container } = render(
,
);
expect(getByText('4 items')).toBeTruthy();
expect(getByText('bb')).toBeTruthy();
expect(container.firstChild).toMatchSnapshot();
fireEvent.change(getByRole('searchbox'), {
target: { value: 'a' },
});
expect(getByText('1 result of 4 items')).toBeTruthy();
expect(queryByText('bb')).toBeFalsy();
expect(container.firstChild).toMatchSnapshot();
});
test('controlled search', () => {
const onView = jest.fn();
const { getByRole, getByText, container } = render(
,
);
expect(getByText('bb')).toBeTruthy();
expect(container.firstChild).toMatchSnapshot();
fireEvent.change(getByRole('searchbox'), {
target: { value: 'a' },
});
expect(getByText('bb')).toBeTruthy();
expect(container.firstChild).toMatchSnapshot();
expect(onView).toHaveBeenNthCalledWith(
1,
expect.objectContaining({
search: 'a',
properties: {},
}),
);
});
test('toolbar search', () => {
const { container } = render(
,
);
expect(container.firstChild).toMatchSnapshot();
});
test('toolbar filters', () => {
const { container } = render(
,
);
expect(container.firstChild).toMatchSnapshot();
});
test('pagination', () => {
const { container } = render(
{}}
view={{ page: 2, step: 2 }}
>
,
);
expect(container.firstChild).toMatchSnapshot();
});
test('pagination step', () => {
const { container } = render(
{}}
>
,
);
expect(container.firstChild).toMatchSnapshot();
});
test('onView', () => {
const onView = jest.fn();
const { container } = render(
,
);
expect(container.firstChild).toMatchSnapshot();
});
test('properties when property is an array', async () => {
const user = userEvent.setup();
const { asFragment } = render(
(tags ? tags.join(', ') : null),
},
]}
/>
,
);
expect(asFragment()).toMatchSnapshot();
const filtersButton = screen.getByRole('button', { name: 'Open filters' });
expect(filtersButton).toBeTruthy();
await user.click(filtersButton);
expect(screen.getByRole('button', { name: 'Apply filters' })).toBeTruthy();
expectPortal('data--filters-control').toMatchSnapshot();
});
});