UNPKG

eslint-plugin-jest

Version:
67 lines (50 loc) 2.5 kB
'use strict'; 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}`)]; } }); } }; } };