Skip to content

Commit

Permalink
Explictly add support for Immutable instead of generic Iterables
Browse files Browse the repository at this point in the history
  • Loading branch information
kmcq committed Oct 27, 2017
1 parent 0fcd897 commit d432c69
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 110 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ export default function elementToTree(el) {
let rendered = null;
if (Array.isArray(children)) {
rendered = flatten(children, true).map(elementToTree);
} else if (children && typeof children.toArray === 'function') {
rendered = flatten(children.toArray(), true).map(elementToTree);
} else if (typeof children !== 'undefined') {
rendered = elementToTree(children);
}
Expand Down
49 changes: 41 additions & 8 deletions packages/enzyme-adapter-utils/src/Utils.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
import flatten from 'lodash/flatten';
import createMountWrapper from './createMountWrapper';
import createRenderWrapper from './createRenderWrapper';
import elementToTree from './elementToTree';
import nodeTypeFromType from './nodeTypeFromType';

export {
createMountWrapper,
createRenderWrapper,
elementToTree,
nodeTypeFromType,
};
export { createMountWrapper, createRenderWrapper };

export function mapNativeEventNames(event) {
const nativeToReactEventMap = {
Expand Down Expand Up @@ -87,6 +81,45 @@ export function assertDomAvailable(feature) {
}
}

export function nodeTypeFromType(type) {
if (typeof type === 'string') {
return 'host';
}
if (
type &&
type.prototype &&
type.prototype.isReactComponent
) {
return 'class';
}
return 'function';
}

export function elementToTree(el) {
if (el === null || typeof el !== 'object' || !('type' in el)) {
return el;
}
const { type, props, key, ref } = el;
const { children } = props;
let rendered = null;
if (Array.isArray(children)) {
rendered = flatten(children, true).map(elementToTree);
} else if (children && typeof children.toArray === 'function') {
rendered = flatten(children.toArray(), true).map(elementToTree);
} else if (typeof children !== 'undefined') {
rendered = elementToTree(children);
}
return {
nodeType: nodeTypeFromType(type),
type,
props,
key,
ref,
instance: null,
rendered,
};
}

export function propsWithKeysAndRef(node) {
if (node.ref !== null || node.key !== null) {
return {
Expand Down
73 changes: 0 additions & 73 deletions packages/enzyme-adapter-utils/src/elementToTree.js

This file was deleted.

13 changes: 0 additions & 13 deletions packages/enzyme-adapter-utils/src/nodeTypeFromType.js

This file was deleted.

27 changes: 11 additions & 16 deletions packages/enzyme-test-suite/test/RSTTraversal-spec.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -195,32 +195,27 @@ describe('RSTTraversal', () => {
</div>,
);
treeForEach(node, spy);
expect(spy.callCount).to.equal(4);
expect(spy.callCount).to.equal(3);
});

it('should handle non-array iterable children', () => {
it('should handle Immutable.js children', () => {
const spy = sinon.spy();
const twoDivIterable = {
'@@iterator'() {
let i = 0;
return {
next() {
i += 1;
if (i < 2) {
return { value: <div key={i} />, done: false };
}
return { value: undefined, done: true };
},
};
// This object mimics only the toArray functionality of Immutable.js
const twoDivImmutable = {
toArray() {
return [
<div key="a" />,
<div key="b" />,
];
},
};
const node = $(
<div>
{twoDivIterable}
{twoDivImmutable}
</div>,
);
treeForEach(node, spy);
expect(spy.callCount).to.equal(4);
expect(spy.callCount).to.equal(3);
});

it('should not get trapped from empty strings', () => {
Expand Down

0 comments on commit d432c69

Please sign in to comment.