Skip to content

Commit 26297f5

Browse files
authored
[assert helpers] not dom or reconciler (#31862)
converts everything left outside react-dom and react-reconciler
1 parent 6a3d6a4 commit 26297f5

File tree

10 files changed

+195
-145
lines changed

10 files changed

+195
-145
lines changed

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

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ let waitForPaint;
2222
let assertLog;
2323
let waitForThrow;
2424
let act;
25+
let assertConsoleErrorDev;
2526

2627
describe('ReactCache', () => {
2728
beforeEach(() => {
@@ -39,6 +40,7 @@ describe('ReactCache', () => {
3940
assertLog = InternalTestUtils.assertLog;
4041
waitForThrow = InternalTestUtils.waitForThrow;
4142
waitForPaint = InternalTestUtils.waitForPaint;
43+
assertConsoleErrorDev = InternalTestUtils.assertConsoleErrorDev;
4244
act = InternalTestUtils.act;
4345

4446
TextResource = createResource(
@@ -190,20 +192,31 @@ describe('ReactCache', () => {
190192
);
191193

192194
if (__DEV__) {
193-
await expect(async () => {
194-
await waitForAll([
195-
'App',
196-
'Loading...',
197-
198-
...(gate('enableSiblingPrerendering') ? ['App'] : []),
199-
]);
200-
}).toErrorDev([
195+
await waitForAll([
196+
'App',
197+
'Loading...',
198+
199+
...(gate('enableSiblingPrerendering') ? ['App'] : []),
200+
]);
201+
assertConsoleErrorDev([
201202
'Invalid key type. Expected a string, number, symbol, or ' +
202203
"boolean, but instead received: [ 'Hi', 100 ]\n\n" +
203204
'To use non-primitive values as keys, you must pass a hash ' +
204-
'function as the second argument to createResource().',
205-
206-
...(gate('enableSiblingPrerendering') ? ['Invalid key type'] : []),
205+
'function as the second argument to createResource().\n' +
206+
' in App (at **)' +
207+
(gate(flags => flags.enableOwnerStacks)
208+
? ''
209+
: '\n in Suspense (at **)'),
210+
211+
...(gate('enableSiblingPrerendering')
212+
? [
213+
'Invalid key type. Expected a string, number, symbol, or ' +
214+
"boolean, but instead received: [ 'Hi', 100 ]\n\n" +
215+
'To use non-primitive values as keys, you must pass a hash ' +
216+
'function as the second argument to createResource().\n' +
217+
' in App (at **)',
218+
]
219+
: []),
207220
]);
208221
} else {
209222
await waitForAll([

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ let React;
1414
let ReactTestRenderer;
1515
let ReactDebugTools;
1616
let act;
17+
let assertConsoleErrorDev;
1718
let useMemoCache;
1819

1920
function normalizeSourceLoc(tree) {
@@ -33,7 +34,7 @@ describe('ReactHooksInspectionIntegration', () => {
3334
jest.resetModules();
3435
React = require('react');
3536
ReactTestRenderer = require('react-test-renderer');
36-
act = require('internal-test-utils').act;
37+
({act, assertConsoleErrorDev} = require('internal-test-utils'));
3738
ReactDebugTools = require('react-debug-tools');
3839
useMemoCache = require('react/compiler-runtime').c;
3940
});
@@ -2344,10 +2345,12 @@ describe('ReactHooksInspectionIntegration', () => {
23442345
</Suspense>,
23452346
);
23462347

2347-
await expect(async () => {
2348-
await act(async () => await LazyFoo);
2349-
}).toErrorDev([
2350-
'Foo: Support for defaultProps will be removed from function components in a future major release. Use JavaScript default parameters instead.',
2348+
await act(async () => await LazyFoo);
2349+
assertConsoleErrorDev([
2350+
'Foo: Support for defaultProps will be removed from function components in a future major release. Use JavaScript default parameters instead.' +
2351+
(gate(flags => flags.enableOwnerStacks)
2352+
? ''
2353+
: '\n in Foo (at **)\n' + ' in Suspense (at **)'),
23512354
]);
23522355

23532356
const childFiber = renderer.root._currentFiber();

packages/react-dom/src/client/__tests__/trustedTypes-test.internal.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ describe('when Trusted Types are available in global object', () => {
1414
let ReactDOMClient;
1515
let ReactFeatureFlags;
1616
let act;
17+
let assertConsoleErrorDev;
1718
let container;
1819
let ttObject1;
1920
let ttObject2;
@@ -36,7 +37,7 @@ describe('when Trusted Types are available in global object', () => {
3637
ReactFeatureFlags.enableTrustedTypesIntegration = true;
3738
React = require('react');
3839
ReactDOMClient = require('react-dom/client');
39-
act = require('internal-test-utils').act;
40+
({act, assertConsoleErrorDev} = require('internal-test-utils'));
4041
ttObject1 = {
4142
toString() {
4243
return '<b>Hi</b>';
@@ -208,17 +209,16 @@ describe('when Trusted Types are available in global object', () => {
208209

209210
it('should warn once when rendering script tag in jsx on client', async () => {
210211
const root = ReactDOMClient.createRoot(container);
211-
await expect(async () => {
212-
await act(() => {
213-
root.render(<script>alert("I am not executed")</script>);
214-
});
215-
}).toErrorDev(
212+
await act(() => {
213+
root.render(<script>alert("I am not executed")</script>);
214+
});
215+
assertConsoleErrorDev([
216216
'Encountered a script tag while rendering React component. ' +
217217
'Scripts inside React components are never executed when rendering ' +
218218
'on the client. Consider using template tag instead ' +
219219
'(https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template).\n' +
220220
' in script (at **)',
221-
);
221+
]);
222222

223223
// check that the warning is printed only once
224224
await act(() => {

packages/react-native-renderer/src/__tests__/ReactFabric-test.internal.js

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ let ReactNativePrivateInterface;
1616
let createReactNativeComponentClass;
1717
let StrictMode;
1818
let act;
19+
let assertConsoleErrorDev;
1920

2021
const DISPATCH_COMMAND_REQUIRES_HOST_COMPONENT =
2122
"dispatchCommand was called with a ref that isn't a " +
@@ -38,7 +39,7 @@ describe('ReactFabric', () => {
3839
createReactNativeComponentClass =
3940
require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface')
4041
.ReactNativeViewConfigRegistry.register;
41-
act = require('internal-test-utils').act;
42+
({act, assertConsoleErrorDev} = require('internal-test-utils'));
4243
});
4344

4445
it('should be able to create and render a native component', async () => {
@@ -459,9 +460,8 @@ describe('ReactFabric', () => {
459460
});
460461

461462
expect(nativeFabricUIManager.dispatchCommand).not.toBeCalled();
462-
expect(() => {
463-
ReactFabric.dispatchCommand(viewRef, 'updateCommand', [10, 20]);
464-
}).toErrorDev([DISPATCH_COMMAND_REQUIRES_HOST_COMPONENT], {
463+
ReactFabric.dispatchCommand(viewRef, 'updateCommand', [10, 20]);
464+
assertConsoleErrorDev([DISPATCH_COMMAND_REQUIRES_HOST_COMPONENT], {
465465
withoutStack: true,
466466
});
467467

@@ -525,9 +525,8 @@ describe('ReactFabric', () => {
525525
});
526526

527527
expect(nativeFabricUIManager.sendAccessibilityEvent).not.toBeCalled();
528-
expect(() => {
529-
ReactFabric.sendAccessibilityEvent(viewRef, 'eventTypeName');
530-
}).toErrorDev([SEND_ACCESSIBILITY_EVENT_REQUIRES_HOST_COMPONENT], {
528+
ReactFabric.sendAccessibilityEvent(viewRef, 'eventTypeName');
529+
assertConsoleErrorDev([SEND_ACCESSIBILITY_EVENT_REQUIRES_HOST_COMPONENT], {
531530
withoutStack: true,
532531
});
533532

@@ -856,24 +855,31 @@ describe('ReactFabric', () => {
856855
uiViewClassName: 'RCTView',
857856
}));
858857

859-
await expect(async () => {
860-
await act(() => {
861-
ReactFabric.render(<View>this should warn</View>, 11, null, true);
862-
});
863-
}).toErrorDev(['Text strings must be rendered within a <Text> component.']);
858+
await act(() => {
859+
ReactFabric.render(<View>this should warn</View>, 11, null, true);
860+
});
861+
assertConsoleErrorDev([
862+
'Text strings must be rendered within a <Text> component.\n' +
863+
' in RCTView (at **)',
864+
]);
864865

865-
await expect(async () => {
866-
await act(() => {
867-
ReactFabric.render(
868-
<Text>
869-
<ScrollView>hi hello hi</ScrollView>
870-
</Text>,
871-
11,
872-
null,
873-
true,
874-
);
875-
});
876-
}).toErrorDev(['Text strings must be rendered within a <Text> component.']);
866+
await act(() => {
867+
ReactFabric.render(
868+
<Text>
869+
<ScrollView>hi hello hi</ScrollView>
870+
</Text>,
871+
11,
872+
null,
873+
true,
874+
);
875+
});
876+
assertConsoleErrorDev([
877+
'Text strings must be rendered within a <Text> component.\n' +
878+
' in RCTScrollView (at **)' +
879+
(gate(flags => !flags.enableOwnerStacks)
880+
? '\n in RCTText (at **)'
881+
: ''),
882+
]);
877883
});
878884

879885
it('should not throw for text inside of an indirect <Text> ancestor', async () => {
@@ -1166,10 +1172,8 @@ describe('ReactFabric', () => {
11661172
);
11671173
});
11681174

1169-
let match;
1170-
expect(
1171-
() => (match = ReactFabric.findHostInstance_DEPRECATED(parent)),
1172-
).toErrorDev([
1175+
const match = ReactFabric.findHostInstance_DEPRECATED(parent);
1176+
assertConsoleErrorDev([
11731177
'findHostInstance_DEPRECATED is deprecated in StrictMode. ' +
11741178
'findHostInstance_DEPRECATED was passed an instance of ContainsStrictModeChild which renders StrictMode children. ' +
11751179
'Instead, add a ref directly to the element you want to reference. ' +
@@ -1207,10 +1211,8 @@ describe('ReactFabric', () => {
12071211
);
12081212
});
12091213

1210-
let match;
1211-
expect(
1212-
() => (match = ReactFabric.findHostInstance_DEPRECATED(parent)),
1213-
).toErrorDev([
1214+
const match = ReactFabric.findHostInstance_DEPRECATED(parent);
1215+
assertConsoleErrorDev([
12141216
'findHostInstance_DEPRECATED is deprecated in StrictMode. ' +
12151217
'findHostInstance_DEPRECATED was passed an instance of IsInStrictMode which is inside StrictMode. ' +
12161218
'Instead, add a ref directly to the element you want to reference. ' +
@@ -1250,8 +1252,8 @@ describe('ReactFabric', () => {
12501252
);
12511253
});
12521254

1253-
let match;
1254-
expect(() => (match = ReactFabric.findNodeHandle(parent))).toErrorDev([
1255+
const match = ReactFabric.findNodeHandle(parent);
1256+
assertConsoleErrorDev([
12551257
'findNodeHandle is deprecated in StrictMode. ' +
12561258
'findNodeHandle was passed an instance of ContainsStrictModeChild which renders StrictMode children. ' +
12571259
'Instead, add a ref directly to the element you want to reference. ' +
@@ -1291,8 +1293,8 @@ describe('ReactFabric', () => {
12911293
);
12921294
});
12931295

1294-
let match;
1295-
expect(() => (match = ReactFabric.findNodeHandle(parent))).toErrorDev([
1296+
const match = ReactFabric.findNodeHandle(parent);
1297+
assertConsoleErrorDev([
12961298
'findNodeHandle is deprecated in StrictMode. ' +
12971299
'findNodeHandle was passed an instance of IsInStrictMode which is inside StrictMode. ' +
12981300
'Instead, add a ref directly to the element you want to reference. ' +
@@ -1313,16 +1315,16 @@ describe('ReactFabric', () => {
13131315
return null;
13141316
}
13151317
}
1316-
await expect(async () => {
1317-
await act(() => {
1318-
ReactFabric.render(<TestComponent />, 11, null, true);
1319-
});
1320-
}).toErrorDev([
1318+
await act(() => {
1319+
ReactFabric.render(<TestComponent />, 11, null, true);
1320+
});
1321+
assertConsoleErrorDev([
13211322
'TestComponent is accessing findNodeHandle inside its render(). ' +
13221323
'render() should be a pure function of props and state. It should ' +
13231324
'never access something that requires stale data from the previous ' +
13241325
'render, such as refs. Move this logic to componentDidMount and ' +
1325-
'componentDidUpdate instead.',
1326+
'componentDidUpdate instead.\n' +
1327+
' in TestComponent (at **)',
13261328
]);
13271329
});
13281330

packages/react-native-renderer/src/__tests__/ReactNativeEvents-test.internal.js

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ let ReactNative;
1818
let ResponderEventPlugin;
1919
let UIManager;
2020
let createReactNativeComponentClass;
21+
let assertConsoleErrorDev;
2122

2223
// Parallels requireNativeComponent() in that it lazily constructs a view config,
2324
// And registers view manager event types with ReactNativeViewConfigRegistry.
@@ -69,6 +70,7 @@ beforeEach(() => {
6970
require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface').RCTEventEmitter;
7071
React = require('react');
7172
act = require('internal-test-utils').act;
73+
assertConsoleErrorDev = require('internal-test-utils').assertConsoleErrorDev;
7274
ReactNative = require('react-native-renderer');
7375
ResponderEventPlugin =
7476
require('react-native-renderer/src/legacy-events/ResponderEventPlugin').default;
@@ -227,30 +229,32 @@ test('handles events on text nodes', () => {
227229
}
228230

229231
const log = [];
230-
expect(() => {
231-
ReactNative.render(
232-
<ContextHack>
233-
<Text>
234-
<Text
235-
onTouchEnd={() => log.push('string touchend')}
236-
onTouchEndCapture={() => log.push('string touchend capture')}
237-
onTouchStart={() => log.push('string touchstart')}
238-
onTouchStartCapture={() => log.push('string touchstart capture')}>
239-
Text Content
240-
</Text>
241-
<Text
242-
onTouchEnd={() => log.push('number touchend')}
243-
onTouchEndCapture={() => log.push('number touchend capture')}
244-
onTouchStart={() => log.push('number touchstart')}
245-
onTouchStartCapture={() => log.push('number touchstart capture')}>
246-
{123}
247-
</Text>
232+
ReactNative.render(
233+
<ContextHack>
234+
<Text>
235+
<Text
236+
onTouchEnd={() => log.push('string touchend')}
237+
onTouchEndCapture={() => log.push('string touchend capture')}
238+
onTouchStart={() => log.push('string touchstart')}
239+
onTouchStartCapture={() => log.push('string touchstart capture')}>
240+
Text Content
248241
</Text>
249-
</ContextHack>,
250-
1,
251-
);
252-
}).toErrorDev([
253-
'ContextHack uses the legacy childContextTypes API which will soon be removed. Use React.createContext() instead.',
242+
<Text
243+
onTouchEnd={() => log.push('number touchend')}
244+
onTouchEndCapture={() => log.push('number touchend capture')}
245+
onTouchStart={() => log.push('number touchstart')}
246+
onTouchStartCapture={() => log.push('number touchstart capture')}>
247+
{123}
248+
</Text>
249+
</Text>
250+
</ContextHack>,
251+
1,
252+
);
253+
assertConsoleErrorDev([
254+
'ContextHack uses the legacy childContextTypes API which will soon be removed. ' +
255+
'Use React.createContext() instead. ' +
256+
'(https://react.dev/link/legacy-context)' +
257+
'\n in ContextHack (at **)',
254258
]);
255259

256260
expect(UIManager.createView).toHaveBeenCalledTimes(5);

0 commit comments

Comments
 (0)