import * as React from 'react';
import expect from 'expect';
import { screen, render, waitFor, fireEvent } from '@testing-library/react';
import { Basic, PageInfo } from './useInfiniteGetList.stories';
describe('useInfiniteGetList', () => {
it('should call dataProvider.getList() on mount', async () => {
const dataProvider = {
getList: jest.fn(() =>
Promise.resolve({
data: [{ id: 73, name: 'France', code: 'FR' }],
total: 1,
})
),
} as any;
render();
await waitFor(() => {
expect(dataProvider.getList).toBeCalledTimes(1);
expect(dataProvider.getList).toBeCalledWith('heroes', {
filter: {},
pagination: { page: 1, perPage: 20 },
sort: { field: 'id', order: 'DESC' },
});
});
});
it('should not call the dataProvider on update', async () => {
const dataProvider = {
getList: jest.fn(() =>
Promise.resolve({
data: [{ id: 73, name: 'France', code: 'FR' }],
total: 1,
})
),
} as any;
const { rerender } = render();
await waitFor(() => {
expect(dataProvider.getList).toBeCalledTimes(1);
});
rerender();
await waitFor(() => {
expect(dataProvider.getList).toBeCalledTimes(1);
});
});
it('should call the dataProvider on update when the resource changes', async () => {
const dataProvider = {
getList: jest.fn(() =>
Promise.resolve({
data: [{ id: 73, name: 'France', code: 'FR' }],
total: 1,
})
),
} as any;
const { rerender } = render(
);
await waitFor(() => {
expect(dataProvider.getList).toBeCalledTimes(1);
});
rerender();
await waitFor(() => {
expect(dataProvider.getList).toBeCalledTimes(2);
});
});
it('should accept a meta parameter', async () => {
const dataProvider = {
getList: jest.fn(() =>
Promise.resolve({
data: [{ id: 73, name: 'France', code: 'FR' }],
total: 1,
})
),
} as any;
render(
);
await waitFor(() => {
expect(dataProvider.getList).toBeCalledWith('heroes', {
filter: {},
pagination: { page: 1, perPage: 20 },
sort: { field: 'id', order: 'DESC' },
meta: { hello: 'world' },
});
});
});
it('should call success side effects on success', async () => {
const onSuccess1 = jest.fn();
const countries = [
{ id: 73, name: 'France', code: 'FR' },
{ id: 74, name: 'Italia', code: 'IT' },
];
const dataProvider = {
getList: (resource, params) => {
return Promise.resolve({
data: countries.slice(
(params.pagination.page - 1) *
params.pagination.perPage,
(params.pagination.page - 1) *
params.pagination.perPage +
params.pagination.perPage
),
total: countries.length,
});
},
};
render(
);
await waitFor(async () => {
expect(onSuccess1).toBeCalledTimes(1);
expect(screen.getByLabelText('country').innerHTML).toContain(
'France'
);
screen.getByLabelText('refetch-button').click();
await waitFor(async () => {
expect(onSuccess1).toBeCalledTimes(2);
expect(screen.queryAllByLabelText('country')).toHaveLength(2);
});
});
});
describe('fetchNextPage', () => {
it('should fetch the next page when the dataProvider uses total', async () => {
render();
const button = await screen.findByLabelText('refetch-button');
fireEvent.click(button);
await screen.findByText('Belgium -- BE');
});
it('should fetch the next page when the dataProvider uses pageInfo', async () => {
render();
const button = await screen.findByLabelText('refetch-button');
fireEvent.click(button);
await screen.findByText('Belgium -- BE');
});
});
});