Skip to content

Commit 6707c28

Browse files
committed
Add support for passing context to React class based components that request context via setting .contextType, according to patches posted in #2189 (comment). Adds changes to ReactSixteenAdapter and simple test case.
1 parent 57baba5 commit 6707c28

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

packages/enzyme-adapter-react-16/src/ReactSixteenAdapter.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,13 @@ class ReactSixteenAdapter extends EnzymeAdapter {
690690
renderedEl = transformSuspense(renderedEl, renderedEl, { suspenseFallback });
691691
const { type: Component } = renderedEl;
692692

693-
const context = getMaskedContext(Component.contextTypes, unmaskedContext);
693+
let context;
694+
if (Component.contextType) {
695+
const Provider = adapter.getProviderFromConsumer(Component.contextType);
696+
context = providerValues.has(Provider) ? providerValues.get(Provider) : getProviderDefaultValue(Provider);
697+
} else {
698+
context = getMaskedContext(Component.contextTypes, unmaskedContext);
699+
}
694700

695701
if (isMemo(el.type)) {
696702
const { type: InnerComp, compare } = el.type;

packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,34 @@ describe('shallow', () => {
666666
expect(consumer.text()).to.equal('foo');
667667
});
668668
});
669+
670+
describe('shallow() on Provider and Consumer through .contextType', () => {
671+
672+
const { Provider } = React.createContext('howdy!');
673+
674+
class OuterComponent extends React.Component {
675+
render() {
676+
return (
677+
<Provider value="foo"><InnerComponent /></Provider>
678+
);
679+
}
680+
}
681+
682+
class InnerComponent extends React.Component {
683+
render() {
684+
return this.context;
685+
}
686+
}
687+
688+
InnerComponent.contextType = Provider;
689+
690+
it('works on a Provider', () => {
691+
const wrapper = shallow(<OuterComponent />);
692+
const provides = wrapper.find(Provider).dive();
693+
const provider = provides.find(InnerComponent).shallow();
694+
expect(provider.text()).to.equal('foo');
695+
});
696+
});
669697
});
670698

671699
describeIf(is('> 0.13'), 'stateless function components (SFCs)', () => {

0 commit comments

Comments
 (0)