component-test-utils-react
Version:
Test react component the same way as other frameworks
70 lines (57 loc) • 1.75 kB
JavaScript
const React = require('react');
const ReactIs = require('react-is');
const {shouldBeRender} = require('./render.utils');
const render = (reactEl, config, ShallowRender) => {
if (!reactEl || typeof reactEl !== 'object') {
return reactEl;
}
const isAlreadyMocked = Boolean(reactEl._mock);
if (isAlreadyMocked) {
reactEl._mock._render();
}
if (!isAlreadyMocked && ReactIs.isForwardRef(reactEl)) {
const shallowRender = new ShallowRender(reactEl, config);
return {
...shallowRender._rendered,
_mock: shallowRender
};
}
// When rendering modify the context value
if (ReactIs.isContextProvider(reactEl) && reactEl.props.value) {
reactEl.type._context._currentValue = reactEl.props.value;
}
if (!isAlreadyMocked && shouldBeRender(reactEl, config)) {
const mock = config.mocks && config.mocks[reactEl.type.displayName || reactEl.type.name];
const el = mock === true ? reactEl.type : mock || reactEl.type;
const shallowRender = new ShallowRender(
React.createElement(
el,
reactEl.props,
reactEl.props && reactEl.props.children
),
config
);
return {
...reactEl,
props: {
...reactEl.props,
children: render(shallowRender._rendered, config, ShallowRender)
},
_mock: shallowRender
};
}
if (reactEl.props && reactEl.props.children) {
const children = Array.isArray(reactEl.props.children) ?
reactEl.props.children.map(el => render(el, config, ShallowRender)) :
render(reactEl.props.children, config, ShallowRender);
return {
...reactEl,
props: {
...reactEl.props,
children
}
};
}
return reactEl;
};
exports.render = render;