Skip to content

Commit 868a6ad

Browse files
committed
test: add test case
1 parent 7f8d578 commit 868a6ad

File tree

2 files changed

+102
-60
lines changed

2 files changed

+102
-60
lines changed

tests/perf.test.jsx

Lines changed: 0 additions & 60 deletions
This file was deleted.

tests/perf.test.tsx

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import { cleanup, fireEvent, render } from '@testing-library/react';
2+
import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook';
3+
import React from 'react';
4+
import Trigger, { type TriggerProps } from '../src';
5+
import { awaitFakeTimer, placementAlignMap } from './util';
6+
7+
jest.mock('../src/Popup', () => {
8+
const OriReact = jest.requireActual('react');
9+
const OriPopup = jest.requireActual('../src/Popup').default;
10+
11+
return OriReact.forwardRef((props, ref) => {
12+
global.popupCalledTimes = (global.popupCalledTimes || 0) + 1;
13+
return <OriPopup {...props} ref={ref} />;
14+
});
15+
});
16+
17+
describe('Trigger.Basic', () => {
18+
beforeAll(() => {
19+
spyElementPrototypes(HTMLElement, {
20+
offsetParent: {
21+
get: () => document.body,
22+
},
23+
});
24+
});
25+
26+
beforeEach(() => {
27+
global.popupCalledTimes = 0;
28+
jest.useFakeTimers();
29+
});
30+
31+
afterEach(() => {
32+
cleanup();
33+
jest.useRealTimers();
34+
});
35+
36+
async function trigger(dom: HTMLElement, selector: string, method = 'click') {
37+
fireEvent[method](dom.querySelector(selector));
38+
await awaitFakeTimer();
39+
}
40+
41+
const renderTrigger = (props?: Partial<TriggerProps>) => (
42+
<Trigger
43+
action={['click']}
44+
popupAlign={placementAlignMap.left}
45+
popup={<strong className="x-content">tooltip2</strong>}
46+
{...props}
47+
>
48+
<div className="target">click</div>
49+
</Trigger>
50+
);
51+
52+
describe('Performance', () => {
53+
it('not create Popup when !open', async () => {
54+
const { container } = render(renderTrigger());
55+
56+
// Not render Popup
57+
await awaitFakeTimer();
58+
expect(global.popupCalledTimes).toBe(0);
59+
60+
// Now can render Popup
61+
await trigger(container, '.target');
62+
expect(global.popupCalledTimes).toBeGreaterThan(0);
63+
64+
expect(document.querySelector('.rc-trigger-popup')).toBeTruthy();
65+
});
66+
67+
it('forceRender should create when !open', async () => {
68+
const { container } = render(
69+
renderTrigger({
70+
forceRender: true,
71+
}),
72+
);
73+
74+
await awaitFakeTimer();
75+
await trigger(container, '.target');
76+
expect(global.popupCalledTimes).toBeGreaterThan(0);
77+
78+
expect(document.querySelector('.rc-trigger-popup')).toBeTruthy();
79+
});
80+
81+
it('hide should keep render Popup', async () => {
82+
const { rerender } = render(
83+
renderTrigger({
84+
popupVisible: true,
85+
}),
86+
);
87+
88+
await awaitFakeTimer();
89+
expect(global.popupCalledTimes).toBeGreaterThan(0);
90+
91+
// Hide
92+
global.popupCalledTimes = 0;
93+
rerender(
94+
renderTrigger({
95+
popupVisible: false,
96+
}),
97+
);
98+
await awaitFakeTimer();
99+
expect(global.popupCalledTimes).toBeGreaterThan(0);
100+
});
101+
});
102+
});

0 commit comments

Comments
 (0)