Skip to content

Commit 5774d0d

Browse files
authored
Merge pull request #1761 from jgzuke/jgzuke-support-portal-shallow
[enzyme-adapter-react-16*, enzyme-adapter-utils] [new] `shallow`: add support for Portals
2 parents 997f95a + 892d368 commit 5774d0d

File tree

7 files changed

+273
-16
lines changed

7 files changed

+273
-16
lines changed

packages/enzyme-adapter-react-16.1/src/ReactSixteenOneAdapter.js

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@ import ShallowRenderer from 'react-test-renderer/shallow';
99
import TestUtils from 'react-dom/test-utils';
1010
import {
1111
isElement,
12+
isPortal,
1213
isValidElementType,
1314
Fragment,
1415
Portal,
1516
} from 'react-is';
1617
import { EnzymeAdapter } from 'enzyme';
1718
import {
1819
displayNameOfNode,
19-
elementToTree,
20-
nodeTypeFromType,
20+
elementToTree as utilElementToTree,
21+
nodeTypeFromType as utilNodeTypeFromType,
2122
mapNativeEventNames,
2223
propFromEvent,
2324
assertDomAvailable,
@@ -72,6 +73,33 @@ function flatten(arr) {
7273
return result;
7374
}
7475

76+
function nodeTypeFromType(type) {
77+
if (type === Portal) {
78+
return 'portal';
79+
}
80+
81+
return utilNodeTypeFromType(type);
82+
}
83+
84+
function elementToTree(el) {
85+
if (!isPortal(el)) {
86+
return utilElementToTree(el, elementToTree);
87+
}
88+
89+
const { children, containerInfo } = el;
90+
const props = { children, containerInfo };
91+
92+
return {
93+
nodeType: 'portal',
94+
type: Portal,
95+
props,
96+
key: ensureKeyOrUndefined(el.key),
97+
ref: el.ref,
98+
instance: null,
99+
rendered: elementToTree(el.children),
100+
};
101+
}
102+
75103
function toTree(vnode) {
76104
if (vnode == null) {
77105
return null;
@@ -280,7 +308,7 @@ class ReactSixteenOneAdapter extends EnzymeAdapter {
280308
ref: cachedNode.ref,
281309
instance: renderer._instance,
282310
rendered: Array.isArray(output)
283-
? flatten(output).map(elementToTree)
311+
? flatten(output).map(el => elementToTree(el))
284312
: elementToTree(output),
285313
};
286314
},

packages/enzyme-adapter-react-16.2/src/ReactSixteenTwoAdapter.js

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import ShallowRenderer from 'react-test-renderer/shallow';
99
import TestUtils from 'react-dom/test-utils';
1010
import {
1111
isElement,
12+
isPortal,
1213
isValidElementType,
1314
Fragment,
1415
Portal,
@@ -17,8 +18,8 @@ import { EnzymeAdapter } from 'enzyme';
1718
import { typeOfNode } from 'enzyme/build/Utils';
1819
import {
1920
displayNameOfNode,
20-
elementToTree,
21-
nodeTypeFromType,
21+
elementToTree as utilElementToTree,
22+
nodeTypeFromType as utilNodeTypeFromType,
2223
mapNativeEventNames,
2324
propFromEvent,
2425
assertDomAvailable,
@@ -73,6 +74,33 @@ function flatten(arr) {
7374
return result;
7475
}
7576

77+
function nodeTypeFromType(type) {
78+
if (type === Portal) {
79+
return 'portal';
80+
}
81+
82+
return utilNodeTypeFromType(type);
83+
}
84+
85+
function elementToTree(el) {
86+
if (!isPortal(el)) {
87+
return utilElementToTree(el, elementToTree);
88+
}
89+
90+
const { children, containerInfo } = el;
91+
const props = { children, containerInfo };
92+
93+
return {
94+
nodeType: 'portal',
95+
type: Portal,
96+
props,
97+
key: ensureKeyOrUndefined(el.key),
98+
ref: el.ref,
99+
instance: null,
100+
rendered: elementToTree(el.children),
101+
};
102+
}
103+
76104
function toTree(vnode) {
77105
if (vnode == null) {
78106
return null;
@@ -282,7 +310,7 @@ class ReactSixteenTwoAdapter extends EnzymeAdapter {
282310
ref: cachedNode.ref,
283311
instance: renderer._instance,
284312
rendered: Array.isArray(output)
285-
? flatten(output).map(elementToTree)
313+
? flatten(output).map(el => elementToTree(el))
286314
: elementToTree(output),
287315
};
288316
},

packages/enzyme-adapter-react-16.3/src/ReactSixteenThreeAdapter.js

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import ShallowRenderer from 'react-test-renderer/shallow';
1010
import TestUtils from 'react-dom/test-utils';
1111
import {
1212
isElement,
13+
isPortal,
1314
isValidElementType,
1415
AsyncMode,
1516
Fragment,
@@ -24,8 +25,8 @@ import { EnzymeAdapter } from 'enzyme';
2425
import { typeOfNode } from 'enzyme/build/Utils';
2526
import {
2627
displayNameOfNode,
27-
elementToTree,
28-
nodeTypeFromType,
28+
elementToTree as utilElementToTree,
29+
nodeTypeFromType as utilNodeTypeFromType,
2930
mapNativeEventNames,
3031
propFromEvent,
3132
assertDomAvailable,
@@ -78,6 +79,33 @@ function flatten(arr) {
7879
return result;
7980
}
8081

82+
function nodeTypeFromType(type) {
83+
if (type === Portal) {
84+
return 'portal';
85+
}
86+
87+
return utilNodeTypeFromType(type);
88+
}
89+
90+
function elementToTree(el) {
91+
if (!isPortal(el)) {
92+
return utilElementToTree(el, elementToTree);
93+
}
94+
95+
const { children, containerInfo } = el;
96+
const props = { children, containerInfo };
97+
98+
return {
99+
nodeType: 'portal',
100+
type: Portal,
101+
props,
102+
key: ensureKeyOrUndefined(el.key),
103+
ref: el.ref,
104+
instance: null,
105+
rendered: elementToTree(el.children),
106+
};
107+
}
108+
81109
function toTree(vnode) {
82110
if (vnode == null) {
83111
return null;
@@ -300,7 +328,7 @@ class ReactSixteenThreeAdapter extends EnzymeAdapter {
300328
ref: cachedNode.ref,
301329
instance: renderer._instance,
302330
rendered: Array.isArray(output)
303-
? flatten(output).map(elementToTree)
331+
? flatten(output).map(el => elementToTree(el))
304332
: elementToTree(output),
305333
};
306334
},

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

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import ShallowRenderer from 'react-test-renderer/shallow';
1010
import TestUtils from 'react-dom/test-utils';
1111
import {
1212
isElement,
13+
isPortal,
1314
isValidElementType,
1415
AsyncMode,
1516
Fragment,
@@ -24,8 +25,8 @@ import { EnzymeAdapter } from 'enzyme';
2425
import { typeOfNode } from 'enzyme/build/Utils';
2526
import {
2627
displayNameOfNode,
27-
elementToTree,
28-
nodeTypeFromType,
28+
elementToTree as utilElementToTree,
29+
nodeTypeFromType as utilNodeTypeFromType,
2930
mapNativeEventNames,
3031
propFromEvent,
3132
assertDomAvailable,
@@ -78,6 +79,33 @@ function flatten(arr) {
7879
return result;
7980
}
8081

82+
function nodeTypeFromType(type) {
83+
if (type === Portal) {
84+
return 'portal';
85+
}
86+
87+
return utilNodeTypeFromType(type);
88+
}
89+
90+
function elementToTree(el) {
91+
if (!isPortal(el)) {
92+
return utilElementToTree(el, elementToTree);
93+
}
94+
95+
const { children, containerInfo } = el;
96+
const props = { children, containerInfo };
97+
98+
return {
99+
nodeType: 'portal',
100+
type: Portal,
101+
props,
102+
key: ensureKeyOrUndefined(el.key),
103+
ref: el.ref,
104+
instance: null,
105+
rendered: elementToTree(el.children),
106+
};
107+
}
108+
81109
function toTree(vnode) {
82110
if (vnode == null) {
83111
return null;
@@ -303,7 +331,7 @@ class ReactSixteenAdapter extends EnzymeAdapter {
303331
ref: cachedNode.ref,
304332
instance: renderer._instance,
305333
rendered: Array.isArray(output)
306-
? flatten(output).map(elementToTree)
334+
? flatten(output).map(el => elementToTree(el))
307335
: elementToTree(output),
308336
};
309337
},

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,11 @@ export function ensureKeyOrUndefined(key) {
180180
return key || (key === '' ? '' : undefined);
181181
}
182182

183-
export function elementToTree(el) {
183+
export function elementToTree(el, recurse = elementToTree) {
184+
if (typeof recurse !== 'function' && arguments.length === 3) {
185+
// special case for backwards compat for `.map(elementToTree)`
186+
recurse = elementToTree; // eslint-disable-line no-param-reassign
187+
}
184188
if (el === null || typeof el !== 'object' || !('type' in el)) {
185189
return el;
186190
}
@@ -193,9 +197,9 @@ export function elementToTree(el) {
193197
const { children } = props;
194198
let rendered = null;
195199
if (isArrayLike(children)) {
196-
rendered = flatten(children).map(elementToTree);
200+
rendered = flatten(children).map(x => recurse(x));
197201
} else if (typeof children !== 'undefined') {
198-
rendered = elementToTree(children);
202+
rendered = recurse(children);
199203
}
200204
return {
201205
nodeType: nodeTypeFromType(type),

packages/enzyme-test-suite/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
"eslint-config-airbnb": "^17.1.0",
5050
"eslint-plugin-import": "^2.14.0",
5151
"eslint-plugin-jsx-a11y": "^6.1.1",
52-
"eslint-plugin-react": "^7.11.1"
52+
"eslint-plugin-react": "^7.11.1",
53+
"react-is": "^16.4.2"
5354
}
5455
}

0 commit comments

Comments
 (0)