diff --git a/src/rules/__tests__/prefer-called-with.test.js b/src/rules/__tests__/prefer-called-with.test.ts similarity index 90% rename from src/rules/__tests__/prefer-called-with.test.js rename to src/rules/__tests__/prefer-called-with.test.ts index 5a641a648..78c130d6d 100644 --- a/src/rules/__tests__/prefer-called-with.test.js +++ b/src/rules/__tests__/prefer-called-with.test.ts @@ -1,7 +1,7 @@ -import { RuleTester } from 'eslint'; +import { TSESLint } from '@typescript-eslint/experimental-utils'; import rule from '../prefer-called-with'; -const ruleTester = new RuleTester(); +const ruleTester = new TSESLint.RuleTester(); ruleTester.run('prefer-called-with', rule, { valid: [ diff --git a/src/rules/prefer-called-with.js b/src/rules/prefer-called-with.js deleted file mode 100644 index 0e4f99554..000000000 --- a/src/rules/prefer-called-with.js +++ /dev/null @@ -1,36 +0,0 @@ -import { - expectCaseWithParent, - expectNotCase, - getDocsUrl, - method, -} from './util'; - -export default { - meta: { - docs: { - url: getDocsUrl(__filename), - }, - messages: { - preferCalledWith: 'Prefer {{name}}With(/* expected args */)', - }, - schema: [], - }, - create(context) { - return { - CallExpression(node) { - // Could check resolves/rejects here but not a likely idiom. - if (expectCaseWithParent(node) && !expectNotCase(node)) { - const methodNode = method(node); - const { name } = methodNode; - if (name === 'toBeCalled' || name === 'toHaveBeenCalled') { - context.report({ - data: { name }, - messageId: 'preferCalledWith', - node: methodNode, - }); - } - } - }, - }; - }, -}; diff --git a/src/rules/prefer-called-with.ts b/src/rules/prefer-called-with.ts new file mode 100644 index 000000000..57324f38a --- /dev/null +++ b/src/rules/prefer-called-with.ts @@ -0,0 +1,41 @@ +import { createRule, isExpectCall, parseExpectCall } from './tsUtils'; + +export default createRule({ + name: __filename, + meta: { + docs: { + category: 'Best Practices', + description: + 'Suggest using `toBeCalledWith()` OR `toHaveBeenCalledWith()`', + recommended: false, + }, + messages: { + preferCalledWith: 'Prefer {{name}}With(/* expected args */)', + }, + type: 'suggestion', + schema: [], + }, + defaultOptions: [], + create(context) { + return { + CallExpression(node) { + if (!isExpectCall(node)) { + return; + } + + const { modifier, matcher } = parseExpectCall(node); + + // Could check resolves/rejects here but not a likely idiom. + if (matcher && !modifier) { + if (['toBeCalled', 'toHaveBeenCalled'].includes(matcher.name)) { + context.report({ + data: { name: matcher.name }, // todo: rename to 'matcherName' + messageId: 'preferCalledWith', + node: matcher.node.property, + }); + } + } + }, + }; + }, +});