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: {}, } ); }); }); });