From d167e28f7f55b6662a6fff3303d6dda6889249bf Mon Sep 17 00:00:00 2001 From: Sebastian Silbermann Date: Thu, 25 Apr 2019 13:14:41 +0200 Subject: [PATCH] Check if WrapperComponent supports forwardedRef prop --- .../enzyme-adapter-react-13/src/ReactThirteenAdapter.js | 7 +++++-- .../enzyme-adapter-react-14/src/ReactFourteenAdapter.js | 7 +++++-- .../src/ReactFifteenFourAdapter.js | 7 +++++-- .../enzyme-adapter-react-15/src/ReactFifteenAdapter.js | 7 +++++-- .../src/ReactSixteenOneAdapter.js | 7 +++++-- .../src/ReactSixteenTwoAdapter.js | 7 +++++-- .../src/ReactSixteenThreeAdapter.js | 7 +++++-- .../enzyme-adapter-react-16/src/ReactSixteenAdapter.js | 7 +++++-- packages/enzyme-adapter-utils/src/createMountWrapper.jsx | 1 + 9 files changed, 41 insertions(+), 16 deletions(-) diff --git a/packages/enzyme-adapter-react-13/src/ReactThirteenAdapter.js b/packages/enzyme-adapter-react-13/src/ReactThirteenAdapter.js index ba95a2024..b0d68dc70 100644 --- a/packages/enzyme-adapter-react-13/src/ReactThirteenAdapter.js +++ b/packages/enzyme-adapter-react-13/src/ReactThirteenAdapter.js @@ -125,13 +125,16 @@ class ReactThirteenAdapter extends EnzymeAdapter { render(el, context, callback) { if (instance === null) { const { ref, type, props } = el; + const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); + const refProp = ReactWrapperComponent.supportsForwardedRef === true + ? 'forwardedRef' + : 'ref'; const wrapperProps = { Component: type, props, context, - ...(ref && { forwardedRef: ref }), + ...(ref && { [refProp]: ref }), }; - const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); const wrappedEl = React.createElement(ReactWrapperComponent, wrapperProps); instance = React.render(wrappedEl, domNode); if (typeof callback === 'function') { diff --git a/packages/enzyme-adapter-react-14/src/ReactFourteenAdapter.js b/packages/enzyme-adapter-react-14/src/ReactFourteenAdapter.js index 5901e9580..48351d0e5 100644 --- a/packages/enzyme-adapter-react-14/src/ReactFourteenAdapter.js +++ b/packages/enzyme-adapter-react-14/src/ReactFourteenAdapter.js @@ -105,14 +105,17 @@ class ReactFourteenAdapter extends EnzymeAdapter { render(el, context, callback) { if (instance === null) { const { type, props, ref } = el; + const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); + const refProp = ReactWrapperComponent.supportsForwardedRef === true + ? 'forwardedRef' + : 'ref'; const wrapperProps = { Component: type, wrappingComponentProps: options.wrappingComponentProps, props, context, - ...(ref && { forwardedRef: ref }), + ...(ref && { [refProp]: ref }), }; - const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); const wrappedEl = React.createElement(ReactWrapperComponent, wrapperProps); instance = ReactDOM.render(wrappedEl, domNode); if (typeof callback === 'function') { diff --git a/packages/enzyme-adapter-react-15.4/src/ReactFifteenFourAdapter.js b/packages/enzyme-adapter-react-15.4/src/ReactFifteenFourAdapter.js index 5c2236b7b..063e233ad 100644 --- a/packages/enzyme-adapter-react-15.4/src/ReactFifteenFourAdapter.js +++ b/packages/enzyme-adapter-react-15.4/src/ReactFifteenFourAdapter.js @@ -140,14 +140,17 @@ class ReactFifteenFourAdapter extends EnzymeAdapter { render(el, context, callback) { if (instance === null) { const { type, props, ref } = el; + const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); + const refProp = ReactWrapperComponent.supportsForwardedRef === true + ? 'forwardedRef' + : 'ref'; const wrapperProps = { Component: type, wrappingComponentProps: options.wrappingComponentProps, props, context, - ...(ref && { forwardedRef: ref }), + ...(ref && { [refProp]: ref }), }; - const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); const wrappedEl = React.createElement(ReactWrapperComponent, wrapperProps); instance = ReactDOM.render(wrappedEl, domNode); if (typeof callback === 'function') { diff --git a/packages/enzyme-adapter-react-15/src/ReactFifteenAdapter.js b/packages/enzyme-adapter-react-15/src/ReactFifteenAdapter.js index ff730a722..ba349847a 100644 --- a/packages/enzyme-adapter-react-15/src/ReactFifteenAdapter.js +++ b/packages/enzyme-adapter-react-15/src/ReactFifteenAdapter.js @@ -140,14 +140,17 @@ class ReactFifteenAdapter extends EnzymeAdapter { render(el, context, callback) { if (instance === null) { const { type, props, ref } = el; + const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); + const refProp = ReactWrapperComponent.supportsForwardedRef === true + ? 'forwardedRef' + : 'ref'; const wrapperProps = { Component: type, wrappingComponentProps: options.wrappingComponentProps, props, context, - ...(ref && { forwardedRef: ref }), + ...(ref && { [refProp]: ref }), }; - const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); const wrappedEl = React.createElement(ReactWrapperComponent, wrapperProps); instance = ReactDOM.render(wrappedEl, domNode); if (typeof callback === 'function') { diff --git a/packages/enzyme-adapter-react-16.1/src/ReactSixteenOneAdapter.js b/packages/enzyme-adapter-react-16.1/src/ReactSixteenOneAdapter.js index 6cbda5d1a..2858727a4 100644 --- a/packages/enzyme-adapter-react-16.1/src/ReactSixteenOneAdapter.js +++ b/packages/enzyme-adapter-react-16.1/src/ReactSixteenOneAdapter.js @@ -273,14 +273,17 @@ class ReactSixteenOneAdapter extends EnzymeAdapter { render(el, context, callback) { if (instance === null) { const { type, props, ref } = el; + const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); + const refProp = ReactWrapperComponent.supportsForwardedRef === true + ? 'forwardedRef' + : 'ref'; const wrapperProps = { Component: type, props, wrappingComponentProps, context, - ...(ref && { forwardedRef: ref }), + ...(ref && { [refProp]: ref }), }; - const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); const wrappedEl = React.createElement(ReactWrapperComponent, wrapperProps); instance = hydrateIn ? ReactDOM.hydrate(wrappedEl, domNode) diff --git a/packages/enzyme-adapter-react-16.2/src/ReactSixteenTwoAdapter.js b/packages/enzyme-adapter-react-16.2/src/ReactSixteenTwoAdapter.js index ff04a08f1..db29cd173 100644 --- a/packages/enzyme-adapter-react-16.2/src/ReactSixteenTwoAdapter.js +++ b/packages/enzyme-adapter-react-16.2/src/ReactSixteenTwoAdapter.js @@ -275,14 +275,17 @@ class ReactSixteenTwoAdapter extends EnzymeAdapter { render(el, context, callback) { if (instance === null) { const { type, props, ref } = el; + const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); + const refProp = ReactWrapperComponent.supportsForwardedRef === true + ? 'forwardedRef' + : 'ref'; const wrapperProps = { Component: type, props, wrappingComponentProps, context, - ...(ref && { forwardedRef: ref }), + ...(ref && { [refProp]: ref }), }; - const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); const wrappedEl = React.createElement(ReactWrapperComponent, wrapperProps); instance = hydrateIn ? ReactDOM.hydrate(wrappedEl, domNode) diff --git a/packages/enzyme-adapter-react-16.3/src/ReactSixteenThreeAdapter.js b/packages/enzyme-adapter-react-16.3/src/ReactSixteenThreeAdapter.js index 9f2930d26..7e52abe18 100644 --- a/packages/enzyme-adapter-react-16.3/src/ReactSixteenThreeAdapter.js +++ b/packages/enzyme-adapter-react-16.3/src/ReactSixteenThreeAdapter.js @@ -294,14 +294,17 @@ class ReactSixteenThreeAdapter extends EnzymeAdapter { render(el, context, callback) { if (instance === null) { const { type, props, ref } = el; + const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); + const refProp = ReactWrapperComponent.supportsForwardedRef === true + ? 'forwardedRef' + : 'ref'; const wrapperProps = { Component: type, props, wrappingComponentProps, context, - ...(ref && { forwardedRef: ref }), + ...(ref && { [refProp]: ref }), }; - const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); const wrappedEl = React.createElement(ReactWrapperComponent, wrapperProps); instance = hydrateIn ? ReactDOM.hydrate(wrappedEl, domNode) diff --git a/packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js b/packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js index 5bc3ba7b4..cbcbc0d8a 100644 --- a/packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js +++ b/packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js @@ -416,14 +416,17 @@ class ReactSixteenAdapter extends EnzymeAdapter { return wrapAct(() => { if (instance === null) { const { type, props, ref } = el; + const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); + const refProp = ReactWrapperComponent.supportsForwardedRef === true + ? 'forwardedRef' + : 'ref'; const wrapperProps = { Component: type, props, wrappingComponentProps, context, - ...(ref && { forwardedRef: ref }), + ...(ref && { [refProp]: ref }), }; - const ReactWrapperComponent = createMountWrapper(el, { ...options, adapter }); const wrappedEl = React.createElement(ReactWrapperComponent, wrapperProps); instance = hydrateIn ? ReactDOM.hydrate(wrappedEl, domNode) diff --git a/packages/enzyme-adapter-utils/src/createMountWrapper.jsx b/packages/enzyme-adapter-utils/src/createMountWrapper.jsx index 4d32df81b..c1fa2a863 100644 --- a/packages/enzyme-adapter-utils/src/createMountWrapper.jsx +++ b/packages/enzyme-adapter-utils/src/createMountWrapper.jsx @@ -85,6 +85,7 @@ export default function createMountWrapper(node, options = {}) { return component; } } + WrapperComponent.supportsForwardedRef = true; WrapperComponent.propTypes = { Component: makeValidElementType(adapter).isRequired, props: PropTypes.object.isRequired,