From 3f2129aeee8ba11ca803f68395a6978a8c8cf3b3 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Fri, 9 Dec 2016 18:41:35 +0000 Subject: [PATCH] Add a failing test for portal child reconciliation It is failing because portal bails out of update, seeing null in pendingProps. It is null because we set pendingProps to nextPortal.children, which is null in this test. --- scripts/fiber/tests-failing.txt | 3 + .../dom/fiber/__tests__/ReactDOMFiber-test.js | 76 +++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/scripts/fiber/tests-failing.txt b/scripts/fiber/tests-failing.txt index 8d705c30e8353..8db2ea6703a63 100644 --- a/scripts/fiber/tests-failing.txt +++ b/scripts/fiber/tests-failing.txt @@ -18,6 +18,9 @@ src/isomorphic/modern/element/__tests__/ReactJSXElementValidator-test.js src/renderers/dom/__tests__/ReactDOMProduction-test.js * should throw with an error code in production +src/renderers/dom/fiber/__tests__/ReactDOMFiber-test.js +* should reconcile portal children + src/renderers/dom/shared/__tests__/ReactDOM-test.js * throws in render() if the mount callback is not a function * throws in render() if the update callback is not a function diff --git a/src/renderers/dom/fiber/__tests__/ReactDOMFiber-test.js b/src/renderers/dom/fiber/__tests__/ReactDOMFiber-test.js index fd20ef8a8c0fa..6dd3146541107 100644 --- a/src/renderers/dom/fiber/__tests__/ReactDOMFiber-test.js +++ b/src/renderers/dom/fiber/__tests__/ReactDOMFiber-test.js @@ -367,6 +367,82 @@ describe('ReactDOMFiber', () => { expect(container.innerHTML).toBe(''); }); + it('should reconcile portal children', () => { + var portalContainer = document.createElement('div'); + + ReactDOM.render( +
+ {ReactDOM.unstable_createPortal( +
portal:1
, + portalContainer + )} +
, + container + ); + expect(portalContainer.innerHTML).toBe('
portal:1
'); + expect(container.innerHTML).toBe('
'); + + ReactDOM.render( +
+ {ReactDOM.unstable_createPortal( +
portal:2
, + portalContainer + )} +
, + container + ); + expect(portalContainer.innerHTML).toBe('
portal:2
'); + expect(container.innerHTML).toBe('
'); + + ReactDOM.render( +
+ {ReactDOM.unstable_createPortal( +

portal:3

, + portalContainer + )} +
, + container + ); + expect(portalContainer.innerHTML).toBe('

portal:3

'); + expect(container.innerHTML).toBe('
'); + + ReactDOM.render( +
+ {ReactDOM.unstable_createPortal( + ['Hi', 'Bye'], + portalContainer + )} +
, + container + ); + expect(portalContainer.innerHTML).toBe('HiBye'); + expect(container.innerHTML).toBe('
'); + + ReactDOM.render( +
+ {ReactDOM.unstable_createPortal( + ['Bye', 'Hi'], + portalContainer + )} +
, + container + ); + expect(portalContainer.innerHTML).toBe('ByeHi'); + expect(container.innerHTML).toBe('
'); + + ReactDOM.render( +
+ {ReactDOM.unstable_createPortal( + null, + portalContainer + )} +
, + container + ); + expect(portalContainer.innerHTML).toBe(''); + expect(container.innerHTML).toBe('
'); + }); + it('should keep track of namespace across portals (simple)', () => { assertNamespacesMatch(