import * as React from 'react';
import { render, waitFor } from '@testing-library/react';
import expect from 'expect';
import { RaRecord } from '../types';
import { testDataProvider } from './testDataProvider';
import { useCreate } from './useCreate';
import { CoreAdminContext } from '../core';
describe('useCreate', () => {
it('returns a callback that can be used with create arguments', async () => {
const dataProvider = testDataProvider({
create: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)),
});
let localCreate;
const Dummy = () => {
const [create] = useCreate();
localCreate = create;
return ;
};
render(
);
localCreate('foo', { data: { bar: 'baz' } });
await waitFor(() => {
expect(dataProvider.create).toHaveBeenCalledWith('foo', {
data: { bar: 'baz' },
});
});
});
it('returns a callback that can be used with no arguments', async () => {
const dataProvider = testDataProvider({
create: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)),
});
let localCreate;
const Dummy = () => {
const [create] = useCreate('foo', { data: { bar: 'baz' } });
localCreate = create;
return ;
};
render(
);
localCreate();
await waitFor(() => {
expect(dataProvider.create).toHaveBeenCalledWith('foo', {
data: { bar: 'baz' },
});
});
});
it('uses call time params over hook time params', async () => {
const dataProvider = testDataProvider({
create: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)),
});
let localCreate;
const Dummy = () => {
const [create] = useCreate('foo', { data: { bar: 'baz' } });
localCreate = create;
return ;
};
render(
);
localCreate('foo', { data: { foo: 456 } });
await waitFor(() => {
expect(dataProvider.create).toHaveBeenCalledWith('foo', {
data: { foo: 456 },
});
});
});
it('accepts a meta paramater', async () => {
const dataProvider = testDataProvider({
create: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)),
});
let localCreate;
const Dummy = () => {
const [create] = useCreate();
localCreate = create;
return ;
};
render(
);
localCreate('foo', { data: { bar: 'baz' }, meta: { hello: 'world' } });
await waitFor(() => {
expect(dataProvider.create).toHaveBeenCalledWith('foo', {
data: { bar: 'baz' },
meta: { hello: 'world' },
});
});
});
it('returns a state typed based on the parametric type', async () => {
interface Product extends RaRecord {
sku: string;
}
const dataProvider = testDataProvider({
create: jest.fn(() =>
Promise.resolve({ data: { id: 1, sku: 'abc' } } as any)
),
});
let localCreate;
let sku;
const Dummy = () => {
const [create, { data }] = useCreate();
localCreate = create;
sku = data && data.sku;
return ;
};
render(
);
expect(sku).toBeUndefined();
localCreate('products', { data: { sku: 'abc' } });
await waitFor(() => {
expect(sku).toEqual('abc');
});
});
});