Skip to content

Commit d2f48f9

Browse files
unverbrauchtpablopalacios
authored andcommitted
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 3d286a4 commit d2f48f9

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)