diff --git a/src/rules/__tests__/expect-expect.test.js b/src/rules/__tests__/expect-expect.test.ts similarity index 83% rename from src/rules/__tests__/expect-expect.test.js rename to src/rules/__tests__/expect-expect.test.ts index eec3be3cc..c748795fb 100644 --- a/src/rules/__tests__/expect-expect.test.js +++ b/src/rules/__tests__/expect-expect.test.ts @@ -1,7 +1,10 @@ -import { RuleTester } from 'eslint'; +import { + AST_NODE_TYPES, + TSESLint, +} from '@typescript-eslint/experimental-utils'; import rule from '../expect-expect'; -const ruleTester = new RuleTester({ +const ruleTester = new TSESLint.RuleTester({ parserOptions: { ecmaVersion: 6, }, @@ -37,7 +40,7 @@ ruleTester.run('expect-expect', rule, { errors: [ { messageId: 'noAssertions', - type: 'CallExpression', + type: AST_NODE_TYPES.CallExpression, }, ], }, @@ -46,7 +49,7 @@ ruleTester.run('expect-expect', rule, { errors: [ { messageId: 'noAssertions', - type: 'CallExpression', + type: AST_NODE_TYPES.CallExpression, }, ], }, @@ -55,7 +58,7 @@ ruleTester.run('expect-expect', rule, { errors: [ { messageId: 'noAssertions', - type: 'CallExpression', + type: AST_NODE_TYPES.CallExpression, }, ], }, @@ -65,7 +68,7 @@ ruleTester.run('expect-expect', rule, { errors: [ { messageId: 'noAssertions', - type: 'CallExpression', + type: AST_NODE_TYPES.CallExpression, }, ], }, @@ -75,7 +78,7 @@ ruleTester.run('expect-expect', rule, { errors: [ { messageId: 'noAssertions', - type: 'CallExpression', + type: AST_NODE_TYPES.CallExpression, }, ], }, diff --git a/src/rules/expect-expect.js b/src/rules/expect-expect.ts similarity index 58% rename from src/rules/expect-expect.js rename to src/rules/expect-expect.ts index b35bf7c22..36468000f 100644 --- a/src/rules/expect-expect.js +++ b/src/rules/expect-expect.ts @@ -3,12 +3,19 @@ * MIT license, Remco Haszing. */ -import { getDocsUrl, getNodeName } from './util'; +import { + AST_NODE_TYPES, + TSESTree, +} from '@typescript-eslint/experimental-utils'; +import { createRule, getNodeName } from './tsUtils'; -export default { +export default createRule({ + name: __filename, meta: { docs: { - url: getDocsUrl(__filename), + category: 'Best Practices', + description: 'Enforce assertion to be made in a test body', + recommended: false, }, messages: { noAssertions: 'Test has no assertions', @@ -25,24 +32,25 @@ export default { additionalProperties: false, }, ], + type: 'suggestion', }, - create(context) { - const unchecked = []; - const assertFunctionNames = new Set( - context.options[0] && context.options[0].assertFunctionNames - ? context.options[0].assertFunctionNames - : ['expect'], - ); + defaultOptions: [{ assertFunctionNames: ['expect'] }], + create(context, [{ assertFunctionNames }]) { + const unchecked: TSESTree.CallExpression[] = []; return { CallExpression(node) { const name = getNodeName(node.callee); if (name === 'it' || name === 'test') { unchecked.push(node); - } else if (assertFunctionNames.has(name)) { + } else if (name && assertFunctionNames.includes(name)) { // Return early in case of nested `it` statements. for (const ancestor of context.getAncestors()) { - const index = unchecked.indexOf(ancestor); + const index = + ancestor.type === AST_NODE_TYPES.CallExpression + ? unchecked.indexOf(ancestor) + : -1; + if (index !== -1) { unchecked.splice(index, 1); break; @@ -57,4 +65,4 @@ export default { }, }; }, -}; +});