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 { useReferenceManyFieldController } from './useReferenceManyFieldController'; const ReferenceManyFieldController = props => { const { children, page = 1, perPage = 25, ...rest } = props; const controllerProps = useReferenceManyFieldController({ page, perPage, ...rest, }); return children(controllerProps); }; describe('useReferenceManyFieldController', () => { it('should set isLoading to true when related records are 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' }, { id: 2, title: 'world' }, ], total: 2, }) 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( 'books', { id: 123, target: 'author_id', pagination: { page: 1, perPage: 25 }, sort: { field: 'id', order: 'DESC' }, filter: {}, } ); }); }); it('should pass data to children function', async () => { const children = jest.fn().mockReturnValue('children'); const dataProvider = testDataProvider({ getManyReference: () => Promise.resolve({ data: [ { id: 1, title: 'hello' }, { id: 2, title: 'world' }, ], total: 2, }) as any, }); render( {children} ); await waitFor(() => { expect(children).toHaveBeenCalledWith( expect.objectContaining({ data: [ { id: 1, title: 'hello' }, { id: 2, title: 'world' }, ], total: 2, hasPreviousPage: false, hasNextPage: false, }) ); }); }); it('should handle partial pagination', async () => { const children = jest.fn().mockReturnValue('children'); const dataProvider = testDataProvider({ getManyReference: () => Promise.resolve({ data: [ { id: 1, title: 'hello' }, { id: 2, title: 'world' }, ], pageInfo: { hasPreviousPage: false, hasNextPage: false, }, }) as any, }); render( {children} ); await waitFor(() => { expect(children).toHaveBeenCalledWith( expect.objectContaining({ total: undefined, hasPreviousPage: false, hasNextPage: false, }) ); }); }); 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: 25 }, sort: { field: 'id', order: 'DESC' }, filter: {}, } ); }); }); it('should call crudGetManyReference when its props changes', async () => { const dataProvider = testDataProvider({ getManyReference: jest .fn() .mockResolvedValue({ data: [], total: 0 }), }); const ControllerWrapper = props => ( {() => 'null'} ); const { rerender } = render(); expect(dataProvider.getManyReference).toBeCalledTimes(1); rerender(); await waitFor(() => { expect(dataProvider.getManyReference).toBeCalledTimes(2); expect(dataProvider.getManyReference).toHaveBeenCalledWith( 'books', { id: 123, target: 'author_id', pagination: { page: 1, perPage: 25 }, sort: { field: 'id', order: 'ASC' }, filter: {}, } ); }); }); });