UNPKG

jest-test-each

Version:

run parametrised tests easily [typesafe] without text tables or arrays of arrays.

99 lines (97 loc) 3.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.hasFunction = exports.getName = exports.messageFromRenameCode = exports.CODE_RENAME = void 0; const utils_1 = require("./utils"); var CODE_RENAME; (function (CODE_RENAME) { CODE_RENAME["nameTooLong"] = "NAME_TOO_LONG"; CODE_RENAME["nameHasFunctions"] = "NAME_HAS_FUNCTIONS"; })(CODE_RENAME = exports.CODE_RENAME || (exports.CODE_RENAME = {})); const messageFromRenameCode = (code, maxLength) => { switch (code) { case CODE_RENAME.nameTooLong: { return `Automatic test name is too long (>${maxLength}symbols). Please add 'desc' to case.`; } case CODE_RENAME.nameHasFunctions: { return `Test case data has functions in it. Please add 'desc' to case.`; } default: return 'unknown code'; } }; exports.messageFromRenameCode = messageFromRenameCode; const getName = (objs, maxLength) => { // should not throw here const descs = []; const merged = utils_1.merge(objs); const desc = merged.desc; const flatDesc = merged.flatDesc; let code = undefined; if (exports.hasFunction(merged) && !desc && !flatDesc) { code = CODE_RENAME.nameHasFunctions; } const name = (obj, flatDesc, desc) => { if (!flatDesc && !desc) { delete obj.desc; return getNameInt(obj); } return flatDesc || (typeof desc === 'function' ? desc(obj) : desc); }; const fullName = name(merged, flatDesc, desc); objs.forEach(obj => { const untypedObj = Object.assign({}, obj); const descOne = untypedObj.desc; if (descOne) { descs.push(typeof descOne === 'function' ? descOne(untypedObj) : descOne); } }); let mergedDesc = flatDesc || (descs.length > 0 && descs.every(p => !!p) ? descs.join(' ') : descs[0]) || fullName; if (mergedDesc.length > maxLength) { code = CODE_RENAME.nameTooLong; mergedDesc = mergedDesc.substr(0, maxLength) + '...'; } return { name: mergedDesc, code }; }; exports.getName = getName; const getNameInt = (obj) => { let allowedToReplaceNull = true; if (JSON.stringify(obj).includes('null')) { allowedToReplaceNull = false; } let result = JSON.stringify(obj, (k, v) => { if (typeof v === 'function') { return 'function'; } if (v === undefined) { return null; } return v; }); result = result .replace(/^\{(.*)\}$/, '$1') .replace(/"([\w\d]+)":/g, '$1: ') // prop names .replace(/:\s*"([\d\w]+)"/g, ': $1') .replace(/(,|{)/g, '$1 ') .replace(/}/g, ' }') .replace(/{\s*}/g, '{}') .replace(/"/g, `'`); if (allowedToReplaceNull) { result = result.replace('null', 'undefined'); } // todo fix array [{...}] /*const template = /\[{([^}]*)}(,\s*{([^}]*)})*\]/g; const match = template.exec(result); if(match && match.length>0){ const p = match.slice(1).join(', '); return p; }*/ return result; }; const hasFunction = (obj) => { let hasFunction = false; JSON.stringify(obj, (k, v) => (typeof v === 'function' ? (hasFunction = true) : v)); return hasFunction; }; exports.hasFunction = hasFunction;