UNPKG

react-smoke-test-gen

Version:

Automatically generate smoke test for each variation of your component props

285 lines (240 loc) 9.45 kB
'use strict'; 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); }