Skip to content

Commit 658422b

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 <me@kevin-read.com> Co-authored-by: Pablo Palacios <pablo.palacios@holidaycheck.com>
1 parent 3a7701c commit 658422b

File tree

2 files changed

+85
-3
lines changed

2 files changed

+85
-3
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: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ describe('shallow', () => {
539539
let Consumer;
540540

541541
beforeEach(() => {
542-
({ Provider, Consumer } = React.createContext('howdy!'));
542+
({ Provider, Consumer } = createContext('howdy!'));
543543
});
544544

545545
class Consumes extends React.Component {
@@ -611,7 +611,7 @@ describe('shallow', () => {
611611
let Consumer;
612612

613613
beforeEach(() => {
614-
({ Provider, Consumer } = React.createContext('howdy!'));
614+
({ Provider, Consumer } = createContext('howdy!'));
615615
});
616616

617617
class Consumes extends React.Component {
@@ -666,6 +666,82 @@ 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+
let Provider;
672+
673+
beforeEach(() => {
674+
({ Provider } = createContext('howdy!'));
675+
});
676+
677+
class OuterComponent extends React.Component {
678+
render() {
679+
const { value } = this.props;
680+
return (
681+
<Provider value={value}><InnerComponent /></Provider>
682+
);
683+
}
684+
}
685+
686+
class WrappingComponent extends React.Component {
687+
render() {
688+
const { children, value } = this.props;
689+
return (
690+
<Provider value={value}>{ children }</Provider>
691+
);
692+
}
693+
}
694+
695+
class InnerComponent extends React.Component {
696+
render() {
697+
return this.context;
698+
}
699+
}
700+
701+
InnerComponent.contextType = Provider;
702+
703+
describe('rendering the Provider directly', () => {
704+
it('renders initial context value', () => {
705+
const wrapper = shallow(<OuterComponent value="foo" />);
706+
const provides = wrapper.find(Provider).shallow();
707+
const provider = provides.find(InnerComponent).dive();
708+
709+
expect(provider.text()).to.equal('foo');
710+
});
711+
712+
it('renders updated context value', () => {
713+
const wrapper = shallow(<OuterComponent value="foo" />);
714+
wrapper.setProps({ value: 'bar' });
715+
const provides = wrapper.find(Provider).shallow();
716+
const provider = provides.find(InnerComponent).dive();
717+
718+
expect(provider.text()).to.equal('bar');
719+
});
720+
});
721+
722+
describe('rendering the Provider through wrappingComponent', () => {
723+
it('renders initial context value', () => {
724+
const wrapper = shallow(<InnerComponent />, {
725+
wrappingComponent: WrappingComponent,
726+
wrappingComponentProps: { value: 'foo' },
727+
});
728+
729+
expect(wrapper.text()).to.equal('foo');
730+
});
731+
732+
it('renders updated context value', () => {
733+
const wrapper = shallow(<InnerComponent />, {
734+
wrappingComponent: WrappingComponent,
735+
wrappingComponentProps: { value: 'foo' },
736+
});
737+
const wrappingComponent = wrapper.getWrappingComponent();
738+
wrappingComponent.setProps({ value: 'bar' });
739+
wrappingComponent.rerender();
740+
741+
expect(wrapper.text()).to.equal('bar');
742+
});
743+
});
744+
});
669745
});
670746

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

0 commit comments

Comments
 (0)