import * as React from 'react';
import expect from 'expect';
import { render, waitFor } from '@testing-library/react';
import { useReferenceArrayFieldController } from './useReferenceArrayFieldController';
import { testDataProvider } from '../../dataProvider';
import { CoreAdminContext } from '../../core';
const ReferenceArrayFieldController = props => {
const { children, ...rest } = props;
const controllerProps = useReferenceArrayFieldController({
sort: {
field: 'id',
order: 'ASC',
},
...rest,
});
return children(controllerProps);
};
describe('', () => {
const dataProvider = testDataProvider({
getMany: jest.fn().mockResolvedValue({
data: [
{ id: 1, title: 'bar1' },
{ id: 2, title: 'bar2' },
],
}),
});
afterEach(async () => {
// @ts-ignore
dataProvider.getMany.mockClear();
// wait for the getManyAggregate batch to resolve
await waitFor(() => new Promise(resolve => setTimeout(resolve, 0)));
});
it('should set the isLoading prop to true when related records are not yet fetched', () => {
const children = jest.fn().mockReturnValue('child');
render(
{children}
);
expect(children).toHaveBeenCalledWith(
expect.objectContaining({
sort: { field: 'id', order: 'ASC' },
isFetching: true,
isLoading: true,
data: undefined,
error: null,
})
);
});
it('should call dataProvider.getMAny on mount and return the result in the data prop', async () => {
const children = jest.fn().mockReturnValue('child');
render(
{children}
);
await waitFor(() =>
expect(dataProvider.getMany).toHaveBeenCalledTimes(1)
);
expect(children).toHaveBeenCalledWith(
expect.objectContaining({
sort: { field: 'id', order: 'ASC' },
isFetching: false,
isLoading: false,
data: [
{ id: 1, title: 'bar1' },
{ id: 2, title: 'bar2' },
],
error: null,
})
);
});
it('should filter string data based on the filter props', async () => {
const children = jest.fn().mockReturnValue('child');
render(
{children}
);
await waitFor(() =>
expect(dataProvider.getMany).toHaveBeenCalledTimes(1)
);
expect(children).toHaveBeenCalledWith(
expect.objectContaining({
sort: { field: 'id', order: 'ASC' },
isFetching: false,
isLoading: false,
data: [{ id: 1, title: 'bar1' }],
error: null,
})
);
});
it('should filter array data based on the filter props', async () => {
const children = jest.fn().mockReturnValue('child');
const dataProvider = testDataProvider({
getMany: jest.fn().mockResolvedValue({
data: [
{ id: 1, items: ['one', 'two'] },
{ id: 2, items: ['three'] },
{ id: 3, items: 'four' },
{ id: 4, items: ['five'] },
],
}),
});
render(
{children}
);
await waitFor(() =>
expect(dataProvider.getMany).toHaveBeenCalledTimes(1)
);
expect(children).toHaveBeenCalledWith(
expect.objectContaining({
sort: { field: 'id', order: 'ASC' },
isFetching: false,
isLoading: false,
data: [
{ id: 1, items: ['one', 'two'] },
{ id: 3, items: 'four' },
{ id: 4, items: ['five'] },
],
error: null,
})
);
});
});