UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

113 lines 14.2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.assertType = exports.is = void 0; const lodash_1 = require("lodash"); const _1 = require("./"); const types_1 = require("../types"); const hook_1 = __importDefault(require("../../api/request-hooks/hook")); const test_timeout_1 = __importDefault(require("../../api/structure/test-timeout")); const START_FROM_VOWEL_RE = /^[aeiou]/i; function getIndefiniteArticle(text) { return START_FROM_VOWEL_RE.test(text) ? 'an' : 'a'; } function isNonNegativeValue(value) { return (0, lodash_1.isFinite)(value) && value >= 0; } function getNumberTypeActualValueMsg(value, type) { if (type !== 'number') return type; if (Number.isNaN(value)) return NaN; if (!(0, lodash_1.isFinite)(value)) return Infinity; return value; } function hasSomePropInObject(obj, props) { return !!obj && typeof obj === 'object' && props.some(prop => prop in obj); } exports.is = { number: { name: 'number', predicate: lodash_1.isFinite, getActualValueMsg: getNumberTypeActualValueMsg, }, nonNegativeNumber: { name: 'non-negative number', predicate: isNonNegativeValue, getActualValueMsg: getNumberTypeActualValueMsg, }, nonNegativeNumberString: { name: 'non-negative number', predicate: value => isNonNegativeValue(parseInt(value, 10)), getActualValueMsg: value => { const number = parseInt(value, 10); return isNaN(number) ? JSON.stringify(value) : number; }, }, boolean: { name: 'boolean', predicate: (value, type) => type === 'boolean', }, string: { name: 'string', predicate: (value, type) => type === 'string', }, function: { name: 'function', predicate: (value, type) => type === 'function', }, regExp: { name: 'regular expression', predicate: lodash_1.isRegExp, }, array: { name: 'array', predicate: value => Array.isArray(value), }, nonNullObject: { name: 'non-null object', predicate: (value, type) => type === 'object' && !(0, lodash_1.isNil)(value), getActualValueMsg: (value, type) => (0, lodash_1.isNil)(value) ? String(value) : type, }, requestHookSubclass: { name: 'RequestHook subclass', predicate: value => value instanceof hook_1.default && value.constructor && value.constructor !== hook_1.default, }, clientScriptInitializer: { name: 'client script initializer', predicate: obj => hasSomePropInObject(obj, ['path', 'content', 'module']), }, testTimeouts: { name: 'test timeouts initializer', predicate: obj => hasSomePropInObject(obj, Object.keys(test_timeout_1.default)), }, }; function assertType(types, callsiteName, what, value) { types = (0, lodash_1.castArray)(types); let pass = false; const actualType = typeof value; let actualMsg = actualType; let expectedTypeMsg = ''; const last = types.length - 1; types.forEach((type, i) => { pass = pass || type.predicate(value, actualType); if (type.getActualValueMsg) actualMsg = type.getActualValueMsg(value, actualType); if (i === 0) expectedTypeMsg += type.name; else expectedTypeMsg += (i === last ? ' or ' + getIndefiniteArticle(type.name) + ' ' : ', ') + type.name; }); if (!pass) { throw callsiteName ? new _1.APIError(callsiteName, types_1.RUNTIME_ERRORS.invalidValueType, what, actualMsg, expectedTypeMsg) : new _1.GeneralError(types_1.RUNTIME_ERRORS.invalidValueType, what, actualMsg, expectedTypeMsg); } } exports.assertType = assertType; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1hc3NlcnRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Vycm9ycy9ydW50aW1lL3R5cGUtYXNzZXJ0aW9ucy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtQ0FLZ0I7QUFFaEIseUJBQTRDO0FBQzVDLG9DQUEwQztBQUMxQyx3RUFBdUQ7QUFDdkQsb0ZBQTJEO0FBRTNELE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDO0FBRXhDLFNBQVMsb0JBQW9CLENBQUUsSUFBSTtJQUMvQixPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDdkQsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUUsS0FBSztJQUM5QixPQUFPLElBQUEsaUJBQWMsRUFBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRCxTQUFTLDJCQUEyQixDQUFFLEtBQUssRUFBRSxJQUFJO0lBQzdDLElBQUksSUFBSSxLQUFLLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUM7SUFFaEIsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUNuQixPQUFPLEdBQUcsQ0FBQztJQUVmLElBQUksQ0FBQyxJQUFBLGlCQUFjLEVBQUMsS0FBSyxDQUFDO1FBQ3RCLE9BQU8sUUFBUSxDQUFDO0lBRXBCLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFFLEdBQUcsRUFBRSxLQUFLO0lBQ3BDLE9BQU8sQ0FBQyxDQUFDLEdBQUc7UUFDUixPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVZLFFBQUEsRUFBRSxHQUFH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QkQsZ0NBMEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBpc0Zpbml0ZSBhcyBpc0Zpbml0ZU51bWJlcixcbiAgICBpc1JlZ0V4cCxcbiAgICBpc05pbCBhcyBpc051bGxPclVuZGVmaW5lZCxcbiAgICBjYXN0QXJyYXksXG59IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IEFQSUVycm9yLCBHZW5lcmFsRXJyb3IgfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBSZXF1ZXN0SG9vayBmcm9tICcuLi8uLi9hcGkvcmVxdWVzdC1ob29rcy9ob29rJztcbmltcG9ydCBUZXN0VGltZW91dCBmcm9tICcuLi8uLi9hcGkvc3RydWN0dXJlL3Rlc3QtdGltZW91dCc7XG5cbmNvbnN0IFNUQVJUX0ZST01fVk9XRUxfUkUgPSAvXlthZWlvdV0vaTtcblxuZnVuY3Rpb24gZ2V0SW5kZWZpbml0ZUFydGljbGUgKHRleHQpIHtcbiAgICByZXR1cm4gU1RBUlRfRlJPTV9WT1dFTF9SRS50ZXN0KHRleHQpID8gJ2FuJyA6ICdhJztcbn1cblxuZnVuY3Rpb24gaXNOb25OZWdhdGl2ZVZhbHVlICh2YWx1ZSkge1xuICAgIHJldHVybiBpc0Zpbml0ZU51bWJlcih2YWx1ZSkgJiYgdmFsdWUgPj0gMDtcbn1cblxuZnVuY3Rpb24gZ2V0TnVtYmVyVHlwZUFjdHVhbFZhbHVlTXNnICh2YWx1ZSwgdHlwZSkge1xuICAgIGlmICh0eXBlICE9PSAnbnVtYmVyJylcbiAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIE5hTjtcblxuICAgIGlmICghaXNGaW5pdGVOdW1iZXIodmFsdWUpKVxuICAgICAgICByZXR1cm4gSW5maW5pdHk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGhhc1NvbWVQcm9wSW5PYmplY3QgKG9iaiwgcHJvcHMpIHtcbiAgICByZXR1cm4gISFvYmogJiZcbiAgICAgICAgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgcHJvcHMuc29tZShwcm9wID0+IHByb3AgaW4gb2JqKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzID0ge1xuICAgIG51bWJlcjoge1xuICAgICAgICBuYW1lOiAgICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgIHByZWRpY2F0ZTogICAgICAgICBpc0Zpbml0ZU51bWJlcixcbiAgICAgICAgZ2V0QWN0dWFsVmFsdWVNc2c6IGdldE51bWJlclR5cGVBY3R1YWxWYWx1ZU1zZyxcbiAgICB9LFxuXG4gICAgbm9uTmVnYXRpdmVOdW1iZXI6IHtcbiAgICAgICAgbmFtZTogICAgICAgICAgICAgICdub24tbmVnYXRpdmUgbnVtYmVyJyxcbiAgICAgICAgcHJlZGljYXRlOiAgICAgICAgIGlzTm9uTmVnYXRpdmVWYWx1ZSxcbiAgICAgICAgZ2V0QWN0dWFsVmFsdWVNc2c6IGdldE51bWJlclR5cGVBY3R1YWxWYWx1ZU1zZyxcbiAgICB9LFxuXG4gICAgbm9uTmVnYXRpdmVOdW1iZXJTdHJpbmc6IHtcbiAgICAgICAgbmFtZTogICAgICAnbm9uLW5lZ2F0aXZlIG51bWJlcicsXG4gICAgICAgIHByZWRpY2F0ZTogdmFsdWUgPT4gaXNOb25OZWdhdGl2ZVZhbHVlKHBhcnNlSW50KHZhbHVlLCAxMCkpLFxuXG4gICAgICAgIGdldEFjdHVhbFZhbHVlTXNnOiB2YWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBudW1iZXIgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuXG4gICAgICAgICAgICByZXR1cm4gaXNOYU4obnVtYmVyKSA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IG51bWJlcjtcbiAgICAgICAgfSxcbiAgICB9LFxuXG4gICAgYm9vbGVhbjoge1xuICAgICAgICBuYW1lOiAgICAgICdib29sZWFuJyxcbiAgICAgICAgcHJlZGljYXRlOiAodmFsdWUsIHR5cGUpID0+IHR5cGUgPT09ICdib29sZWFuJyxcbiAgICB9LFxuXG4gICAgc3RyaW5nOiB7XG4gICAgICAgIG5hbWU6ICAgICAgJ3N0cmluZycsXG4gICAgICAgIHByZWRpY2F0ZTogKHZhbHVlLCB0eXBlKSA9PiB0eXBlID09PSAnc3RyaW5nJyxcbiAgICB9LFxuXG4gICAgZnVuY3Rpb246IHtcbiAgICAgICAgbmFtZTogICAgICAnZnVuY3Rpb24nLFxuICAgICAgICBwcmVkaWNhdGU6ICh2YWx1ZSwgdHlwZSkgPT4gdHlwZSA9PT0gJ2Z1bmN0aW9uJyxcbiAgICB9LFxuXG4gICAgcmVnRXhwOiB7XG4gICAgICAgIG5hbWU6ICAgICAgJ3JlZ3VsYXIgZXhwcmVzc2lvbicsXG4gICAgICAgIHByZWRpY2F0ZTogaXNSZWdFeHAsXG4gICAgfSxcblxuICAgIGFycmF5OiB7XG4gICAgICAgIG5hbWU6ICAgICAgJ2FycmF5JyxcbiAgICAgICAgcHJlZGljYXRlOiB2YWx1ZSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSxcbiAgICB9LFxuXG4gICAgbm9uTnVsbE9iamVjdDoge1xuICAgICAgICBuYW1lOiAgICAgICAgICAgICAgJ25vbi1udWxsIG9iamVjdCcsXG4gICAgICAgIHByZWRpY2F0ZTogICAgICAgICAodmFsdWUsIHR5cGUpID0+IHR5cGUgPT09ICdvYmplY3QnICYmICFpc051bGxPclVuZGVmaW5lZCh2YWx1ZSksXG4gICAgICAgIGdldEFjdHVhbFZhbHVlTXNnOiAodmFsdWUsIHR5cGUpID0+IGlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSA/IFN0cmluZyh2YWx1ZSkgOiB0eXBlLFxuICAgIH0sXG5cbiAgICByZXF1ZXN0SG9va1N1YmNsYXNzOiB7XG4gICAgICAgIG5hbWU6ICAgICAgJ1JlcXVlc3RIb29rIHN1YmNsYXNzJyxcbiAgICAgICAgcHJlZGljYXRlOiB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFJlcXVlc3RIb29rICYmIHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yICE9PSBSZXF1ZXN0SG9vayxcbiAgICB9LFxuXG4gICAgY2xpZW50U2NyaXB0SW5pdGlhbGl6ZXI6IHtcbiAgICAgICAgbmFtZTogICAgICAnY2xpZW50IHNjcmlwdCBpbml0aWFsaXplcicsXG4gICAgICAgIHByZWRpY2F0ZTogb2JqID0+IGhhc1NvbWVQcm9wSW5PYmplY3Qob2JqLCBbJ3BhdGgnLCAnY29udGVudCcsICdtb2R1bGUnXSksXG4gICAgfSxcblxuICAgIHRlc3RUaW1lb3V0czoge1xuICAgICAgICBuYW1lOiAgICAgICd0ZXN0IHRpbWVvdXRzIGluaXRpYWxpemVyJyxcbiAgICAgICAgcHJlZGljYXRlOiBvYmogPT4gaGFzU29tZVByb3BJbk9iamVjdChvYmosIE9iamVjdC5rZXlzKFRlc3RUaW1lb3V0KSksXG4gICAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUeXBlICh0eXBlcywgY2FsbHNpdGVOYW1lLCB3aGF0LCB2YWx1ZSkge1xuICAgIHR5cGVzID0gY2FzdEFycmF5KHR5cGVzKTtcblxuICAgIGxldCBwYXNzICAgICAgICAgICAgPSBmYWxzZTtcbiAgICBjb25zdCBhY3R1YWxUeXBlICAgID0gdHlwZW9mIHZhbHVlO1xuICAgIGxldCBhY3R1YWxNc2cgICAgICAgPSBhY3R1YWxUeXBlO1xuICAgIGxldCBleHBlY3RlZFR5cGVNc2cgPSAnJztcbiAgICBjb25zdCBsYXN0ICAgICAgICAgICAgPSB0eXBlcy5sZW5ndGggLSAxO1xuXG4gICAgdHlwZXMuZm9yRWFjaCgodHlwZSwgaSkgPT4ge1xuICAgICAgICBwYXNzID0gcGFzcyB8fCB0eXBlLnByZWRpY2F0ZSh2YWx1ZSwgYWN0dWFsVHlwZSk7XG5cbiAgICAgICAgaWYgKHR5cGUuZ2V0QWN0dWFsVmFsdWVNc2cpXG4gICAgICAgICAgICBhY3R1YWxNc2cgPSB0eXBlLmdldEFjdHVhbFZhbHVlTXNnKHZhbHVlLCBhY3R1YWxUeXBlKTtcblxuICAgICAgICBpZiAoaSA9PT0gMClcbiAgICAgICAgICAgIGV4cGVjdGVkVHlwZU1zZyArPSB0eXBlLm5hbWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGV4cGVjdGVkVHlwZU1zZyArPSAoaSA9PT0gbGFzdCA/ICcgb3IgJyArIGdldEluZGVmaW5pdGVBcnRpY2xlKHR5cGUubmFtZSkgKyAnICcgOiAnLCAnKSArIHR5cGUubmFtZTtcbiAgICB9KTtcblxuICAgIGlmICghcGFzcykge1xuICAgICAgICB0aHJvdyBjYWxsc2l0ZU5hbWUgP1xuICAgICAgICAgICAgbmV3IEFQSUVycm9yKGNhbGxzaXRlTmFtZSwgUlVOVElNRV9FUlJPUlMuaW52YWxpZFZhbHVlVHlwZSwgd2hhdCwgYWN0dWFsTXNnLCBleHBlY3RlZFR5cGVNc2cpIDpcbiAgICAgICAgICAgIG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuaW52YWxpZFZhbHVlVHlwZSwgd2hhdCwgYWN0dWFsTXNnLCBleHBlY3RlZFR5cGVNc2cpO1xuICAgIH1cbn1cbiJdfQ==