import * as React from 'react';
import { render, waitFor } from '@testing-library/react';
import expect from 'expect';
import { testDataProvider } from './testDataProvider';
import { CoreAdminContext } from '../core';
import { useUpdateMany } from './useUpdateMany';
import { QueryClient } from 'react-query';
describe('useUpdateMany', () => {
it('returns a callback that can be used with update arguments', async () => {
const dataProvider = testDataProvider({
updateMany: jest.fn(() => Promise.resolve({ data: [1, 2] } as any)),
});
let localUpdateMany;
const Dummy = () => {
const [updateMany] = useUpdateMany();
localUpdateMany = updateMany;
return ;
};
render(
);
localUpdateMany('foo', { ids: [1, 2], data: { bar: 'baz' } });
await waitFor(() => {
expect(dataProvider.updateMany).toHaveBeenCalledWith('foo', {
ids: [1, 2],
data: { bar: 'baz' },
});
});
});
it('returns a callback that can be used with no arguments', async () => {
const dataProvider = testDataProvider({
updateMany: jest.fn(() => Promise.resolve({ data: [1, 2] } as any)),
});
let localUpdateMany;
const Dummy = () => {
const [updateMany] = useUpdateMany('foo', {
ids: [1, 2],
data: { bar: 'baz' },
});
localUpdateMany = updateMany;
return ;
};
render(
);
localUpdateMany();
await waitFor(() => {
expect(dataProvider.updateMany).toHaveBeenCalledWith('foo', {
ids: [1, 2],
data: { bar: 'baz' },
});
});
});
it('uses callback call time params rather than hook call time params', async () => {
const dataProvider = testDataProvider({
updateMany: jest.fn(() => Promise.resolve({ data: [1, 2] } as any)),
});
let localUpdateMany;
const Dummy = () => {
const [updateMany] = useUpdateMany('foo', {
ids: [1, 2],
data: { bar: 'baz' },
});
localUpdateMany = updateMany;
return ;
};
render(
);
localUpdateMany('foo', { data: { foo: 456 } });
await waitFor(() => {
expect(dataProvider.updateMany).toHaveBeenCalledWith('foo', {
ids: [1, 2],
data: { foo: 456 },
});
});
});
it('accepts a meta parameter', async () => {
const dataProvider = testDataProvider({
updateMany: jest.fn(() => Promise.resolve({ data: [1, 2] } as any)),
});
let localUpdateMany;
const Dummy = () => {
const [updateMany] = useUpdateMany();
localUpdateMany = updateMany;
return ;
};
render(
);
localUpdateMany('foo', {
ids: [1, 2],
data: { bar: 'baz' },
meta: { hello: 'world' },
});
await waitFor(() => {
expect(dataProvider.updateMany).toHaveBeenCalledWith('foo', {
ids: [1, 2],
data: { bar: 'baz' },
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' },
],
total: 2,
});
const dataProvider = {
updateMany: jest.fn(() =>
Promise.resolve({ data: [1, 2] } as any)
),
} as any;
let localUpdateMany;
const Dummy = () => {
const [updateMany] = useUpdateMany('foo', {
ids: [1, 2],
data: { bar: 'baz' },
});
localUpdateMany = updateMany;
return ;
};
render(
);
localUpdateMany('foo', { ids: [1, 2], data: { bar: 'baz' } });
await waitFor(() => {
expect(dataProvider.updateMany).toHaveBeenCalledWith('foo', {
ids: [1, 2],
data: { bar: 'baz' },
});
});
await waitFor(() => {
expect(queryClient.getQueryData(['foo', 'getList'])).toEqual({
data: [
{ id: 1, bar: 'baz' },
{ id: 2, bar: 'baz' },
],
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' },
],
pageInfo: {
hasPreviousPage: false,
hasNextPage: true,
},
});
const dataProvider = {
updateMany: jest.fn(() =>
Promise.resolve({ data: [1, 2] } as any)
),
} as any;
let localUpdateMany;
const Dummy = () => {
const [updateMany] = useUpdateMany('foo', {
ids: [1, 2],
data: { bar: 'baz' },
});
localUpdateMany = updateMany;
return ;
};
render(
);
localUpdateMany('foo', { ids: [1, 2], data: { bar: 'baz' } });
await waitFor(() => {
expect(dataProvider.updateMany).toHaveBeenCalledWith('foo', {
ids: [1, 2],
data: { bar: 'baz' },
});
});
await waitFor(() => {
expect(queryClient.getQueryData(['foo', 'getList'])).toEqual({
data: [
{ id: 1, bar: 'baz' },
{ id: 2, bar: 'baz' },
],
pageInfo: {
hasPreviousPage: false,
hasNextPage: true,
},
});
});
});
});
});