import React from 'react';
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import {
SaveContextProvider,
useMutationMiddlewares,
useRegisterMutationMiddleware,
} from '../..';
describe('useRegisterMutationMiddleware', () => {
it('should register and unregister middlewares correctly', async () => {
const middleware = jest.fn((next: () => void) => next());
const save = jest.fn();
const Middleware = () => {
useRegisterMutationMiddleware(middleware);
return null;
};
const Parent = () => {
const [mount, setMount] = React.useState(true);
const middlewaresFunctions = useMutationMiddlewares();
return (
{mount && }
);
};
render();
fireEvent.click(screen.getByText('Save'));
await waitFor(() => {
expect(save).toHaveBeenCalledTimes(1);
});
expect(middleware).toHaveBeenCalledTimes(1);
save.mockClear();
middleware.mockClear();
fireEvent.click(screen.getByText('Toggle middleware'));
fireEvent.click(screen.getByText('Save'));
await waitFor(() => {
expect(save).toHaveBeenCalledTimes(1);
});
expect(middleware).not.toHaveBeenCalled();
});
it('should execute middlewares registered even if they have been unregistered as an optimistic side effect', async () => {
const middleware = jest.fn((next: () => void) => next());
const save = jest.fn();
const Middleware = () => {
useRegisterMutationMiddleware(middleware);
return Middleware;
};
const Parent = () => {
const [mount, setMount] = React.useState(true);
const middlewaresFunctions = useMutationMiddlewares();
return (
{mount && }
);
};
render();
fireEvent.click(screen.getByText('Save'));
await waitFor(() => {
expect(screen.queryByText('Middleware')).toBeNull();
expect(save).not.toHaveBeenCalled();
});
await waitFor(() => {
expect(save).toHaveBeenCalledTimes(1);
});
expect(middleware).toHaveBeenCalledTimes(1);
});
});