From 5ddf6f491f73c443e9404132a962650029fbd3df Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Fri, 16 Mar 2018 11:15:48 -0400 Subject: [PATCH 1/5] Support ForwardRef type of work in TestRenderer --- .../src/ReactTestRenderer.js | 3 ++ .../ReactTestRenderer-test.internal.js | 42 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/packages/react-test-renderer/src/ReactTestRenderer.js b/packages/react-test-renderer/src/ReactTestRenderer.js index 78215ab08ddf0..625c8e94e3972 100644 --- a/packages/react-test-renderer/src/ReactTestRenderer.js +++ b/packages/react-test-renderer/src/ReactTestRenderer.js @@ -25,6 +25,7 @@ import { ContextConsumer, ContextProvider, Mode, + ForwardRef, } from 'shared/ReactTypeOfWork'; import invariant from 'fbjs/lib/invariant'; @@ -372,6 +373,7 @@ function toTree(node: ?Fiber) { case ContextProvider: case ContextConsumer: case Mode: + case ForwardRef: return childrenToTree(node.child); default: invariant( @@ -472,6 +474,7 @@ class ReactTestInstance { case ContextProvider: case ContextConsumer: case Mode: + case ForwardRef: descend = true; break; default: diff --git a/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.internal.js b/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.internal.js index e8d5c1d6a53a4..b28ac5b827f20 100644 --- a/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.internal.js +++ b/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.internal.js @@ -957,4 +957,46 @@ describe('ReactTestRenderer', () => { }), ); }); + + it.only('supports forwardRef', () => { + const InnerRefed = React.forwardRef((props, ref) => ( +
+ +
+ )); + + class App extends React.Component { + render() { + return (this.ref = r)} />; + } + } + + const renderer = ReactTestRenderer.create(); + const tree = renderer.toTree(); + cleanNodeOrArray(tree); + + expect(prettyFormat(tree)).toEqual( + prettyFormat({ + instance: null, + nodeType: 'component', + props: {}, + rendered: { + instance: null, + nodeType: 'host', + props: {}, + rendered: [ + { + instance: null, + nodeType: 'host', + props: {}, + rendered: [], + type: 'span', + }, + ], + type: 'div', + }, + type: App, + }), + ); + }); }); From b9d091c67029d50291563f56c29ad5f9df3adcee Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Fri, 16 Mar 2018 11:31:35 -0400 Subject: [PATCH 2/5] rm .only --- .../src/__tests__/ReactTestRenderer-test.internal.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.internal.js b/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.internal.js index b28ac5b827f20..1f463f9172981 100644 --- a/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.internal.js +++ b/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.internal.js @@ -404,6 +404,7 @@ describe('ReactTestRenderer', () => { log.push('Angry render'); throw new Error('Please, do not render me.'); } + componentDidMount() { log.push('Angry componentDidMount'); } @@ -958,7 +959,7 @@ describe('ReactTestRenderer', () => { ); }); - it.only('supports forwardRef', () => { + it('supports forwardRef', () => { const InnerRefed = React.forwardRef((props, ref) => (
From 8a25f8c16468d2abe6834f1cd5542fd7b3b518b4 Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Fri, 16 Mar 2018 12:26:38 -0400 Subject: [PATCH 3/5] add ShallowRenderer support --- packages/react-is/src/ReactIs.js | 2 +- packages/react-test-renderer/package.json | 17 ++++------------ .../src/ReactShallowRenderer.js | 7 +++++-- .../__tests__/ReactShallowRenderer-test.js | 20 +++++++++++++++++++ 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/packages/react-is/src/ReactIs.js b/packages/react-is/src/ReactIs.js index 0265055e020de..cee716e0bfffe 100644 --- a/packages/react-is/src/ReactIs.js +++ b/packages/react-is/src/ReactIs.js @@ -34,7 +34,7 @@ export function typeOf(object: any) { case REACT_STRICT_MODE_TYPE: return type; default: - const $$typeofType = type.$$typeof; + const $$typeofType = type && type.$$typeof; switch ($$typeofType) { case REACT_CONTEXT_TYPE: diff --git a/packages/react-test-renderer/package.json b/packages/react-test-renderer/package.json index d88931c1117ca..6f20e76312174 100644 --- a/packages/react-test-renderer/package.json +++ b/packages/react-test-renderer/package.json @@ -4,11 +4,7 @@ "description": "React package for snapshot testing.", "main": "index.js", "repository": "facebook/react", - "keywords": [ - "react", - "react-native", - "react-testing" - ], + "keywords": ["react", "react-native", "react-testing"], "license": "MIT", "bugs": { "url": "https://github.com/facebook/react/issues" @@ -17,16 +13,11 @@ "dependencies": { "fbjs": "^0.8.16", "object-assign": "^4.1.1", - "prop-types": "^15.6.0" + "prop-types": "^15.6.0", + "react-is": "^16.3.0-alpha.2" }, "peerDependencies": { "react": "^16.0.0 || 16.3.0-alpha.2" }, - "files": [ - "LICENSE", - "README.md", - "index.js", - "shallow.js", - "cjs/" - ] + "files": ["LICENSE", "README.md", "index.js", "shallow.js", "cjs/"] } diff --git a/packages/react-test-renderer/src/ReactShallowRenderer.js b/packages/react-test-renderer/src/ReactShallowRenderer.js index 69859ff562711..3c80122b1bb35 100644 --- a/packages/react-test-renderer/src/ReactShallowRenderer.js +++ b/packages/react-test-renderer/src/ReactShallowRenderer.js @@ -7,6 +7,7 @@ */ import React from 'react'; +import {isForwardRef} from 'react-is'; import {warnAboutDeprecatedLifecycles} from 'shared/ReactFeatureFlags'; import describeComponentFrame from 'shared/describeComponentFrame'; import getComponentName from 'shared/getComponentName'; @@ -77,7 +78,7 @@ class ReactShallowRenderer { element.type, ); invariant( - typeof element.type === 'function', + isForwardRef(element) || typeof element.type === 'function', 'ReactShallowRenderer render(): Shallow rendering works only with custom ' + 'components, but the provided element type was `%s`.', Array.isArray(element.type) @@ -96,7 +97,9 @@ class ReactShallowRenderer { if (this._instance) { this._updateClassComponent(element, this._context); } else { - if (shouldConstruct(element.type)) { + if (isForwardRef(element)) { + this._rendered = element.type.render(element.props, null); + } else if (shouldConstruct(element.type)) { this._instance = new element.type( element.props, this._context, diff --git a/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js b/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js index 318611db64b41..4b7a37350f910 100644 --- a/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js +++ b/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js @@ -168,6 +168,26 @@ describe('ReactShallowRenderer', () => { ]); }); + it('should handle ForwardRef', () => { + const SomeComponent = React.forwardRef((props, ref) => ( +
+ {(expect(ref).toEqual(null), null)} + + +
+ )); + + const shallowRenderer = createRenderer(); + const result = shallowRenderer.render(); + + expect(result.type).toBe('div'); + expect(result.props.children).toEqual([ + null, + , + , + ]); + }); + it('should enable shouldComponentUpdate to prevent a re-render', () => { let renderCounter = 0; class SimpleComponent extends React.Component { From a8d67210cbebdf01772b493a65c417ac9ab8c9d3 Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Fri, 16 Mar 2018 13:23:40 -0400 Subject: [PATCH 4/5] clean up test and fix render --- .../src/ReactShallowRenderer.js | 2 +- .../__tests__/ReactShallowRenderer-test.js | 20 ++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/react-test-renderer/src/ReactShallowRenderer.js b/packages/react-test-renderer/src/ReactShallowRenderer.js index 3c80122b1bb35..b08732e0fd369 100644 --- a/packages/react-test-renderer/src/ReactShallowRenderer.js +++ b/packages/react-test-renderer/src/ReactShallowRenderer.js @@ -98,7 +98,7 @@ class ReactShallowRenderer { this._updateClassComponent(element, this._context); } else { if (isForwardRef(element)) { - this._rendered = element.type.render(element.props, null); + this._rendered = element.type.render(element.props, element.ref); } else if (shouldConstruct(element.type)) { this._instance = new element.type( element.props, diff --git a/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js b/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js index 4b7a37350f910..2bf95824c32a9 100644 --- a/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js +++ b/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js @@ -169,20 +169,22 @@ describe('ReactShallowRenderer', () => { }); it('should handle ForwardRef', () => { - const SomeComponent = React.forwardRef((props, ref) => ( -
- {(expect(ref).toEqual(null), null)} - - -
- )); + const testRef = React.createRef(); + const SomeComponent = React.forwardRef((props, ref) => { + expect(ref).toEqual(testRef); + return ( +
+ + +
+ ); + }); const shallowRenderer = createRenderer(); - const result = shallowRenderer.render(); + const result = shallowRenderer.render(); expect(result.type).toBe('div'); expect(result.props.children).toEqual([ - null, , , ]); From 610df953eb53d8bdd15ad164406a8b5534ad2588 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Fri, 16 Mar 2018 11:10:26 -0700 Subject: [PATCH 5/5] Update inter-package dependencies when releasing --- .../release/build-commands/update-package-versions.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/scripts/release/build-commands/update-package-versions.js b/scripts/release/build-commands/update-package-versions.js index f5c69b0fe99e6..eca2346f718b2 100644 --- a/scripts/release/build-commands/update-package-versions.js +++ b/scripts/release/build-commands/update-package-versions.js @@ -78,6 +78,16 @@ const update = async ({cwd, dry, packages, version}) => { if (prerelease) { json.peerDependencies.react += ` || ${version}`; } + + // Update inter-package dependencies as well. + // e.g. react-test-renderer depends on react-is + if (json.dependencies) { + Object.keys(json.dependencies).forEach(dependency => { + if (packages.indexOf(dependency) >= 0) { + json.dependencies[dependency] = `^${version}`; + } + }); + } } await writeJson(path, json, {spaces: 2});