Skip to content

Commit

Permalink
[enzyme-adapter-react-{16,16.3}] [new] support shallow rendering `cre…
Browse files Browse the repository at this point in the history
…ateContext()` providers and consumers
  • Loading branch information
minznerjosh authored and ljharb committed Jan 22, 2019
1 parent 0e1f4b8 commit c69b712
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 2 deletions.
Expand Up @@ -15,6 +15,8 @@ import {
Element,
ForwardRef,
Fragment,
isContextConsumer,
isContextProvider,
isElement,
isForwardRef,
isPortal,
Expand Down Expand Up @@ -357,11 +359,29 @@ class ReactSixteenThreeAdapter extends EnzymeAdapter {
let isDOM = false;
let cachedNode = null;
return {
render(el, context) {
render(el, context, {
providerValues = new Map(),
} = {}) {
cachedNode = el;
/* eslint consistent-return: 0 */
if (typeof el.type === 'string') {
isDOM = true;
} else if (isContextProvider(el)) {
providerValues.set(el.type, el.props.value);
const MockProvider = Object.assign(
props => props.children,
el.type,
);
return withSetStateAllowed(() => renderer.render({ ...el, type: MockProvider }));
} else if (isContextConsumer(el)) {
const value = providerValues.has(el.type.Provider)
? providerValues.get(el.type.Provider)
: el.type.Provider._context._defaultValue;
const MockConsumer = Object.assign(
props => props.children(value),
el.type,
);
return withSetStateAllowed(() => renderer.render({ ...el, type: MockConsumer }));
} else {
isDOM = false;
const { type: Component } = el;
Expand Down Expand Up @@ -543,6 +563,8 @@ class ReactSixteenThreeAdapter extends EnzymeAdapter {
return !!type && (
typeof type === 'function'
|| isForwardRef(fakeElement)
|| isContextProvider(fakeElement)
|| isContextConsumer(fakeElement)
);
}

Expand Down
49 changes: 48 additions & 1 deletion packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js
Expand Up @@ -18,6 +18,8 @@ import {
Element,
ForwardRef,
Fragment,
isContextConsumer,
isContextProvider,
isElement,
isForwardRef,
isMemo,
Expand Down Expand Up @@ -298,6 +300,31 @@ function wrapAct(fn) {
return returnVal;
}

function getProviderFromConsumer(Consumer) {
// React stores references to the Provider on a Consumer differently across versions.
let Provider;
if (Consumer.Provider) {
({ Provider } = Consumer);
} else if (Consumer._context) {
({ Provider } = Consumer._context);
}
if (Provider) {
return Provider;
}
throw new Error('Enzyme Internal Error: can\'t figure out how to get Provider from Consumer');
}

function getProviderDefaultValue(Provider) {
// React stores references to the Provider's defaultValue differently across versions.
if ('_defaultValue' in Provider._context) {
return Provider._context._defaultValue;
}
if ('_currentValue' in Provider._context) {
return Provider._context._currentValue;
}
throw new Error('Enzyme Internal Error: can\'t figure out how to get Provider\'s default value');
}

class ReactSixteenAdapter extends EnzymeAdapter {
constructor() {
super();
Expand Down Expand Up @@ -449,11 +476,29 @@ class ReactSixteenAdapter extends EnzymeAdapter {
};

return {
render(el, unmaskedContext) {
render(el, unmaskedContext, {
providerValues = new Map(),
} = {}) {
cachedNode = el;
/* eslint consistent-return: 0 */
if (typeof el.type === 'string') {
isDOM = true;
} else if (isContextProvider(el)) {
providerValues.set(el.type, el.props.value);
const MockProvider = Object.assign(
props => props.children,
el.type,
);
return withSetStateAllowed(() => renderer.render({ ...el, type: MockProvider }));
} else if (isContextConsumer(el)) {
const Provider = getProviderFromConsumer(el.type);
const value = providerValues.has(Provider)
? providerValues.get(Provider) : getProviderDefaultValue(Provider);
const MockConsumer = Object.assign(
props => props.children(value),
el.type,
);
return withSetStateAllowed(() => renderer.render({ ...el, type: MockConsumer }));
} else {
isDOM = false;
const { type: Component } = el;
Expand Down Expand Up @@ -672,6 +717,8 @@ class ReactSixteenAdapter extends EnzymeAdapter {
return !!type && (
typeof type === 'function'
|| isForwardRef(fakeElement)
|| isContextProvider(fakeElement)
|| isContextConsumer(fakeElement)
);
}

Expand Down

0 comments on commit c69b712

Please sign in to comment.