diff --git a/packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js b/packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js index 47e374c68..bcc1f48aa 100644 --- a/packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js +++ b/packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js @@ -29,6 +29,9 @@ const FunctionalComponent = 1; const HostPortal = 4; const HostComponent = 5; const HostText = 6; +const Mode = 11; +const ContextConsumer = 12; +const ContextProvider = 13; function nodeAndSiblingsArray(nodeWithSibling) { const array = []; @@ -82,8 +85,6 @@ function toTree(vnode) { instance: node.stateNode, rendered: childrenToTree(node.child), }; - case Fragment: // 10 - return childrenToTree(node.child); case FunctionalComponent: // 1 return { nodeType: 'function', @@ -111,6 +112,11 @@ function toTree(vnode) { } case HostText: // 6 return node.memoizedProps; + case Fragment: // 10 + case Mode: // 11 + case ContextProvider: // 13 + case ContextConsumer: // 12 + return childrenToTree(node.child); default: throw new Error(`Enzyme Internal Error: unknown node with tag ${node.tag}`); } diff --git a/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx b/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx index db5419a17..cc48122ac 100644 --- a/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx +++ b/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx @@ -11,7 +11,7 @@ import { import { ITERATOR_SYMBOL, sym } from 'enzyme/build/Utils'; import './_helpers/setupAdapters'; -import { createClass, createPortal } from './_helpers/react-compat'; +import { createClass, createContext, createPortal } from './_helpers/react-compat'; import { describeWithDOM, describeIf, @@ -19,7 +19,7 @@ import { itWithData, generateEmptyRenderData, } from './_helpers'; -import { REACT013, REACT014, REACT16, is } from './_helpers/version'; +import { REACT013, REACT014, REACT16, REACT163, is } from './_helpers/version'; const getElementPropSelector = prop => x => x.props[prop]; const getWrapperPropSelector = prop => x => x.prop(prop); @@ -165,6 +165,22 @@ describeWithDOM('mount', () => { expect(wrapper.context('name')).to.equal(context.name); }); + itIf(REACT163, 'should find elements through Context elements', () => { + const { Provider, Consumer } = createContext(''); + + class Foo extends React.Component { + render() { + return ( + {value => {value}} + ); + } + } + + const wrapper = mount(
); + + expect(wrapper.find('span').text()).to.equal('foo'); + }); + describeIf(!REACT013, 'stateless components', () => { it('can pass in context', () => { const SimpleComponent = (props, context) => ( diff --git a/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx b/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx index 22e14d897..8aaf196e1 100644 --- a/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx +++ b/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx @@ -6,9 +6,9 @@ import { shallow, render, ShallowWrapper, mount } from 'enzyme'; import { ITERATOR_SYMBOL, withSetStateAllowed, sym } from 'enzyme/build/Utils'; import './_helpers/setupAdapters'; -import { createClass } from './_helpers/react-compat'; +import { createClass, createContext } from './_helpers/react-compat'; import { describeIf, itIf, itWithData, generateEmptyRenderData } from './_helpers'; -import { REACT013, REACT014, REACT15, REACT150_4, REACT16, is } from './_helpers/version'; +import { REACT013, REACT014, REACT15, REACT150_4, REACT16, REACT163, is } from './_helpers/version'; // The shallow renderer in react 16 does not yet support batched updates. When it does, // we should be able to go un-skip all of the tests that are skipped with this flag. @@ -96,6 +96,32 @@ describe('shallow', () => { expect(wrapper.context('name')).to.equal(context.name); }); + itIf(REACT163, 'should find elements through Context elements', () => { + const { Provider, Consumer } = createContext(''); + + class Consumes extends React.Component { + render() { + return ( + + {value => {value}} + + ); + } + } + + class Provides extends React.Component { + render() { + return ( +
+ ); + } + } + + expect(shallow().find('span')).to.have.length(1); + expect(shallow().find(Consumes)).to.have.length(1); + + }); + describeIf(!REACT013, 'stateless function components', () => { it('can pass in context', () => { const SimpleComponent = (props, context) => ( diff --git a/packages/enzyme-test-suite/test/_helpers/react-compat.js b/packages/enzyme-test-suite/test/_helpers/react-compat.js index 8e7edc694..a63fbc15a 100644 --- a/packages/enzyme-test-suite/test/_helpers/react-compat.js +++ b/packages/enzyme-test-suite/test/_helpers/react-compat.js @@ -9,8 +9,9 @@ import { is } from './version'; let createClass; let renderToString; let createPortal; +let createContext; -if (is('>=15.5 || ^16.0.0-alpha')) { +if (is('>=15.5 || ^16.0.0-alpha || ^16.3.0-alpha')) { // eslint-disable-next-line import/no-extraneous-dependencies createClass = require('create-react-class'); } else { @@ -24,14 +25,21 @@ if (is('^0.13.0')) { ({ renderToString } = require('react-dom/server')); } -if (is('^16.0.0-alpha')) { +if (is('^16.0.0-alpha || ^16.3.0-alpha')) { ({ createPortal } = require('react-dom')); } else { createPortal = null; } +if (is('^16.3.0-0')) { + ({ createContext } = require('react')); +} else { + createContext = null; +} + export { createClass, renderToString, createPortal, + createContext, }; diff --git a/packages/enzyme-test-suite/test/_helpers/version.js b/packages/enzyme-test-suite/test/_helpers/version.js index d6142c094..ba6d11392 100644 --- a/packages/enzyme-test-suite/test/_helpers/version.js +++ b/packages/enzyme-test-suite/test/_helpers/version.js @@ -11,6 +11,7 @@ export const REACT15 = major === '15'; export const REACT150_4 = REACT15 && minor < 5; export const REACT155 = REACT15 && minor >= 5; export const REACT16 = major === '16'; +export const REACT163 = REACT16 && minor >= 3; export function gt(v) { return semver.gt(VERSION, v); } export function lt(v) { return semver.lt(VERSION, v); }