Skip to content

Commit aa9828a

Browse files
committed
[enzyme-adapter-react-16] [fix] shallow renderer for memo does not respect defaultProps
Workaround for facebook/react#15556. Fixes #2115.
1 parent 3db6013 commit aa9828a

File tree

6 files changed

+71
-7
lines changed

6 files changed

+71
-7
lines changed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,17 @@ class ReactSixteenAdapter extends EnzymeAdapter {
501501
// Wrap functional components on versions prior to 16.5,
502502
// to avoid inadvertently pass a `this` instance to it.
503503
const wrapFunctionalComponent = (Component) => {
504+
if (is166 && has(Component, 'defaultProps')) {
505+
if (lastComponent !== Component) {
506+
wrappedComponent = Object.assign(
507+
// eslint-disable-next-line new-cap
508+
(props, ...args) => Component({ ...Component.defaultProps, ...props }, ...args),
509+
Component,
510+
);
511+
lastComponent = Component;
512+
}
513+
return wrappedComponent;
514+
}
504515
if (is165) {
505516
return Component;
506517
}

packages/enzyme-test-suite/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@
4242
"object.assign": "^4.1.0",
4343
"prop-types": "^15.7.2",
4444
"react-is": "^16.8.6",
45-
"semver": "^6.0.0",
46-
"sinon-sandbox": "^2.0.0",
47-
"sinon": "^5.1.1"
45+
"semver": "^5.7.0",
46+
"sinon": "^5.1.1",
47+
"sinon-sandbox": "^2.0.0"
4848
},
4949
"peerDependencies": {
5050
"react": "^15.5.0",

packages/enzyme-test-suite/test/_helpers/index.jsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export function describeIf(test, a, b) {
1414
if (test) {
1515
describe(a, b);
1616
} else {
17-
describe.skip(a, b);
17+
describe.skip(a);
1818
}
1919
}
2020

@@ -26,7 +26,9 @@ describeIf.only = (test, a, b) => {
2626
if (test) {
2727
describe.only(a, b);
2828
} else {
29-
describe.skip(a, b);
29+
describe.only('only:', () => {
30+
describe.skip(a);
31+
});
3032
}
3133
};
3234

packages/enzyme-test-suite/test/shared/methods/debug.jsx

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@ import { expect } from 'chai';
44
import { debugNodes } from 'enzyme/build/Debug';
55

66
import {
7+
describeIf,
78
itIf,
89
} from '../../_helpers';
910
import { is } from '../../_helpers/version';
1011

1112
import {
1213
createClass,
14+
memo,
1315
} from '../../_helpers/react-compat';
1416

1517
export default function describeDebug({
1618
Wrap,
19+
WrapRendered,
1720
isShallow,
1821
}) {
1922
describe('.debug()', () => {
@@ -65,5 +68,49 @@ export default function describeDebug({
6568
expect(wrapper.debug()).to.equal(debugNodes(wrapper.getNodesInternal()));
6669
});
6770
});
71+
72+
describeIf(is('>= 16.6'), 'React.memo', () => {
73+
function Add({ a, b, c }) {
74+
return <div>{String(a)}|{String(b)}|{String(c)}</div>;
75+
}
76+
Add.defaultProps = {
77+
b: 2,
78+
c: 3,
79+
};
80+
const MemoAdd = memo(Add);
81+
82+
it('applies defaultProps to the component', () => {
83+
const wrapper = WrapRendered(<Add />);
84+
expect(wrapper.debug()).to.equal(`<div>
85+
undefined
86+
|
87+
2
88+
|
89+
3
90+
</div>`);
91+
});
92+
93+
it('applies defaultProps to the memoized component', () => {
94+
const wrapper = WrapRendered(<MemoAdd />);
95+
expect(wrapper.debug()).to.equal(`<div>
96+
undefined
97+
|
98+
2
99+
|
100+
3
101+
</div>`);
102+
});
103+
104+
it('applies defaultProps to the memoized component and does not override real props', () => {
105+
const wrapper = WrapRendered(<MemoAdd a={10} b={20} />);
106+
expect(wrapper.debug()).to.equal(`<div>
107+
10
108+
|
109+
20
110+
|
111+
3
112+
</div>`);
113+
});
114+
});
68115
});
69116
}

packages/enzyme-test-suite/test/shared/methods/find.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -861,7 +861,7 @@ export default function describeFind({
861861
function InnerComp({ message }) {
862862
return <div><span>{message}</span></div>;
863863
}
864-
const InnerMemo = React.memo(InnerComp);
864+
const InnerMemo = memo(InnerComp);
865865
const InnerFoo = ({ foo }) => (
866866
<div>
867867
<InnerComp message="Hello" />

packages/enzyme-test-suite/test/shared/methods/simulate.jsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ import {
1111
REACT16,
1212
} from '../../_helpers/version';
1313

14+
import {
15+
memo,
16+
} from '../../_helpers/react-compat';
17+
1418
export default function describeSimulate({
1519
Wrap,
1620
WrapperName,
@@ -293,7 +297,7 @@ export default function describeSimulate({
293297
function Child({ onClick }) {
294298
return <button onClick={onClick} type="button" />;
295299
}
296-
const MemoizedChild = React.memo(Child);
300+
const MemoizedChild = memo(Child);
297301

298302
function Parent(props) {
299303
const { onClick } = props;

0 commit comments

Comments
 (0)