jest-test-each
Version:
run parametrised tests easily [typesafe] without text tables or arrays of arrays.
99 lines (97 loc) • 3.37 kB
JavaScript
;
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;