Skip to content

Commit 463253d

Browse files
committed
chore: support for react suspense
1 parent 92a9626 commit 463253d

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

src/__tests__/react-suspense.test.tsx

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import * as React from 'react';
2+
import { View } from 'react-native';
3+
import { render, screen, within, configure } from '..';
4+
import TestRenderer, { type ReactTestRenderer } from 'react-test-renderer';
5+
6+
configure({
7+
asyncUtilTimeout: 5000,
8+
});
9+
10+
function wait(delay: number) {
11+
return new Promise<void>((resolve) =>
12+
setTimeout(() => {
13+
resolve();
14+
}, delay),
15+
);
16+
}
17+
18+
function Suspendable<T>({ promise }: { promise: Promise<T> }) {
19+
React.use(promise);
20+
return <View testID="test" />;
21+
}
22+
23+
test('render supports components which can suspend', async () => {
24+
render(
25+
<View>
26+
<React.Suspense fallback={<View testID="fallback" />}>
27+
<Suspendable promise={wait(100)} />
28+
</React.Suspense>
29+
</View>,
30+
);
31+
32+
expect(screen.getByTestId('fallback')).toBeOnTheScreen();
33+
34+
// eslint-disable-next-line require-await
35+
await React.act(async () => {
36+
await wait(1000);
37+
});
38+
39+
expect(await screen.findByTestId('test')).toBeOnTheScreen();
40+
});
41+
42+
test.only('react test renderer supports components which can suspend', async () => {
43+
let renderer: ReactTestRenderer;
44+
45+
// eslint-disable-next-line require-await
46+
await React.act(async () => {
47+
renderer = TestRenderer.create(
48+
<View>
49+
<React.Suspense fallback={<View testID="fallback" />}>
50+
<Suspendable promise={wait(100)} />
51+
</React.Suspense>
52+
</View>,
53+
);
54+
});
55+
56+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
57+
const view = within(renderer!.root);
58+
59+
expect(view.getByTestId('fallback')).toBeDefined();
60+
expect(await view.findByTestId('test')).toBeDefined();
61+
});
62+
63+
test.only('react test renderer supports components which can suspend 500', async () => {
64+
let renderer: ReactTestRenderer;
65+
66+
// eslint-disable-next-line require-await
67+
await React.act(async () => {
68+
renderer = TestRenderer.create(
69+
<View>
70+
<React.Suspense fallback={<View testID="fallback" />}>
71+
<Suspendable promise={wait(500)} />
72+
</React.Suspense>
73+
</View>,
74+
);
75+
});
76+
77+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
78+
const view = within(renderer!.root);
79+
80+
expect(view.getByTestId('fallback')).toBeDefined();
81+
expect(await view.findByTestId('test')).toBeDefined();
82+
});
83+
84+
test.only('react test renderer supports components which can suspend 1000ms', async () => {
85+
let renderer: ReactTestRenderer;
86+
87+
// eslint-disable-next-line require-await
88+
await React.act(async () => {
89+
renderer = TestRenderer.create(
90+
<View>
91+
<React.Suspense fallback={<View testID="fallback" />}>
92+
<Suspendable promise={wait(1000)} />
93+
</React.Suspense>
94+
</View>,
95+
);
96+
});
97+
98+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
99+
const view = within(renderer!.root);
100+
101+
expect(view.getByTestId('fallback')).toBeDefined();
102+
expect(await view.findByTestId('test', undefined, { timeout: 5000 })).toBeDefined();
103+
});

0 commit comments

Comments
 (0)