Skip to content

Commit 8686fc8

Browse files
pierrezimmermannbammdjastrzebski
authored andcommitted
refactor: extract async wrapper from waitFor implem
1 parent e1516c2 commit 8686fc8

File tree

2 files changed

+41
-9
lines changed

2 files changed

+41
-9
lines changed

src/user-event/utils/asyncWrapper.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { act } from 'react-test-renderer';
2+
import { getIsReactActEnvironment, setReactActEnvironment } from '../../act';
3+
import { flushMicroTasksLegacy } from '../../flush-micro-tasks';
4+
import { checkReactVersionAtLeast } from '../../react-versions';
5+
6+
export const asyncWrapper = async <T>(
7+
callback: () => Promise<T>
8+
): Promise<T> => {
9+
if (checkReactVersionAtLeast(18, 0)) {
10+
const previousActEnvironment = getIsReactActEnvironment();
11+
setReactActEnvironment(false);
12+
13+
try {
14+
const result = await callback();
15+
// Flush the microtask queue before restoring the `act` environment
16+
await flushMicroTasksLegacy();
17+
return result;
18+
} finally {
19+
setReactActEnvironment(previousActEnvironment);
20+
}
21+
}
22+
23+
if (!checkReactVersionAtLeast(16, 9)) {
24+
return callback();
25+
}
26+
27+
let result: T;
28+
29+
await act(async () => {
30+
result = await callback();
31+
});
32+
33+
// Either we have result or `waitFor` threw error
34+
return result!;
35+
};

src/user-event/utils/wait.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import act from '../../act';
21
import { UserEventConfig } from '../setup';
32

43
export function wait(config: UserEventConfig, durationInMs?: number) {
@@ -7,12 +6,10 @@ export function wait(config: UserEventConfig, durationInMs?: number) {
76
return;
87
}
98

10-
return act(async () => {
11-
await Promise.all([
12-
new Promise<void>((resolve) =>
13-
globalThis.setTimeout(() => resolve(), delay)
14-
),
15-
config.advanceTimers(delay),
16-
]);
17-
});
9+
return Promise.all([
10+
new Promise<void>((resolve) =>
11+
globalThis.setTimeout(() => resolve(), delay)
12+
),
13+
config.advanceTimers(delay),
14+
]);
1815
}

0 commit comments

Comments
 (0)