Skip to content

Commit 7842092

Browse files
committed
ensure rerenderAsync and unmountAsync called after renderAsync
1 parent 6aa1741 commit 7842092

File tree

4 files changed

+34
-38
lines changed

4 files changed

+34
-38
lines changed

src/__tests__/act.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ test('render should trigger useEffect', () => {
2323
expect(effectCallback).toHaveBeenCalledTimes(1);
2424
});
2525

26-
test('update should trigger useEffect', () => {
26+
test('rerender should trigger useEffect', () => {
2727
const effectCallback = jest.fn();
2828
render(<UseEffect callback={effectCallback} />);
29-
screen.update(<UseEffect callback={effectCallback} />);
29+
screen.rerender(<UseEffect callback={effectCallback} />);
3030

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

src/__tests__/render-async.test.tsx

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -64,57 +64,53 @@ test('renderAsync supports legacy rendering option', async () => {
6464
expect(screen.root).toBeOnTheScreen();
6565
});
6666

67-
test('update function updates component synchronously', async () => {
68-
const fn = jest.fn();
69-
const result = await renderAsync(<Banana onUpdate={fn} />);
70-
71-
result.update(<Banana onUpdate={fn} />);
67+
test('rerender function throws error when used with renderAsync', async () => {
68+
const result = await renderAsync(<Banana />);
7269

73-
expect(fn).toHaveBeenCalledTimes(1);
70+
expect(() => result.rerender(<Banana />)).toThrowErrorMatchingInlineSnapshot(
71+
`"\`rerender(...)\` is not supported when using \`renderAsync\` use \`await rerenderAsync(...)\` instead"`
72+
);
7473
});
7574

76-
test('updateAsync function updates component asynchronously', async () => {
75+
test('rerenderAsync function updates component asynchronously', async () => {
7776
const fn = jest.fn();
7877
const result = await renderAsync(<Banana onUpdate={fn} />);
79-
80-
await result.updateAsync(<Banana onUpdate={fn} />);
81-
78+
expect(fn).toHaveBeenCalledTimes(0);
79+
80+
await result.rerenderAsync(<Banana onUpdate={fn} />);
8281
expect(fn).toHaveBeenCalledTimes(1);
8382
});
8483

85-
test('rerender is an alias for update', async () => {
86-
const fn = jest.fn();
87-
const result = await renderAsync(<Banana onUpdate={fn} />);
88-
89-
result.rerender(<Banana onUpdate={fn} />);
84+
test('rerender function throws error when used with renderAsync', async () => {
85+
const result = await renderAsync(<Banana />);
9086

91-
expect(fn).toHaveBeenCalledTimes(1);
87+
expect(() => result.rerender(<Banana />)).toThrowErrorMatchingInlineSnapshot(
88+
`"\`rerender(...)\` is not supported when using \`renderAsync\` use \`await rerenderAsync(...)\` instead"`
89+
);
9290
});
9391

94-
test('rerenderAsync is an alias for updateAsync', async () => {
92+
test('rerenderAsync function updates component asynchronously', async () => {
9593
const fn = jest.fn();
9694
const result = await renderAsync(<Banana onUpdate={fn} />);
97-
95+
expect(fn).toHaveBeenCalledTimes(0);
96+
9897
await result.rerenderAsync(<Banana onUpdate={fn} />);
99-
10098
expect(fn).toHaveBeenCalledTimes(1);
10199
});
102100

103-
test('unmount function unmounts component synchronously', async () => {
104-
const fn = jest.fn();
105-
const result = await renderAsync(<Banana onUnmount={fn} />);
106-
107-
result.unmount();
101+
test('unmount function throws error when used with renderAsync', async () => {
102+
const result = await renderAsync(<Banana />);
108103

109-
expect(fn).toHaveBeenCalled();
104+
expect(() => result.unmount()).toThrowErrorMatchingInlineSnapshot(
105+
`"\`unmount()\` is not supported when using \`renderAsync\` use \`await unmountAsync()\` instead"`
106+
);
110107
});
111108

112109
test('unmountAsync function unmounts component asynchronously', async () => {
113110
const fn = jest.fn();
114111
const result = await renderAsync(<Banana onUnmount={fn} />);
115112

116113
await result.unmountAsync();
117-
118114
expect(fn).toHaveBeenCalled();
119115
});
120116

src/render-async.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@ function buildRenderResult(
6262
) {
6363
const instance = renderer.root;
6464

65-
const update = function (component: React.ReactElement) {
65+
const rerender = function (component: React.ReactElement) {
6666
throw new Error(
67-
'`update(...)` is not supported when using `renderAsync` use `await updateAsync(...)` instead',
67+
'`rerender(...)` is not supported when using `renderAsync` use `await rerenderAsync(...)` instead',
6868
);
6969
};
70-
const updateAsync = async function (component: React.ReactElement) {
70+
const rerenderAsync = async function (component: React.ReactElement) {
7171
// eslint-disable-next-line require-await
7272
await act(async () => {
7373
renderer.update(wrap(component));
@@ -86,14 +86,14 @@ function buildRenderResult(
8686
});
8787
};
8888

89-
addToCleanupQueue(unmount);
89+
addToCleanupQueue(unmountAsync);
9090

9191
const result = {
9292
...getQueriesForElement(instance),
93-
update,
94-
updateAsync,
95-
rerender: update, // alias for `update`
96-
rerenderAsync: updateAsync, // alias for `update`
93+
rerender,
94+
rerenderAsync,
95+
update: rerender, // alias for `rerender`
96+
updateAsync: rerenderAsync, // alias for `rerenderAsync`
9797
unmount,
9898
unmountAsync,
9999
toJSON: renderer.toJSON,

src/screen.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ const defaultScreen: Screen = {
2525
throw new Error(SCREEN_ERROR);
2626
},
2727
debug: notImplementedDebug,
28+
rerender: notImplemented,
29+
rerenderAsync: notImplemented,
2830
update: notImplemented,
2931
updateAsync: notImplemented,
3032
unmount: notImplemented,
3133
unmountAsync: notImplemented,
32-
rerender: notImplemented,
33-
rerenderAsync: notImplemented,
3434
toJSON: notImplemented,
3535
getByLabelText: notImplemented,
3636
getAllByLabelText: notImplemented,

0 commit comments

Comments
 (0)