Skip to content

Commit 16cf05f

Browse files
unverbrauchtpablopalacios
authored andcommitted
[enzyme-adapter-react-16] [new] add contextType support
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. Co-authored-by: Kevin Read <[email protected]> Co-authored-by: Pablo Palacios <[email protected]>
1 parent 3a7701c commit 16cf05f

File tree

2 files changed

+79
-1
lines changed

2 files changed

+79
-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: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,78 @@ describe('shallow', () => {
666666
expect(consumer.text()).to.equal('foo');
667667
});
668668
});
669+
670+
describeIf(is('>= 16.6'), 'shallow() on Provider and Consumer through .contextType', () => {
671+
const { Provider } = createContext('howdy!');
672+
673+
class OuterComponent extends React.Component {
674+
render() {
675+
const { value } = this.props;
676+
return (
677+
<Provider value={value}><InnerComponent /></Provider>
678+
);
679+
}
680+
}
681+
682+
class WrappingComponent extends React.Component {
683+
render() {
684+
const { children, value } = this.props;
685+
return (
686+
<Provider value={value}>{ children }</Provider>
687+
);
688+
}
689+
}
690+
691+
class InnerComponent extends React.Component {
692+
render() {
693+
return this.context;
694+
}
695+
}
696+
697+
InnerComponent.contextType = Provider;
698+
699+
describe('rendering the Provider directly', () => {
700+
it('renders initial context value', () => {
701+
const wrapper = shallow(<OuterComponent value="foo" />);
702+
const provides = wrapper.find(Provider).shallow();
703+
const provider = provides.find(InnerComponent).dive();
704+
705+
expect(provider.text()).to.equal('foo');
706+
});
707+
708+
it('renders updated context value', () => {
709+
const wrapper = shallow(<OuterComponent value="foo" />);
710+
wrapper.setProps({ value: 'bar' });
711+
const provides = wrapper.find(Provider).shallow();
712+
const provider = provides.find(InnerComponent).dive();
713+
714+
expect(provider.text()).to.equal('bar');
715+
});
716+
});
717+
718+
describe('rendering the Provider through wrappingComponent', () => {
719+
it('renders initial context value', () => {
720+
const wrapper = shallow(<InnerComponent />, {
721+
wrappingComponent: WrappingComponent,
722+
wrappingComponentProps: { value: 'foo' },
723+
});
724+
725+
expect(wrapper.text()).to.equal('foo');
726+
});
727+
728+
it('renders updated context value', () => {
729+
const wrapper = shallow(<InnerComponent />, {
730+
wrappingComponent: WrappingComponent,
731+
wrappingComponentProps: { value: 'foo' },
732+
});
733+
const wrappingComponent = wrapper.getWrappingComponent();
734+
wrappingComponent.setProps({ value: 'bar' });
735+
wrappingComponent.rerender();
736+
737+
expect(wrapper.text()).to.equal('bar');
738+
});
739+
});
740+
});
669741
});
670742

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

0 commit comments

Comments
 (0)