Files
react/packages/react-native-renderer/src/__tests__/ReactNativeError-test.internal.js
T
Jan Kassens 6b30832666 Upgrade prettier (#26081)
The old version of prettier we were using didn't support the Flow syntax
to access properties in a type using `SomeType['prop']`. This updates
`prettier` and `rollup-plugin-prettier` to the latest versions.

I added the prettier config `arrowParens: "avoid"` to reduce the diff
size as the default has changed in Prettier 2.0. The largest amount of
changes comes from function expressions now having a space. This doesn't
have an option to preserve the old behavior, so we have to update this.
2023-01-31 08:25:05 -05:00

91 lines
2.3 KiB
JavaScript

/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @emails react-core
* @jest-environment node
*/
'use strict';
let React;
let ReactNative;
let createReactNativeComponentClass;
let computeComponentStackForErrorReporting;
function normalizeCodeLocInfo(str) {
return (
str &&
str.replace(/\n +(?:at|in) ([\S]+)[^\n]*/g, function (m, name) {
return '\n in ' + name + ' (at **)';
})
);
}
describe('ReactNativeError', () => {
beforeEach(() => {
jest.resetModules();
React = require('react');
ReactNative = require('react-native-renderer');
createReactNativeComponentClass =
require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface')
.ReactNativeViewConfigRegistry.register;
computeComponentStackForErrorReporting =
ReactNative.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED
.computeComponentStackForErrorReporting;
});
it('should throw error if null component registration getter is used', () => {
expect(() => {
try {
createReactNativeComponentClass('View', null);
} catch (e) {
throw new Error(e.toString());
}
}).toThrow(
'View config getter callback for component `View` must be a function (received `null`)',
);
});
it('should be able to extract a component stack from a native view', () => {
const View = createReactNativeComponentClass('View', () => ({
validAttributes: {foo: true},
uiViewClassName: 'View',
}));
const ref = React.createRef();
function FunctionComponent(props) {
return props.children;
}
class ClassComponent extends React.Component {
render() {
return (
<FunctionComponent>
<View foo="test" ref={ref} />
</FunctionComponent>
);
}
}
ReactNative.render(<ClassComponent />, 1);
const reactTag = ReactNative.findNodeHandle(ref.current);
const componentStack = normalizeCodeLocInfo(
computeComponentStackForErrorReporting(reactTag),
);
expect(componentStack).toBe(
'\n' +
' in View (at **)\n' +
' in FunctionComponent (at **)\n' +
' in ClassComponent (at **)',
);
});
});