import * as React from 'react';
import expect from 'expect';
import { render, screen, waitFor } from '@testing-library/react';
import { Route, Routes } from 'react-router';
import { createMemoryHistory } from 'history';
import { ShowController } from './ShowController';
import { CoreAdminContext } from '../../core';
import { DataProvider } from '../../types';
describe('useShowController', () => {
const defaultProps = {
id: 12,
resource: 'posts',
debounce: 200,
};
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;
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;
render(
{({ record }) => (
{record && record.title}
)}
}
/>
);
await waitFor(() => {
expect(getOne).toHaveBeenCalledWith('posts', { id: 0 });
});
await waitFor(() => {
expect(screen.queryAllByText('hello')).toHaveLength(1);
});
});
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 meta in queryOptions', 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: '1',
meta: { foo: 'bar' },
});
});
});
});