import * as React from 'react';
import { render, screen, waitFor } from '@testing-library/react';
import expect from 'expect';
import { testDataProvider } from '../../dataProvider/testDataProvider';
import { CoreAdminContext } from '../../core';
import { useReferenceOneFieldController } from './useReferenceOneFieldController';
const ReferenceOneFieldController = props => {
const { children, page = 1, perPage = 1, ...rest } = props;
const controllerProps = useReferenceOneFieldController({
page,
perPage,
...rest,
});
return children(controllerProps);
};
describe('useReferenceOneFieldController', () => {
it('should set isLoading to true when the related record is not yet fetched', async () => {
const ComponentToTest = ({ isLoading }: { isLoading?: boolean }) => {
return
isLoading: {isLoading.toString()}
;
};
const dataProvider = testDataProvider({
getManyReference: () => Promise.resolve({ data: [], total: 0 }),
});
render(
{props => }
);
expect(screen.queryByText('isLoading: true')).not.toBeNull();
await waitFor(() => {
expect(screen.queryByText('isLoading: false')).not.toBeNull();
});
});
it('should set isLoading to false when related records have been fetched and there are results', async () => {
const ComponentToTest = ({ isLoading }: { isLoading?: boolean }) => {
return isLoading: {isLoading.toString()}
;
};
const dataProvider = testDataProvider({
getManyReference: () =>
Promise.resolve({
data: [{ id: 1, title: 'hello' }],
total: 1,
}) as any,
});
render(
{props => }
);
expect(screen.queryByText('isLoading: true')).not.toBeNull();
await waitFor(() => {
expect(screen.queryByText('isLoading: false')).not.toBeNull();
});
});
it('should call dataProvider.getManyReferences on mount', async () => {
const dataProvider = testDataProvider({
getManyReference: jest
.fn()
.mockResolvedValue({ data: [], total: 0 }),
});
render(
{() => 'null'}
);
await waitFor(() => {
expect(dataProvider.getManyReference).toHaveBeenCalledWith('bios', {
target: 'author_id',
id: 123,
pagination: { page: 1, perPage: 1 },
sort: { field: 'name', order: 'DESC' },
filter: { gender: 'female' },
});
});
});
it('should pass referenceRecord to children function', async () => {
const children = jest.fn().mockReturnValue('children');
const dataProvider = testDataProvider({
getManyReference: () =>
Promise.resolve({
data: [{ id: 1, title: 'hello' }],
total: 1,
}) as any,
});
render(
{children}
);
await waitFor(() => {
expect(children).toHaveBeenCalledWith(
expect.objectContaining({
referenceRecord: { id: 1, title: 'hello' },
})
);
});
});
it('should support custom source', async () => {
const dataProvider = testDataProvider({
getManyReference: jest
.fn()
.mockResolvedValue({ data: [], total: 0 }),
});
render(
{() => 'null'}
);
await waitFor(() => {
expect(dataProvider.getManyReference).toHaveBeenCalledWith(
'books',
{
id: 'jamesjoyce256',
target: 'author_id',
pagination: { page: 1, perPage: 1 },
sort: { field: 'id', order: 'ASC' },
filter: {},
}
);
});
});
it('should call crudGetManyReference when its props changes', async () => {
const dataProvider = testDataProvider({
getManyReference: jest
.fn()
.mockResolvedValue({ data: [], total: 0 }),
});
const ControllerWrapper = ({ record }) => (
{() => 'null'}
);
const { rerender } = render(
);
expect(dataProvider.getManyReference).toBeCalledTimes(1);
rerender(
);
await waitFor(() => {
expect(dataProvider.getManyReference).toBeCalledTimes(2);
expect(dataProvider.getManyReference).toHaveBeenCalledWith(
'books',
{
id: 456,
target: 'author_id',
pagination: { page: 1, perPage: 1 },
sort: { field: 'id', order: 'ASC' },
filter: {},
}
);
});
});
});