import * as React from 'react';
import expect from 'expect';
import { render, waitFor } from '@testing-library/react';
import { CoreAdminContext } from '../core';
import { useGetOne } from './useGetOne';
import { testDataProvider } from '../dataProvider';
const UseGetOne = ({
resource,
id,
meta = undefined,
options = {},
callback = null,
...rest
}) => {
const hookValue = useGetOne(resource, { id, meta }, options);
if (callback) callback(hookValue);
return
hello
;
};
describe('useGetOne', () => {
let dataProvider;
beforeEach(() => {
dataProvider = testDataProvider({
getOne: jest
.fn()
.mockResolvedValue({ data: { id: 1, title: 'foo' } }),
});
});
it('should call dataProvider.getOne() on mount', async () => {
render(
);
await waitFor(() => {
expect(dataProvider.getOne).toHaveBeenCalledTimes(1);
expect(dataProvider.getOne).toHaveBeenCalledWith('posts', {
id: 1,
});
});
});
it('should not call dataProvider.getOne() on mount if enabled is false', async () => {
const { rerender } = render(
);
await new Promise(resolve => setTimeout(resolve));
expect(dataProvider.getOne).toHaveBeenCalledTimes(0);
rerender(
);
await new Promise(resolve => setTimeout(resolve));
expect(dataProvider.getOne).toHaveBeenCalledTimes(1);
});
it('should not call dataProvider.getOne() on update', async () => {
const { rerender } = render(
);
await new Promise(resolve => setTimeout(resolve));
expect(dataProvider.getOne).toHaveBeenCalledTimes(1);
rerender(
);
await new Promise(resolve => setTimeout(resolve));
expect(dataProvider.getOne).toHaveBeenCalledTimes(1);
});
it('should recall dataProvider.getOne() when id changes', async () => {
const { rerender } = render(
);
await waitFor(() => {
expect(dataProvider.getOne).toHaveBeenCalledTimes(1);
});
rerender(
);
await waitFor(() => {
expect(dataProvider.getOne).toHaveBeenCalledTimes(2);
});
});
it('should recall dataProvider.getOne() when resource changes', async () => {
const { rerender } = render(
);
await waitFor(() => {
expect(dataProvider.getOne).toHaveBeenCalledTimes(1);
});
rerender(
);
await waitFor(() => {
expect(dataProvider.getOne).toHaveBeenCalledTimes(2);
});
});
it('should accept a meta parameter', async () => {
render(
);
await waitFor(() => {
expect(dataProvider.getOne).toHaveBeenCalledTimes(1);
expect(dataProvider.getOne).toHaveBeenCalledWith('posts', {
id: 1,
meta: { hello: 'world' },
});
});
});
it('should set the error state when the dataProvider fails', async () => {
jest.spyOn(console, 'error').mockImplementation(() => {});
const hookValue = jest.fn();
const dataProvider = testDataProvider({
getOne: jest.fn().mockRejectedValue(new Error('failed')),
});
render(
);
expect(hookValue).toHaveBeenCalledWith(
expect.objectContaining({
error: null,
})
);
await waitFor(() => {
expect(dataProvider.getOne).toHaveBeenCalledTimes(1);
});
expect(hookValue).toHaveBeenCalledWith(
expect.objectContaining({
error: new Error('failed'),
})
);
});
it('should execute success side effects on success', async () => {
const onSuccess = jest.fn();
render(
);
await waitFor(() => {
expect(dataProvider.getOne).toHaveBeenCalledTimes(1);
expect(onSuccess).toHaveBeenCalledWith({ id: 1, title: 'foo' });
});
});
it('should execute error side effects on failure', async () => {
jest.spyOn(console, 'error').mockImplementationOnce(() => {});
const dataProvider = testDataProvider({
getOne: jest.fn().mockRejectedValue(new Error('failed')),
});
const onError = jest.fn();
render(
);
await waitFor(() => {
expect(dataProvider.getOne).toHaveBeenCalledTimes(1);
expect(onError).toHaveBeenCalledWith(new Error('failed'));
});
});
});