|
1 | 1 | /* eslint-disable react/no-render-return-value, max-classes-per-file, func-names, no-console */
|
2 |
| -import { render } from '@testing-library/react'; |
| 2 | +import { fireEvent, render } from '@testing-library/react'; |
3 | 3 | import type { ReactWrapper } from 'enzyme';
|
4 | 4 | import { mount } from 'enzyme';
|
| 5 | +import { Provider } from 'rc-motion'; |
5 | 6 | import KeyCode from 'rc-util/lib/KeyCode';
|
6 | 7 | import React, { cloneElement, useEffect } from 'react';
|
7 | 8 | import { act } from 'react-dom/test-utils';
|
8 | 9 | import type { DialogProps } from '../src';
|
9 | 10 | import Dialog from '../src';
|
10 | 11 |
|
11 | 12 | describe('dialog', () => {
|
| 13 | + async function runFakeTimer() { |
| 14 | + for (let i = 0; i < 100; i += 1) { |
| 15 | + await act(async () => { |
| 16 | + jest.advanceTimersByTime(100); |
| 17 | + await Promise.resolve(); |
| 18 | + }); |
| 19 | + } |
| 20 | + } |
| 21 | + |
12 | 22 | beforeEach(() => {
|
13 | 23 | jest.useFakeTimers();
|
14 | 24 | });
|
15 | 25 |
|
16 | 26 | afterEach(() => {
|
| 27 | + jest.clearAllTimers(); |
17 | 28 | jest.useRealTimers();
|
18 | 29 | });
|
19 | 30 |
|
@@ -251,15 +262,17 @@ describe('dialog', () => {
|
251 | 262 | });
|
252 | 263 |
|
253 | 264 | it('trap focus after shift-tabbing', () => {
|
254 |
| - const wrapper = mount(<Dialog visible />, { attachTo: document.body }); |
255 |
| - wrapper.find('.rc-dialog-wrap').simulate('keyDown', { |
| 265 | + render(<Dialog visible />); |
| 266 | + |
| 267 | + document.querySelector<HTMLDivElement>('.rc-dialog > div').focus(); |
| 268 | + |
| 269 | + fireEvent.keyDown(document.querySelector('.rc-dialog-wrap'), { |
256 | 270 | keyCode: KeyCode.TAB,
|
| 271 | + key: 'Tab', |
257 | 272 | shiftKey: true,
|
258 | 273 | });
|
259 |
| - const sentinelEnd = document.querySelectorAll('.rc-dialog-content + div')[0]; |
| 274 | + const sentinelEnd = document.querySelector('.rc-dialog-content + div'); |
260 | 275 | expect(document.activeElement).toBe(sentinelEnd);
|
261 |
| - |
262 |
| - wrapper.unmount(); |
263 | 276 | });
|
264 | 277 | });
|
265 | 278 |
|
@@ -506,15 +519,32 @@ describe('dialog', () => {
|
506 | 519 | });
|
507 | 520 |
|
508 | 521 | describe('afterOpenChange', () => {
|
509 |
| - it('should trigger afterOpenChange when visible changed', () => { |
| 522 | + beforeEach(() => { |
| 523 | + jest.useFakeTimers(); |
| 524 | + }); |
| 525 | + |
| 526 | + afterEach(() => { |
| 527 | + jest.clearAllTimers(); |
| 528 | + jest.useRealTimers(); |
| 529 | + }); |
| 530 | + |
| 531 | + it('should trigger afterOpenChange when visible changed', async () => { |
510 | 532 | const afterOpenChange = jest.fn();
|
511 | 533 |
|
512 |
| - const wrapper = mount(<Dialog afterOpenChange={afterOpenChange} visible />); |
513 |
| - jest.runAllTimers(); |
| 534 | + const Demo = (props: any) => ( |
| 535 | + <Provider motion={false}> |
| 536 | + <Dialog afterOpenChange={afterOpenChange} {...props} /> |
| 537 | + </Provider> |
| 538 | + ); |
514 | 539 |
|
515 |
| - wrapper.setProps({ visible: false }); |
516 |
| - jest.runAllTimers(); |
| 540 | + const { rerender } = render(<Demo visible />); |
| 541 | + await runFakeTimer(); |
| 542 | + expect(afterOpenChange).toHaveBeenCalledWith(true); |
| 543 | + expect(afterOpenChange).toHaveBeenCalledTimes(1); |
517 | 544 |
|
| 545 | + rerender(<Demo />); |
| 546 | + await runFakeTimer(); |
| 547 | + expect(afterOpenChange).toHaveBeenCalledWith(false); |
518 | 548 | expect(afterOpenChange).toHaveBeenCalledTimes(2);
|
519 | 549 | });
|
520 | 550 | });
|
|
0 commit comments