Skip to content

Commit 46ec71b

Browse files
committed
render async
1 parent 93122ba commit 46ec71b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+630
-677
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
"typecheck": "tsc",
3131
"lint": "eslint src --cache",
3232
"validate": "yarn prettier && yarn lint && yarn typecheck && yarn test",
33-
"validate:write": "yarn prettier:write && yarn lint --fix && yarn typecheck && yarn test",
33+
"validate:write": "yarn prettier:write && yarn lint --fix && yarn typecheck && yarn test -u",
3434
"build:js": "babel src --out-dir build --extensions \".js,.ts,.jsx,.tsx\" --source-maps --ignore \"**/__tests__/**\"",
3535
"build:ts": "tsc --build tsconfig.release.json",
3636
"build": "yarn clean && yarn build:js && yarn build:ts",

src/__tests__/act.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ test('render should trigger useEffect', async () => {
2626
test('rerender should trigger useEffect', async () => {
2727
const effectCallback = jest.fn();
2828
await render(<UseEffect callback={effectCallback} />);
29-
await screen.rerenderAsync(<UseEffect callback={effectCallback} />);
29+
await screen.rerender(<UseEffect callback={effectCallback} />);
3030

3131
expect(effectCallback).toHaveBeenCalledTimes(2);
3232
});

src/__tests__/__snapshots__/render.test.tsx.snap renamed to src/__tests__/deprecated/__snapshots__/render-sync.test.tsx.snap

File renamed without changes.

src/__tests__/deprecated/fire-event-sync.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ test('should handle unmounted elements gracefully', async () => {
567567
);
568568

569569
const element = screen.getByText('Test');
570-
await screen.unmountAsync();
570+
await screen.unmount();
571571

572572
// Firing event on unmounted element should not crash
573573
deprecated_fireEventSync.press(element);

src/__tests__/deprecated/render.test.tsx renamed to src/__tests__/deprecated/render-sync.test.tsx

Lines changed: 8 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import * as React from 'react';
22
import { Pressable, Text, TextInput, View } from 'react-native';
33

4-
import type { RenderAPI } from '../..';
54
import { deprecated_renderSync, fireEvent, screen } from '../..';
65

76
const PLACEHOLDER_FRESHNESS = 'Add custom freshness';
@@ -87,14 +86,14 @@ test('rerender', async () => {
8786
await fireEvent.press(screen.getByText('Change freshness!'));
8887
expect(fn).toHaveBeenCalledTimes(1);
8988

90-
screen.rerender(<Banana onUpdate={fn} />);
89+
void screen.rerender(<Banana onUpdate={fn} />);
9190
expect(fn).toHaveBeenCalledTimes(2);
9291
});
9392

9493
test('unmount', () => {
9594
const fn = jest.fn();
9695
deprecated_renderSync(<Banana onUnmount={fn} />);
97-
screen.unmount();
96+
void screen.unmount();
9897
expect(fn).toHaveBeenCalled();
9998
});
10099

@@ -107,7 +106,7 @@ test('unmount should handle cleanup functions', () => {
107106

108107
deprecated_renderSync(<Component />);
109108

110-
screen.unmount();
109+
void screen.unmount();
111110

112111
expect(cleanup).toHaveBeenCalledTimes(1);
113112
});
@@ -149,7 +148,7 @@ test('renders options.wrapper around updated node', () => {
149148
wrapper: WrapperComponent,
150149
});
151150

152-
screen.rerender(<View testID="inner" accessibilityLabel="test" accessibilityHint="test" />);
151+
void screen.rerender(<View testID="inner" accessibilityLabel="test" accessibilityHint="test" />);
153152

154153
expect(screen.getByTestId('wrapper')).toBeTruthy();
155154
expect(screen).toMatchInlineSnapshot(`
@@ -174,8 +173,10 @@ test('returns host root', () => {
174173
});
175174

176175
test('RenderAPI type', () => {
177-
deprecated_renderSync(<Banana />) as RenderAPI;
178-
expect(true).toBeTruthy();
176+
// This test verifies that deprecated_renderSync returns a compatible type
177+
// Note: deprecated_renderSync has different method signatures (sync vs async)
178+
const result = deprecated_renderSync(<Banana />);
179+
expect(result).toBeTruthy();
179180
});
180181

181182
test('returned output can be spread using rest operator', () => {
@@ -184,30 +185,3 @@ test('returned output can be spread using rest operator', () => {
184185
const { rerender, ...rest } = deprecated_renderSync(<View testID="test" />);
185186
expect(rest).toBeTruthy();
186187
});
187-
188-
test('rerenderAsync updates the component asynchronously', async () => {
189-
const fn = jest.fn();
190-
const result = deprecated_renderSync(<Banana onUpdate={fn} />);
191-
192-
await result.rerenderAsync(<Banana onUpdate={fn} />);
193-
194-
expect(fn).toHaveBeenCalledTimes(1);
195-
});
196-
197-
test('updateAsync is an alias for rerenderAsync', async () => {
198-
const fn = jest.fn();
199-
const result = deprecated_renderSync(<Banana onUpdate={fn} />);
200-
201-
await result.updateAsync(<Banana onUpdate={fn} />);
202-
203-
expect(fn).toHaveBeenCalledTimes(1);
204-
});
205-
206-
test('unmountAsync unmounts the component asynchronously', async () => {
207-
const fn = jest.fn();
208-
const result = deprecated_renderSync(<Banana onUnmount={fn} />);
209-
210-
await result.unmountAsync();
211-
212-
expect(fn).toHaveBeenCalled();
213-
});

src/__tests__/fire-event.test.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ describe('React.Suspense integration', () => {
484484
// Resolve the promise
485485
resolveMockPromise('loaded');
486486
await waitFor(async () => {
487-
await screen.rerenderAsync(
487+
await screen.rerender(
488488
<SuspenseWrapper>
489489
<AsyncComponent onPress={onPressMock} shouldSuspend={false} />
490490
</SuspenseWrapper>,
@@ -547,7 +547,7 @@ describe('React.Suspense integration', () => {
547547
);
548548
}
549549

550-
const { rerenderAsync } = await render(
550+
const { rerender } = await render(
551551
<React.Suspense fallback={<Text>Outer Loading...</Text>}>
552552
<NestedAsync onPress={outerPressMock} shouldSuspend={false} level="Outer" />
553553
<React.Suspense fallback={<Text>Inner Loading...</Text>}>
@@ -567,7 +567,7 @@ describe('React.Suspense integration', () => {
567567
// Resolve inner component
568568
resolveMockPromise('inner-loaded');
569569
await waitFor(async () => {
570-
await rerenderAsync(
570+
await rerender(
571571
<React.Suspense fallback={<Text>Outer Loading...</Text>}>
572572
<NestedAsync onPress={outerPressMock} shouldSuspend={false} level="Outer" />
573573
<React.Suspense fallback={<Text>Inner Loading...</Text>}>
@@ -628,7 +628,7 @@ describe('React.Suspense integration', () => {
628628
expect(onPressMock).toHaveBeenCalled();
629629

630630
// Rerender - now DataComponent should suspend
631-
await screen.rerenderAsync(
631+
await screen.rerender(
632632
<View>
633633
<ButtonComponent />
634634
<React.Suspense fallback={<Text>Loading data...</Text>}>
@@ -651,7 +651,7 @@ test('should handle unmounted elements gracefully in async mode', async () => {
651651
);
652652

653653
const element = screen.getByText('Test');
654-
await screen.unmountAsync();
654+
await screen.unmount();
655655

656656
// Firing async event on unmounted element should not crash
657657
await fireEvent.press(element);

src/__tests__/render.test.tsx

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -54,35 +54,19 @@ test('render with wrapper option', async () => {
5454
expect(screen.getByTestId('inner')).toBeTruthy();
5555
});
5656

57-
test('rerender function throws error when used with render', async () => {
58-
await render(<Banana />);
59-
60-
expect(() => screen.rerender(<Banana />)).toThrowErrorMatchingInlineSnapshot(
61-
`""rerender(...)" is not supported when using "render" use "await rerenderAsync(...)" instead"`,
62-
);
63-
});
64-
65-
test('rerenderAsync function updates component asynchronously', async () => {
57+
test('rerender function updates component asynchronously', async () => {
6658
const fn = jest.fn();
6759
await render(<Banana onUpdate={fn} />);
6860
expect(fn).toHaveBeenCalledTimes(0);
6961

70-
await screen.rerenderAsync(<Banana onUpdate={fn} />);
62+
await screen.rerender(<Banana onUpdate={fn} />);
7163
expect(fn).toHaveBeenCalledTimes(1);
7264
});
7365

74-
test('unmount function throws error when used with render', async () => {
75-
await render(<Banana />);
76-
77-
expect(() => screen.unmount()).toThrowErrorMatchingInlineSnapshot(
78-
`""unmount()" is not supported when using "render" use "await unmountAsync()" instead"`,
79-
);
80-
});
81-
82-
test('unmountAsync function unmounts component asynchronously', async () => {
66+
test('unmount function unmounts component asynchronously', async () => {
8367
const fn = jest.fn();
8468
await render(<Banana onUnmount={fn} />);
8569

86-
await screen.unmountAsync();
70+
await screen.unmount();
8771
expect(fn).toHaveBeenCalled();
8872
});

src/__tests__/screen.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ test('screen works with updating rerender', async () => {
2828
const result = await render(<Text>Mt. Everest</Text>);
2929
expect(screen).toBe(result);
3030

31-
await screen.rerenderAsync(<Text>Śnieżka</Text>);
31+
await screen.rerender(<Text>Śnieżka</Text>);
3232
expect(screen).toBe(result);
3333
expect(screen.getByText('Śnieżka')).toBeTruthy();
3434
});
@@ -41,7 +41,7 @@ test('screen works with nested re-mounting rerender', async () => {
4141
);
4242
expect(screen).toBe(result);
4343

44-
await screen.rerenderAsync(
44+
await screen.rerender(
4545
<View>
4646
<View>
4747
<Text>Śnieżka</Text>

src/deprecated/render-sync.tsx

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,13 @@ function buildRenderResult(
5555
renderer.render(wrap(component));
5656
});
5757
};
58-
const rerenderAsync = async (component: React.ReactElement) => {
59-
// eslint-disable-next-line require-await
60-
await act(async () => {
61-
renderer.render(wrap(component));
62-
});
63-
};
6458

6559
const unmount = () => {
6660
void act(() => {
6761
renderer.unmount();
6862
});
6963
};
64+
7065
const unmountAsync = async () => {
7166
// eslint-disable-next-line require-await
7267
await act(async () => {
@@ -92,11 +87,8 @@ function buildRenderResult(
9287
const result = {
9388
...getQueriesForElement(renderer.container),
9489
rerender,
95-
rerenderAsync,
9690
update: rerender, // alias for 'rerender'
97-
updateAsync: rerenderAsync, // alias for `rerenderAsync`
9891
unmount,
99-
unmountAsync,
10092
toJSON,
10193
debug: makeDebug(renderer),
10294
get container(): HostElement {

src/helpers/__tests__/component-tree.test.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ function MultipleHostChildren() {
1515
}
1616

1717
describe('getHostSiblings()', () => {
18-
it('returns host siblings for host component', () => {
19-
render(
18+
it('returns host siblings for host component', async () => {
19+
await render(
2020
<View testID="grandparent">
2121
<View testID="parent">
2222
<View testID="siblingBefore" />
@@ -39,8 +39,8 @@ describe('getHostSiblings()', () => {
3939
});
4040

4141
describe('getContainerElement()', () => {
42-
it('returns container for mounted view', () => {
43-
render(
42+
it('returns container for mounted view', async () => {
43+
await render(
4444
<View>
4545
<View testID="view" />
4646
</View>,

0 commit comments

Comments
 (0)