enzyme
Version:
JavaScript Testing utilities for React
145 lines (120 loc) • 3.79 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true
});
exports.childrenOfNode = childrenOfNode;
exports.hasClassName = hasClassName;
exports.treeForEach = treeForEach;
exports.treeFilter = treeFilter;
exports.pathToNode = pathToNode;
exports.parentsOfNode = parentsOfNode;
exports.nodeHasId = nodeHasId;
exports.nodeHasType = nodeHasType;
exports.buildPredicate = buildPredicate;
exports.getTextFromNode = getTextFromNode;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _Utils = require('./Utils');
function childrenOfNode(node) {
if (!node) return [];
var maybeArray = (0, _Utils.propsOfNode)(node).children;
var result = [];
_react2['default'].Children.forEach(maybeArray, function (child) {
return result.push(child);
});
return result;
}
function hasClassName(node, className) {
var classes = (0, _Utils.propsOfNode)(node).className || '';
return (' ' + classes + ' ').indexOf(' ' + className + ' ') > -1;
}
function treeForEach(tree, fn) {
fn(tree);
childrenOfNode(tree).forEach(function (node) {
return treeForEach(node, fn);
});
}
function treeFilter(tree, fn) {
var results = [];
treeForEach(tree, function (node) {
if (fn(node)) {
results.push(node);
}
});
return results;
}
function pathToNode(node, root) {
var queue = [root];
var path = [];
while (queue.length) {
var current = queue.pop();
var children = childrenOfNode(current);
if (current === node) return path;
path.push(current);
if (children.length === 0) {
// leaf node. if it isn't the node we are looking for, we pop.
path.pop();
}
queue.push.apply(queue, children);
}
return null;
}
function parentsOfNode(node, root) {
return pathToNode(node, root).reverse();
}
function nodeHasId(node, id) {
var maybeId = node && node._store && node._store.props && node._store.props.id;
return maybeId === id;
}
function nodeHasType(node, type) {
if (!type || !node) return false;
if (!node.type) return false;
if (typeof node.type === 'string') return node.type === type;
return node.type.name === type || node.type.displayName === type;
}
function buildPredicate(selector) {
switch (typeof selector) {
case 'function':
// selector is a component constructor
return function (node) {
return node && node.type === selector;
};
case 'string':
if (!(0, _Utils.isSimpleSelector)(selector)) {
throw (0, _Utils.selectorError)(selector);
}
if (_Utils.isCompoundSelector.test(selector)) {
return (0, _Utils.AND)((0, _Utils.splitSelector)(selector).map(buildPredicate));
}
if (selector[0] === '.') {
// selector is a class name
return function (node) {
return hasClassName(node, selector.substr(1));
};
} else if (selector[0] === '#') {
// selector is an id name
return function (node) {
return nodeHasId(node, selector.substr(1));
};
}
// selector is a string. match to DOM tag or constructor displayName
return function (node) {
return nodeHasType(node, selector);
};
default:
throw new TypeError('Expecting a string or Component Constructor');
}
}
function getTextFromNode(node) {
if (node === null || node === undefined) {
return '';
}
if (typeof node === 'string' || typeof node === 'number') {
return '' + node;
}
if (node.type && typeof node.type === 'function') {
return '<' + (node.type.name || node.type.displayName) + ' />';
}
return childrenOfNode(node).map(getTextFromNode).join('').replace(/\s+/, ' ');
}