forked from ant-design/pro-components
-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.ts
93 lines (84 loc) · 2.47 KB
/
util.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import { waitFor } from '@testing-library/react';
export const waitTimePromise = async (time: number = 100) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(true);
}, time);
});
};
export const waitForWaitTime = async (time: number = 100) => {
await waitFor(
async () => {
return waitTimePromise(time);
},
{
timeout: time + 100,
},
);
return;
};
export const waitTime = async (time: number = 100) => {
await waitTimePromise(time);
};
export const resizeWindow = (x: number, y: number) => {
// @ts-ignore
window.innerWidth = x;
// @ts-ignore
window.innerHeight = y;
window.dispatchEvent(new Event('resize'));
};
/* eslint-disable no-param-reassign */
const NO_EXIST = { __NOT_EXIST: true };
export function spyElementPrototypes(
Element: { prototype: Record<string, any> },
properties: { [x: string]: any; [x: number]: any },
) {
const propNames = Object.keys(properties);
const originDescriptors = {} as Record<string, any> as Record<string, any>;
propNames.forEach((propName) => {
const originDescriptor = Object.getOwnPropertyDescriptor(
Element.prototype,
propName,
);
originDescriptors[propName] = originDescriptor || NO_EXIST;
const spyProp = properties[propName];
if (typeof spyProp === 'function') {
// If is a function
Element.prototype[propName] = function spyFunc(...args: any[]) {
return spyProp.call(this, originDescriptor, ...args);
};
} else {
// Otherwise tread as a property
Object.defineProperty(Element.prototype, propName, {
...spyProp,
set(value) {
if (spyProp.set) {
return spyProp.set.call(this, originDescriptor, value);
}
return originDescriptor?.set?.(value);
},
get() {
if (spyProp.get) {
return spyProp.get.call(this, originDescriptor);
}
return originDescriptor?.get?.();
},
configurable: true,
});
}
});
return {
mockRestore() {
propNames.forEach((propName) => {
const originDescriptor = originDescriptors[propName];
if (originDescriptor === NO_EXIST) {
delete Element.prototype[propName];
} else if (typeof originDescriptor === 'function') {
Element.prototype[propName] = originDescriptor;
} else {
Object.defineProperty(Element.prototype, propName, originDescriptor);
}
});
},
};
}