From c040bcbea8e4393fbab549cc195162ac183625ed Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Sat, 21 Apr 2018 21:21:05 +0100 Subject: [PATCH] Add server integration tests for new context (#12654) * Add server integration tests for new context * Pretty please * Remove unused --- ...DOMServerIntegrationLegacyContext-test.js} | 2 +- ...eactDOMServerIntegrationNewContext-test.js | 195 ++++++++++++++++++ 2 files changed, 196 insertions(+), 1 deletion(-) rename packages/react-dom/src/__tests__/{ReactDOMServerIntegrationContext-test.js => ReactDOMServerIntegrationLegacyContext-test.js} (99%) create mode 100644 packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js diff --git a/packages/react-dom/src/__tests__/ReactDOMServerIntegrationContext-test.js b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationLegacyContext-test.js similarity index 99% rename from packages/react-dom/src/__tests__/ReactDOMServerIntegrationContext-test.js rename to packages/react-dom/src/__tests__/ReactDOMServerIntegrationLegacyContext-test.js index 4ccf8a303c..32b38b3e0f 100644 --- a/packages/react-dom/src/__tests__/ReactDOMServerIntegrationContext-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationLegacyContext-test.js @@ -42,7 +42,7 @@ describe('ReactDOMServerIntegration', () => { resetModules(); }); - describe('context', function() { + describe('legacy context', function() { let PurpleContext, RedContext; beforeEach(() => { class Parent extends React.Component { diff --git a/packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js new file mode 100644 index 0000000000..c3c08eb6bf --- /dev/null +++ b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js @@ -0,0 +1,195 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * 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 + */ + +'use strict'; + +const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegrationTestUtils'); + +let React; +let ReactDOM; +let ReactDOMServer; + +function initModules() { + // Reset warning cache. + jest.resetModuleRegistry(); + React = require('react'); + ReactDOM = require('react-dom'); + ReactDOMServer = require('react-dom/server'); + + // Make them available to the helpers. + return { + ReactDOM, + ReactDOMServer, + }; +} + +const {resetModules, itRenders} = ReactDOMServerIntegrationUtils(initModules); + +describe('ReactDOMServerIntegration', () => { + beforeEach(() => { + resetModules(); + }); + + describe('context', function() { + let PurpleContext, RedContext, Consumer; + beforeEach(() => { + let Context = React.createContext('none'); + + class Parent extends React.Component { + render() { + return ( + + {this.props.children} + + ); + } + } + Consumer = Context.Consumer; + PurpleContext = props => {props.children}; + RedContext = props => {props.children}; + }); + + itRenders('class child with context', async render => { + class ClassChildWithContext extends React.Component { + render() { + return ( +
+ {text => text} +
+ ); + } + } + + const e = await render( + + + , + ); + expect(e.textContent).toBe('purple'); + }); + + itRenders('stateless child with context', async render => { + function StatelessChildWithContext(props) { + return {text => text}; + } + + const e = await render( + + + , + ); + expect(e.textContent).toBe('purple'); + }); + + itRenders('class child with default context', async render => { + class ClassChildWithWrongContext extends React.Component { + render() { + return ( +
+ {text => text} +
+ ); + } + } + + const e = await render(); + expect(e.textContent).toBe('none'); + }); + + itRenders('stateless child with wrong context', async render => { + function StatelessChildWithWrongContext(props) { + return ( +
+ {text => text} +
+ ); + } + + const e = await render(); + expect(e.textContent).toBe('none'); + }); + + itRenders('with context passed through to a grandchild', async render => { + function Grandchild(props) { + return ( +
+ {text => text} +
+ ); + } + + const Child = props => ; + + const e = await render( + + + , + ); + expect(e.textContent).toBe('purple'); + }); + + itRenders('a child context overriding a parent context', async render => { + const Grandchild = props => { + return ( +
+ {text => text} +
+ ); + }; + + const e = await render( + + + + + , + ); + expect(e.textContent).toBe('red'); + }); + + itRenders('multiple contexts', async render => { + const Theme = React.createContext('dark'); + const Language = React.createContext('french'); + class Parent extends React.Component { + render() { + return ( + + + + ); + } + } + + function Child() { + return ( + + + + ); + } + + const Grandchild = props => { + return ( +
+ + {theme =>
{theme}
} +
+ + {language =>
{language}
} +
+
+ ); + }; + + const e = await render(); + expect(e.querySelector('#theme').textContent).toBe('light'); + expect(e.querySelector('#language').textContent).toBe('english'); + }); + }); +});