Skip to content

Commit ce8a72f

Browse files
authored
Codemod tests to waitFor pattern (2/?) (#26296)
This converts some of our test suite to use the `waitFor` test pattern, instead of the `expect(Scheduler).toFlushAndYield` pattern. Most of these changes are automated with jscodeshift, with some slight manual cleanup in certain cases. See #26285 for full context.
1 parent 1f1f8eb commit ce8a72f

File tree

14 files changed

+449
-388
lines changed

14 files changed

+449
-388
lines changed

packages/react-cache/src/__tests__/ReactCacheOld-test.internal.js

Lines changed: 34 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ let Scheduler;
1818
let Suspense;
1919
let TextResource;
2020
let textResourceShouldFail;
21+
let waitForAll;
22+
let assertLog;
2123

2224
describe('ReactCache', () => {
2325
beforeEach(() => {
@@ -33,6 +35,10 @@ describe('ReactCache', () => {
3335
ReactTestRenderer = require('react-test-renderer');
3436
Scheduler = require('scheduler');
3537

38+
const InternalTestUtils = require('internal-test-utils');
39+
waitForAll = InternalTestUtils.waitForAll;
40+
assertLog = InternalTestUtils.assertLog;
41+
3642
TextResource = createResource(
3743
([text, ms = 0]) => {
3844
let listeners = null;
@@ -105,7 +111,7 @@ describe('ReactCache', () => {
105111
}
106112
}
107113

108-
it('throws a promise if the requested value is not in the cache', () => {
114+
it('throws a promise if the requested value is not in the cache', async () => {
109115
function App() {
110116
return (
111117
<Suspense fallback={<Text text="Loading..." />}>
@@ -118,11 +124,11 @@ describe('ReactCache', () => {
118124
unstable_isConcurrent: true,
119125
});
120126

121-
expect(Scheduler).toFlushAndYield(['Suspend! [Hi]', 'Loading...']);
127+
await waitForAll(['Suspend! [Hi]', 'Loading...']);
122128

123129
jest.advanceTimersByTime(100);
124-
expect(Scheduler).toHaveYielded(['Promise resolved [Hi]']);
125-
expect(Scheduler).toFlushAndYield(['Hi']);
130+
assertLog(['Promise resolved [Hi]']);
131+
await waitForAll(['Hi']);
126132
});
127133

128134
it('throws an error on the subsequent read if the promise is rejected', async () => {
@@ -138,22 +144,22 @@ describe('ReactCache', () => {
138144
unstable_isConcurrent: true,
139145
});
140146

141-
expect(Scheduler).toFlushAndYield(['Suspend! [Hi]', 'Loading...']);
147+
await waitForAll(['Suspend! [Hi]', 'Loading...']);
142148

143149
textResourceShouldFail = true;
144150
jest.advanceTimersByTime(100);
145-
expect(Scheduler).toHaveYielded(['Promise rejected [Hi]']);
151+
assertLog(['Promise rejected [Hi]']);
146152

147153
expect(Scheduler).toFlushAndThrow('Failed to load: Hi');
148-
expect(Scheduler).toHaveYielded(['Error! [Hi]', 'Error! [Hi]']);
154+
assertLog(['Error! [Hi]', 'Error! [Hi]']);
149155

150156
// Should throw again on a subsequent read
151157
root.update(<App />);
152158
expect(Scheduler).toFlushAndThrow('Failed to load: Hi');
153-
expect(Scheduler).toHaveYielded(['Error! [Hi]', 'Error! [Hi]']);
159+
assertLog(['Error! [Hi]', 'Error! [Hi]']);
154160
});
155161

156-
it('warns if non-primitive key is passed to a resource without a hash function', () => {
162+
it('warns if non-primitive key is passed to a resource without a hash function', async () => {
157163
const BadTextResource = createResource(([text, ms = 0]) => {
158164
return new Promise((resolve, reject) =>
159165
setTimeout(() => {
@@ -177,16 +183,16 @@ describe('ReactCache', () => {
177183
);
178184

179185
if (__DEV__) {
180-
expect(() => {
181-
expect(Scheduler).toFlushAndYield(['App', 'Loading...']);
186+
expect(async () => {
187+
await waitForAll(['App', 'Loading...']);
182188
}).toErrorDev([
183189
'Invalid key type. Expected a string, number, symbol, or ' +
184190
'boolean, but instead received: Hi,100\n\n' +
185191
'To use non-primitive values as keys, you must pass a hash ' +
186192
'function as the second argument to createResource().',
187193
]);
188194
} else {
189-
expect(Scheduler).toFlushAndYield(['App', 'Loading...']);
195+
await waitForAll(['App', 'Loading...']);
190196
}
191197
});
192198

@@ -204,19 +210,19 @@ describe('ReactCache', () => {
204210
unstable_isConcurrent: true,
205211
},
206212
);
207-
expect(Scheduler).toFlushAndYield([
213+
await waitForAll([
208214
'Suspend! [1]',
209215
'Suspend! [2]',
210216
'Suspend! [3]',
211217
'Loading...',
212218
]);
213219
jest.advanceTimersByTime(100);
214-
expect(Scheduler).toHaveYielded([
220+
assertLog([
215221
'Promise resolved [1]',
216222
'Promise resolved [2]',
217223
'Promise resolved [3]',
218224
]);
219-
expect(Scheduler).toFlushAndYield([1, 2, 3]);
225+
await waitForAll([1, 2, 3]);
220226
expect(root).toMatchRenderedOutput('123');
221227

222228
// Render 1, 4, 5
@@ -228,18 +234,10 @@ describe('ReactCache', () => {
228234
</Suspense>,
229235
);
230236

231-
expect(Scheduler).toFlushAndYield([
232-
1,
233-
'Suspend! [4]',
234-
'Suspend! [5]',
235-
'Loading...',
236-
]);
237+
await waitForAll([1, 'Suspend! [4]', 'Suspend! [5]', 'Loading...']);
237238
jest.advanceTimersByTime(100);
238-
expect(Scheduler).toHaveYielded([
239-
'Promise resolved [4]',
240-
'Promise resolved [5]',
241-
]);
242-
expect(Scheduler).toFlushAndYield([1, 4, 5]);
239+
assertLog(['Promise resolved [4]', 'Promise resolved [5]']);
240+
await waitForAll([1, 4, 5]);
243241
expect(root).toMatchRenderedOutput('145');
244242

245243
// We've now rendered values 1, 2, 3, 4, 5, over our limit of 3. The least
@@ -253,7 +251,7 @@ describe('ReactCache', () => {
253251
</Suspense>,
254252
);
255253

256-
expect(Scheduler).toFlushAndYield([
254+
await waitForAll([
257255
// 1 is still cached
258256
1,
259257
// 2 and 3 suspend because they were evicted from the cache
@@ -262,11 +260,8 @@ describe('ReactCache', () => {
262260
'Loading...',
263261
]);
264262
jest.advanceTimersByTime(100);
265-
expect(Scheduler).toHaveYielded([
266-
'Promise resolved [2]',
267-
'Promise resolved [3]',
268-
]);
269-
expect(Scheduler).toFlushAndYield([1, 2, 3]);
263+
assertLog(['Promise resolved [2]', 'Promise resolved [3]']);
264+
await waitForAll([1, 2, 3]);
270265
expect(root).toMatchRenderedOutput('123');
271266
});
272267

@@ -287,18 +282,15 @@ describe('ReactCache', () => {
287282
},
288283
);
289284

290-
expect(Scheduler).toFlushAndYield(['Loading...']);
285+
await waitForAll(['Loading...']);
291286

292287
jest.advanceTimersByTime(1000);
293-
expect(Scheduler).toHaveYielded([
294-
'Promise resolved [B]',
295-
'Promise resolved [A]',
296-
]);
297-
expect(Scheduler).toFlushAndYield(['Result']);
288+
assertLog(['Promise resolved [B]', 'Promise resolved [A]']);
289+
await waitForAll(['Result']);
298290
expect(root).toMatchRenderedOutput('Result');
299291
});
300292

301-
it('if a thenable resolves multiple times, does not update the first cached value', () => {
293+
it('if a thenable resolves multiple times, does not update the first cached value', async () => {
302294
let resolveThenable;
303295
const BadTextResource = createResource(
304296
([text, ms = 0]) => {
@@ -349,7 +341,7 @@ describe('ReactCache', () => {
349341
},
350342
);
351343

352-
expect(Scheduler).toFlushAndYield(['Suspend! [Hi]', 'Loading...']);
344+
await waitForAll(['Suspend! [Hi]', 'Loading...']);
353345

354346
resolveThenable('Hi');
355347
// This thenable improperly resolves twice. We should not update the
@@ -365,8 +357,8 @@ describe('ReactCache', () => {
365357
},
366358
);
367359

368-
expect(Scheduler).toHaveYielded([]);
369-
expect(Scheduler).toFlushAndYield(['Hi']);
360+
assertLog([]);
361+
await waitForAll(['Hi']);
370362
expect(root).toMatchRenderedOutput('Hi');
371363
});
372364

packages/react-client/src/__tests__/ReactFlight-test.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ let ReactNoopFlightClient;
2020
let ErrorBoundary;
2121
let NoErrorExpected;
2222
let Scheduler;
23+
let assertLog;
2324

2425
describe('ReactFlight', () => {
2526
beforeEach(() => {
@@ -33,6 +34,8 @@ describe('ReactFlight', () => {
3334
ReactNoopFlightClient = require('react-noop-renderer/flight-client');
3435
act = require('jest-react').act;
3536
Scheduler = require('scheduler');
37+
const InternalTestUtils = require('internal-test-utils');
38+
assertLog = InternalTestUtils.assertLog;
3639

3740
ErrorBoundary = class extends React.Component {
3841
state = {hasError: false, error: null};
@@ -808,13 +811,13 @@ describe('ReactFlight', () => {
808811
const ClientDoublerModuleRef = clientReference(ClientDoubler);
809812

810813
const transport = ReactNoopFlightServer.render(<App />);
811-
expect(Scheduler).toHaveYielded([]);
814+
assertLog([]);
812815

813816
await act(async () => {
814817
ReactNoop.render(await ReactNoopFlightClient.read(transport));
815818
});
816819

817-
expect(Scheduler).toHaveYielded(['ClientDoubler']);
820+
assertLog(['ClientDoubler']);
818821
expect(ReactNoop).toMatchRenderedOutput(
819822
<>
820823
<div prop=":S1:">:S1:</div>
@@ -997,15 +1000,15 @@ describe('ReactFlight', () => {
9971000

9981001
const transport = ReactNoopFlightServer.render(<Foo />);
9991002

1000-
expect(Scheduler).toHaveYielded(['suspended']);
1003+
assertLog(['suspended']);
10011004

10021005
await act(async () => {
10031006
resolve();
10041007
await promise;
10051008
jest.runAllImmediates();
10061009
});
10071010

1008-
expect(Scheduler).toHaveYielded(['rendered']);
1011+
assertLog(['rendered']);
10091012

10101013
await act(async () => {
10111014
ServerContext._currentRenderer = null;
@@ -1045,7 +1048,7 @@ describe('ReactFlight', () => {
10451048

10461049
const transport = ReactNoopFlightServer.render(model);
10471050

1048-
expect(Scheduler).toHaveYielded([]);
1051+
assertLog([]);
10491052

10501053
await act(async () => {
10511054
ServerContext._currentRenderer = null;
@@ -1054,7 +1057,7 @@ describe('ReactFlight', () => {
10541057
ReactNoop.render(flightModel.foo);
10551058
});
10561059

1057-
expect(Scheduler).toHaveYielded(['ClientBar']);
1060+
assertLog(['ClientBar']);
10581061
expect(ReactNoop).toMatchRenderedOutput(<span>hi this is server</span>);
10591062

10601063
expect(() => {

packages/react-debug-tools/src/__tests__/ReactDevToolsHooksIntegration-test.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ describe('React hooks DevTools integration', () => {
1919
let overrideHookState;
2020
let scheduleUpdate;
2121
let setSuspenseHandler;
22+
let waitForAll;
2223

2324
global.IS_REACT_ACT_ENVIRONMENT = true;
2425

@@ -41,6 +42,9 @@ describe('React hooks DevTools integration', () => {
4142
ReactTestRenderer = require('react-test-renderer');
4243
Scheduler = require('scheduler');
4344

45+
const InternalTestUtils = require('internal-test-utils');
46+
waitForAll = InternalTestUtils.waitForAll;
47+
4448
act = ReactTestRenderer.act;
4549
});
4650

@@ -256,7 +260,7 @@ describe('React hooks DevTools integration', () => {
256260
),
257261
);
258262

259-
expect(Scheduler).toFlushAndYield([]);
263+
await waitForAll([]);
260264
// Ensure we timeout any suspense time.
261265
jest.advanceTimersByTime(1000);
262266
const fiber = renderer.root._currentFiber().child;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy