import * as React from 'react'; import expect from 'expect'; import { act, render, screen, waitFor } from '@testing-library/react'; import { Routes, Route } from 'react-router'; import { createMemoryHistory } from 'history'; import { EditController } from './EditController'; import { DataProvider } from '../../types'; import { CoreAdminContext } from '../../core'; import { useNotificationContext } from '../../notification'; import { SaveContextProvider } from '..'; import undoableEventEmitter from '../../dataProvider/undoableEventEmitter'; import { Middleware, useRegisterMutationMiddleware } from '../saveContext'; import { testDataProvider, useUpdate } from '../../dataProvider'; describe('useEditController', () => { const defaultProps = { id: 12, resource: 'posts', }; it('should call the dataProvider.getOne() function on mount', async () => { const getOne = jest .fn() .mockImplementationOnce(() => Promise.resolve({ data: { id: 12, title: 'hello' } }) ); const dataProvider = ({ getOne } as unknown) as DataProvider; render( {({ record }) =>
{record && record.title}
}
); await waitFor(() => { expect(getOne).toHaveBeenCalled(); expect(screen.queryAllByText('hello')).toHaveLength(1); }); }); it('should decode the id from the route params', async () => { const getOne = jest .fn() .mockImplementationOnce(() => Promise.resolve({ data: { id: 'test?', title: 'hello' } }) ); const dataProvider = ({ getOne } as unknown) as DataProvider; const history = createMemoryHistory({ initialEntries: ['/posts/test%3F'], }); render( {({ record }) => (
{record && record.title}
)} } />
); await waitFor(() => { expect(getOne).toHaveBeenCalledWith('posts', { id: 'test?' }); }); await waitFor(() => { expect(screen.queryAllByText('hello')).toHaveLength(1); }); }); it('should use the id provided through props if any', async () => { const getOne = jest .fn() .mockImplementationOnce(() => Promise.resolve({ data: { id: 0, title: 'hello' } }) ); const dataProvider = ({ getOne } as unknown) as DataProvider; const history = createMemoryHistory({ initialEntries: ['/posts/test%3F'], }); render( {({ record }) => (
{record && record.title}
)} } />
); await waitFor(() => { expect(getOne).toHaveBeenCalledWith('posts', { id: 0 }); }); await waitFor(() => { expect(screen.queryAllByText('hello')).toHaveLength(1); }); }); it('should return the `redirect` provided through props or the default', async () => { const getOne = jest .fn() .mockImplementationOnce(() => Promise.resolve({ data: { id: 12, title: 'hello' } }) ); const dataProvider = ({ getOne } as unknown) as DataProvider; const Component = ({ redirect = undefined }) => ( {({ redirect }) =>
{redirect}
}
); const { rerender } = render(); await waitFor(() => { expect(screen.queryAllByText('list')).toHaveLength(1); }); rerender(); await waitFor(() => { expect(screen.queryAllByText('show')).toHaveLength(1); }); }); describe('queryOptions', () => { it('should accept custom client query options', async () => { const mock = jest .spyOn(console, 'error') .mockImplementation(() => {}); const getOne = jest .fn() .mockImplementationOnce(() => Promise.reject(new Error())); const onError = jest.fn(); const dataProvider = ({ getOne } as unknown) as DataProvider; render( {() =>
} ); await waitFor(() => { expect(getOne).toHaveBeenCalled(); expect(onError).toHaveBeenCalled(); }); mock.mockRestore(); }); it('should accept a meta in query options', async () => { const getOne = jest .fn() .mockImplementationOnce(() => Promise.resolve({ data: { id: 0, title: 'hello' } }) ); const dataProvider = ({ getOne } as unknown) as DataProvider; render( {() =>
} ); await waitFor(() => { expect(getOne).toHaveBeenCalledWith('posts', { id: 12, meta: { foo: 'bar' }, }); }); }); }); it('should call the dataProvider.update() function on save', async () => { const update = jest .fn() .mockImplementationOnce((_, { id, data, previousData }) => Promise.resolve({ data: { id, ...previousData, ...data } }) ); const dataProvider = ({ getOne: () => Promise.resolve({ data: { id: 12, test: 'previous' } }), update, } as unknown) as DataProvider; render( {({ record, save, saving }) => { return ( <>

{record?.test}