eslint-plugin-jest
Version:
Eslint rules for Jest
97 lines (71 loc) • 4.5 kB
JavaScript
;
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
function _iterableToArrayLimit(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"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
const _require = require('./util'),
getDocsUrl = _require.getDocsUrl,
expectCase = _require.expectCase,
expectResolveCase = _require.expectResolveCase,
expectRejectCase = _require.expectRejectCase,
method = _require.method,
argument = _require.argument;
const isEqualityCheck = node => method(node) && (method(node).name === 'toBe' || method(node).name === 'toEqual');
const isArgumentValid = node => argument(node).value === true || argument(node).value === false;
const hasOneArgument = node => node.arguments && node.arguments.length === 1;
const isValidEqualityCheck = node => isEqualityCheck(node) && hasOneArgument(node.parent.parent) && isArgumentValid(node);
const isEqualityNegation = node => method(node).name === 'not' && isValidEqualityCheck(node.parent);
const hasIncludesMethod = node => node.arguments[0] && node.arguments[0].callee && node.arguments[0].callee.property && node.arguments[0].callee.property.name === 'includes';
const isValidIncludesMethod = node => hasIncludesMethod(node) && hasOneArgument(node.arguments[0]);
const getNegationFixes = (node, sourceCode, fixer) => {
const negationPropertyDot = sourceCode.getFirstTokenBetween(node.parent.object, node.parent.property, token => token.value === '.');
const toContainFunc = isEqualityNegation(node) && argument(node.parent).value ? 'not.toContain' : 'toContain'; //.includes function argument
const _node$arguments$0$arg = _slicedToArray(node.arguments[0].arguments, 1),
containArg = _node$arguments$0$arg[0];
return [fixer.remove(negationPropertyDot), fixer.remove(method(node)), fixer.replaceText(method(node.parent), toContainFunc), fixer.replaceText(argument(node.parent), sourceCode.getText(containArg))];
};
const getCommonFixes = (node, sourceCode, fixer) => {
const _node$arguments$0$arg2 = _slicedToArray(node.arguments[0].arguments, 1),
containArg = _node$arguments$0$arg2[0];
const includesCaller = node.arguments[0].callee;
const propertyDot = sourceCode.getFirstTokenBetween(includesCaller.object, includesCaller.property, token => token.value === '.');
const closingParenthesis = sourceCode.getTokenAfter(containArg);
const openParenthesis = sourceCode.getTokenBefore(containArg);
return [fixer.remove(containArg), fixer.remove(includesCaller.property), fixer.remove(propertyDot), fixer.remove(closingParenthesis), fixer.remove(openParenthesis)];
};
module.exports = {
meta: {
docs: {
url: getDocsUrl(__filename)
},
messages: {
useToContain: 'Use toContain() instead'
},
fixable: 'code'
},
create(context) {
return {
CallExpression(node) {
if (!(expectResolveCase(node) || expectRejectCase(node)) && expectCase(node) && (isEqualityNegation(node) || isValidEqualityCheck(node)) && isValidIncludesMethod(node)) {
context.report({
fix(fixer) {
const sourceCode = context.getSourceCode();
let fixArr = getCommonFixes(node, sourceCode, fixer);
if (isEqualityNegation(node)) {
return getNegationFixes(node, sourceCode, fixer).concat(fixArr);
}
const toContainFunc = argument(node).value ? 'toContain' : 'not.toContain'; //.includes function argument
const _node$arguments$0$arg3 = _slicedToArray(node.arguments[0].arguments, 1),
containArg = _node$arguments$0$arg3[0];
fixArr.push(fixer.replaceText(method(node), toContainFunc));
fixArr.push(fixer.replaceText(argument(node), sourceCode.getText(containArg)));
return fixArr;
},
messageId: 'useToContain',
node: method(node)
});
}
}
};
}
};