import * as React from 'react';
import { waitFor, render } from '@testing-library/react';
import expect from 'expect';
import { CoreAdminContext } from '../core';
import { testDataProvider } from './testDataProvider';
import { useDeleteMany } from './useDeleteMany';
import { QueryClient } from 'react-query';
describe('useDeleteMany', () => {
it('returns a callback that can be used with update arguments', async () => {
const dataProvider = testDataProvider({
deleteMany: jest.fn(() => Promise.resolve({ data: [1, 2] } as any)),
});
let localDeleteMany;
const Dummy = () => {
const [deleteMany] = useDeleteMany();
localDeleteMany = deleteMany;
return ;
};
render(
);
localDeleteMany('foo', { ids: [1, 2] });
await waitFor(() => {
expect(dataProvider.deleteMany).toHaveBeenCalledWith('foo', {
ids: [1, 2],
});
});
});
it('returns a callback that can be used with no arguments', async () => {
const dataProvider = testDataProvider({
deleteMany: jest.fn(() => Promise.resolve({ data: [1, 2] } as any)),
});
let localDeleteMany;
const Dummy = () => {
const [deleteMany] = useDeleteMany('foo', { ids: [1, 2] });
localDeleteMany = deleteMany;
return ;
};
render(
);
localDeleteMany();
await waitFor(() => {
expect(dataProvider.deleteMany).toHaveBeenCalledWith('foo', {
ids: [1, 2],
});
});
});
it('uses call time params over hook time params', async () => {
const dataProvider = testDataProvider({
deleteMany: jest.fn(() => Promise.resolve({ data: [1, 2] } as any)),
});
let localDeleteMany;
const Dummy = () => {
const [deleteMany] = useDeleteMany('foo', { ids: [1, 2] });
localDeleteMany = deleteMany;
return ;
};
render(
);
localDeleteMany('foo', { ids: [3, 4] });
await waitFor(() => {
expect(dataProvider.deleteMany).toHaveBeenCalledWith('foo', {
ids: [3, 4],
});
});
});
it('accepts a meta parameter', async () => {
const dataProvider = testDataProvider({
deleteMany: jest.fn(() => Promise.resolve({ data: [1, 2] } as any)),
});
let localDeleteMany;
const Dummy = () => {
const [deleteMany] = useDeleteMany();
localDeleteMany = deleteMany;
return ;
};
render(
);
localDeleteMany('foo', { ids: [1, 2], meta: { hello: 'world' } });
await waitFor(() => {
expect(dataProvider.deleteMany).toHaveBeenCalledWith('foo', {
ids: [1, 2],
meta: { hello: 'world' },
});
});
});
describe('query cache', () => {
it('updates getList query cache when dataProvider promise resolves', async () => {
const queryClient = new QueryClient();
queryClient.setQueryData(['foo', 'getList'], {
data: [
{ id: 1, bar: 'bar' },
{ id: 2, bar: 'bar' },
{ id: 3, bar: 'bar' },
{ id: 4, bar: 'bar' },
],
total: 4,
});
const dataProvider = {
deleteMany: jest.fn(() =>
Promise.resolve({ data: [1, 2] } as any)
),
} as any;
let localDeleteMany;
const Dummy = () => {
const [deleteMany] = useDeleteMany();
localDeleteMany = deleteMany;
return ;
};
render(
);
localDeleteMany('foo', { ids: [1, 2] });
await waitFor(() => {
expect(dataProvider.deleteMany).toHaveBeenCalledWith('foo', {
ids: [1, 2],
});
});
await waitFor(() => {
expect(queryClient.getQueryData(['foo', 'getList'])).toEqual({
data: [
{ id: 3, bar: 'bar' },
{ id: 4, bar: 'bar' },
],
total: 2,
});
});
});
it('updates getList query cache with pageInfo when dataProvider promise resolves', async () => {
const queryClient = new QueryClient();
queryClient.setQueryData(['foo', 'getList'], {
data: [
{ id: 1, bar: 'bar' },
{ id: 2, bar: 'bar' },
{ id: 3, bar: 'bar' },
{ id: 4, bar: 'bar' },
],
pageInfo: {
hasPreviousPage: false,
hasNextPage: true,
},
});
const dataProvider = {
deleteMany: jest.fn(() =>
Promise.resolve({ data: [1, 2] } as any)
),
} as any;
let localDeleteMany;
const Dummy = () => {
const [deleteMany] = useDeleteMany();
localDeleteMany = deleteMany;
return ;
};
render(
);
localDeleteMany('foo', { ids: [1, 2] });
await waitFor(() => {
expect(dataProvider.deleteMany).toHaveBeenCalledWith('foo', {
ids: [1, 2],
});
});
await waitFor(() => {
expect(queryClient.getQueryData(['foo', 'getList'])).toEqual({
data: [
{ id: 3, bar: 'bar' },
{ id: 4, bar: 'bar' },
],
pageInfo: {
hasPreviousPage: false,
hasNextPage: true,
},
});
});
});
});
});