Skip to content

Commit dc1426e

Browse files
committed
[enzyme-adapter-utils, enzyme-adapter-react-13] [fix] shallow: throw on mixed children/dangerouslySetInnerHTML
1 parent 8badab7 commit dc1426e

4 files changed

Lines changed: 38 additions & 2 deletions

File tree

packages/enzyme-adapter-react-13/src/ReactThirteenElementToTree.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,19 @@ export default function elementToTree(el) {
2727
} else if (typeof children !== 'undefined') {
2828
rendered = elementToTree(children);
2929
}
30+
31+
const nodeType = nodeTypeFromType(type);
32+
33+
if (nodeType === 'host' && props.dangerouslySetInnerHTML) {
34+
if (props.children != null) {
35+
const error = new Error('Can only set one of `children` or `props.dangerouslySetInnerHTML`.');
36+
error.name = 'Invariant Violation';
37+
throw error;
38+
}
39+
}
40+
3041
return {
31-
nodeType: nodeTypeFromType(type),
42+
nodeType,
3243
type,
3344
props,
3445
key: ensureKeyOrUndefined(key),

packages/enzyme-adapter-utils/src/Utils.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,19 @@ export function elementToTree(el, recurse = elementToTree) {
201201
} else if (typeof children !== 'undefined') {
202202
rendered = recurse(children);
203203
}
204+
205+
const nodeType = nodeTypeFromType(type);
206+
207+
if (nodeType === 'host' && props.dangerouslySetInnerHTML) {
208+
if (props.children != null) {
209+
const error = new Error('Can only set one of `children` or `props.dangerouslySetInnerHTML`.');
210+
error.name = 'Invariant Violation';
211+
throw error;
212+
}
213+
}
214+
204215
return {
205-
nodeType: nodeTypeFromType(type),
216+
nodeType,
206217
type,
207218
props,
208219
key: ensureKeyOrUndefined(key),

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ describeWithDOM('mount', () => {
9191
});
9292

9393
describe('wrapping invalid elements', () => {
94+
it('throws with combined dangerouslySetInnerHTML and children on host nodes', () => {
95+
/* eslint react/no-danger-with-children: 0 */
96+
expect(() => mount((
97+
<div dangerouslySetInnerHTML={{ __html: '{}' }}>child</div>
98+
))).to.throw(Error, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.');
99+
});
100+
94101
itIf(is('>= 16'), 'throws when mounting Portals', () => {
95102
const portal = createPortal(
96103
<div />,

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,13 @@ describe('shallow', () => {
8585
});
8686

8787
describe('wrapping invalid elements', () => {
88+
it('throws with combined dangerouslySetInnerHTML and children on host nodes', () => {
89+
/* eslint react/no-danger-with-children: 0 */
90+
expect(() => shallow((
91+
<div dangerouslySetInnerHTML={{ __html: '{}' }}>child</div>
92+
))).to.throw(Error, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.');
93+
});
94+
8895
itIf(is('>= 16'), 'throws when shallow rendering Portals', () => {
8996
const portal = createPortal(
9097
<div />,

0 commit comments

Comments
 (0)