UNPKG

eslint-plugin-jest

Version:
70 lines (67 loc) 2.13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _utils = require("@typescript-eslint/utils"); var _utils2 = require("./utils"); var _default = exports.default = (0, _utils2.createRule)({ name: __filename, meta: { fixable: 'code', docs: { description: 'Suggest using `toHaveBeenCalledTimes()`' }, messages: { preferMatcher: 'Prefer `toHaveBeenCalledTimes`' }, type: 'suggestion', schema: [] }, defaultOptions: [], create(context) { return { CallExpression(node) { const jestFnCall = (0, _utils2.parseJestFnCall)(node, context); if (jestFnCall?.type !== 'expect') { return; } const { parent: expect } = jestFnCall.head.node; if (expect.type !== _utils.AST_NODE_TYPES.CallExpression) { return; } const { matcher } = jestFnCall; if (!(0, _utils2.isSupportedAccessor)(matcher, 'toHaveLength')) { return; } const [argument] = expect.arguments; // check if the last property in the chain is `calls` if (argument.type !== _utils.AST_NODE_TYPES.MemberExpression || !(0, _utils2.isSupportedAccessor)(argument.property, 'calls')) { return; } const { object } = argument; // check if the second-to-last property in the chain is `mock` if (object.type !== _utils.AST_NODE_TYPES.MemberExpression || !(0, _utils2.isSupportedAccessor)(object.property, 'mock')) { return; } context.report({ messageId: 'preferMatcher', node: matcher, fix(fixer) { return [ // remove the "mock.calls" accessor chain fixer.removeRange([object.property.range[0] - 1, argument.range[1]]), // replace the current matcher with "toHaveBeenCalledTimes" fixer.replaceTextRange([matcher.parent.object.range[1], matcher.parent.range[1]], '.toHaveBeenCalledTimes')]; } }); } }; } });