eslint-plugin-jest
Version:
Eslint rules for Jest
67 lines (50 loc) • 2.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,
getNodeName = _require.getNodeName;
const getJestFnCall = node => {
if (node.type !== 'CallExpression' && node.type !== 'MemberExpression' || node.callee && node.callee.type !== 'MemberExpression') {
return null;
}
const obj = node.callee ? node.callee.object : node.object;
if (obj.type === 'Identifier') {
return node.type === 'CallExpression' && getNodeName(node.callee) === 'jest.fn' ? node : null;
}
return getJestFnCall(obj);
};
module.exports = {
meta: {
docs: {
url: getDocsUrl(__filename)
},
messages: {
useJestSpyOn: 'Use jest.spyOn() instead.'
},
fixable: 'code'
},
create(context) {
return {
AssignmentExpression(node) {
if (node.left.type !== 'MemberExpression') return;
const jestFnCall = getJestFnCall(node.right);
if (!jestFnCall) return;
context.report({
node,
messageId: 'useJestSpyOn',
fix(fixer) {
const leftPropQuote = node.left.property.type === 'Identifier' ? "'" : '';
const _jestFnCall$arguments = _slicedToArray(jestFnCall.arguments, 1),
arg = _jestFnCall$arguments[0];
const argSource = arg && context.getSourceCode().getText(arg);
const mockImplementation = argSource ? `.mockImplementation(${argSource})` : '';
return [fixer.insertTextBefore(node.left, `jest.spyOn(`), fixer.replaceTextRange([node.left.object.range[1], node.left.property.range[0]], `, ${leftPropQuote}`), fixer.replaceTextRange([node.left.property.range[1], jestFnCall.range[1]], `${leftPropQuote})${mockImplementation}`)];
}
});
}
};
}
};