import React, { TransitionEventHandler } from 'react';
import { render, waitFor } from '@testing-library/react';
import { waitForTransition } from '.';
const renderTransitionElement = (
shouldEnter: boolean,
onTransitionEnd: TransitionEventHandler,
) => {
const result = render(
{shouldEnter.toString()}
,
);
const rerender = (
shouldEnter: boolean,
onTransitionEnd: TransitionEventHandler,
) =>
result.rerender(
{shouldEnter.toString()}
,
);
return {
...result,
rerender,
};
};
describe('packages/testing-lib/waitForTransition', () => {
describe('triggers css transition handlers', () => {
test('on enter transition', async () => {
const onTransition = jest.fn();
const renderResult = renderTransitionElement(false, onTransition);
const testDiv = await renderResult.findByTestId('test-div');
/** ENTER */
renderResult.rerender(true, onTransition);
// onEnter will be called immediately
await waitFor(() => {
// onEntering will be called after a timeout
// but onTransition is not called until CSS transitions are finished
expect(onTransition).not.toHaveBeenCalled();
});
await waitForTransition(testDiv);
// onTransition is finally called after we wait for the transition
expect(onTransition).toHaveBeenCalledTimes(1);
});
test('on exit transition', async () => {
const onTransition = jest.fn();
const renderResult = renderTransitionElement(false, onTransition);
const testDiv = await renderResult.findByTestId('test-div');
/** ENTER */
renderResult.rerender(true, onTransition);
await waitForTransition(testDiv);
/** EXIT */
renderResult.rerender(false, onTransition);
// onExit will be called immediately
await waitFor(() => {
// onExiting will be called after a timeout
// but onExited is not called until CSS transitions are finished
expect(onTransition).toHaveBeenCalledTimes(1);
});
await waitForTransition(testDiv);
// onTransition is finally called after we wait for the transition
expect(onTransition).toHaveBeenCalledTimes(2);
});
});
});