react-smoke-test-gen
Version:
Automatically generate smoke test for each variation of your component props
285 lines (240 loc) • 9.45 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.default = fakeProps;
var _reactDocgen = require('react-docgen');
var _unquote = require('unquote');
var _unquote2 = _interopRequireDefault(_unquote);
var _lodash = require('lodash.topairs');
var _lodash2 = _interopRequireDefault(_lodash);
var _lodash3 = require('lodash.frompairs');
var _lodash4 = _interopRequireDefault(_lodash3);
var _lodash5 = require('lodash.groupBy');
var _lodash6 = _interopRequireDefault(_lodash5);
var _lodash7 = require('lodash.map');
var _lodash8 = _interopRequireDefault(_lodash7);
var _lodash9 = require('lodash.flow');
var _lodash10 = _interopRequireDefault(_lodash9);
var _jsCombinatorics = require('js-combinatorics');
var _jsCombinatorics2 = _interopRequireDefault(_jsCombinatorics);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var fs = require('fs');
var React = require('react');
var A = [{ name: 'vasya' }, { name: 'petya' }, { name: 'andrey' }];
var B = [{ role: 'animal' }, { role: 'human' }];
var arrayx = [];
arrayx.push(A);
arrayx.push(B);
function getEnum(values, generate) {
values.forEach(function (_ref) {
var value = _ref.value;
generate(typeof value === 'string' ? (0, _unquote2.default)(value) : value);
});
}
function getUnion(propName, values, generate) {
var newValues = values.map(function (_ref2) {
var name = _ref2.name;
return getPropValue(propName, { type: { name: name } });
});
newValues.forEach(generate);
}
function getShape(propName, object, generate) {
var res = [];
var notEnum = {};
var enumX = [];
Object.keys(object).forEach(function (key) {
var type = object[key];
var generateX = function generateX(fakeP) {
return enumX.push(_defineProperty({}, key, fakeP));
};
var fakeProp = getPropValue(propName + '.' + key, { type: type }, generateX);
if (fakeProp) notEnum[key] = fakeProp;
});
enumX.forEach(function (enumX) {
return res.push(_extends({}, notEnum, enumX));
});
res.forEach(function (shape) {
return generate(shape);
});
}
function getArrayOf(propName, type, generate) {
return [getPropValue(propName, { type: type }, generate)];
}
function getObjectOf(propName, type, generate) {
return { prop: getPropValue(propName, { type: type }, generate) };
}
function getPropValue(propName, prop) {
var generate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {
return void 0;
};
switch (prop.type.name) {
case 'array':
return [];
case 'bool':
generate(true);
generate(false);
return undefined;
case 'func':
return function fakeFunction() {};
case 'number':
return 1;
case 'object':
return _defineProperty({}, propName, propName);
case 'string':
return propName;
case 'symbol':
return Symbol();
case 'node':
return propName;
case 'element':
return React.createElement('div', [], 'fake ' + propName + ' element');
case 'instanceOf':
return 'instanceOf type not supported, please set the correct value for ' + propName + ' prop';
case 'enum':
getEnum(prop.type.value, generate);
return undefined;
case 'union':
getUnion(propName, prop.type.value, generate);
return undefined;
case 'arrayOf':
return getArrayOf(propName, prop.type.value, generate);
case 'objectOf':
return getObjectOf(propName, prop.type.value, generate);
case 'shape':
var shape = getShape(propName, prop.type.value, generate);
return undefined;
case 'any':
return 'any';
case 'custom':
return 'custom type not supported, please set the correct value for ' + propName + ' prop';
default:
return 'Error, unknown type';
}
}
// function getPropValue(propName, prop, generate = () => void 0) {
// switch (prop.type.name) {
// case 'array':
// return [];
// case 'bool':
// generate(true);
// generate(false);
// return undefined;
// case 'func':
// return function fakeFunction() {};
// case 'number':
// return 1;
// case 'object':
// return { [propName]: propName }
// case 'string':
// return propName;
// case 'symbol':
// return Symbol();
// case 'node':
// return propName;
// case 'element':
// return React.createElement('div', [], `fake ${propName} element`)
// case 'instanceOf':
// return `instanceOf type not supported, please set the correct value for ${propName} prop`
// case 'enum':
// getEnum(prop.type.value, generate)
// return undefined;
// case 'union':
// getUnion(propName, prop.type.value, generate)
// return undefined;
// case 'arrayOf':
// return getArrayOf(propName, prop.type.value, generate)
// case 'objectOf':
// return getObjectOf(propName, prop.type.value, generate)
// case 'shape':
// const shape = getShape(propName, prop.type.value, generate)
// return undefined;
// case 'any':
// return 'any'
// case 'custom':
// return `custom type not supported, please set the correct value for ${propName} prop`
// default:
// return 'Error, unknown type'
// }
// }
function generatePropsValues(propName, prop) {
var props = [];
var addProp = function addProp(prop) {
return props.push(prop);
};
var propValue = getPropValue(propName, prop, addProp);
if (propValue) addProp(propValue);
return props;
}
function fakeProps(file) {
var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
_ref4$generateTestNam = _ref4.generateTestName,
generateTestName = _ref4$generateTestNam === undefined ? function (propName, propValue) {
return propName + '=' + propValue;
} : _ref4$generateTestNam;
var source = fs.readFileSync(file);
var _parse = (0, _reactDocgen.parse)(source),
props = _parse.props;
var generateTestCase = function generateTestCase(propName, propValue, requiredProps) {
return {
name: generateTestName(propName, JSON.stringify(propValue)),
props: _extends({}, requiredProps, _defineProperty({}, propName, propValue))
};
};
var generateFakeProps = (0, _lodash10.default)([_lodash2.default, function (props) {
return (0, _lodash6.default)(props, function (_ref5) {
var _ref6 = _slicedToArray(_ref5, 2),
propName = _ref6[0],
propValue = _ref6[1];
return propValue.required;
});
}, function (_ref7) {
var notRequiredProps = _ref7.false,
requiredProps = _ref7.true;
return {
notRequiredProps: notRequiredProps,
requiredProps: requiredProps
};
}, function (_ref8) {
var req = _ref8.requiredProps,
notRequiredProps = _ref8.notRequiredProps;
var result = [];
var requiredProps = {};
var cartesian = [];
req && req.forEach(function (_ref9) {
var _ref10 = _slicedToArray(_ref9, 2),
propName = _ref10[0],
propValue = _ref10[1];
return requiredProps[propName] = getPropValue(propName, propValue);
});
notRequiredProps.forEach(function (_ref11) {
var _ref12 = _slicedToArray(_ref11, 2),
propName = _ref12[0],
propValue = _ref12[1];
var values = generatePropsValues(propName, propValue);
values.length > 1 && cartesian.push(values.map(function (value) {
return generateTestCase(propName, value, requiredProps);
}));
// values.forEach(value => result.push(generateTestCase(propName, value, requiredProps)));
});
var carProduct = _jsCombinatorics2.default.cartesianProduct.apply(_jsCombinatorics2.default, cartesian).toArray();
var vo = carProduct.map(function (product) {
return product.reduce(function (v, k) {
var res = {
name: v.name + ', ' + k.name,
props: _extends({}, v.props, k.props)
// console.log('res', res);
};return res;
}, { name: '', props: {} });
});
// console.log(vo);
return {
testCases: vo,
requiredProps: Object.keys(requiredProps).length ? requiredProps : void 0
};
}]);
return generateFakeProps(props);
}