diff --git a/README.md b/README.md index cb8ee5a72..8b1cb77e0 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ installations requiring long-term consistency. | [prefer-to-contain][] | Suggest using `toContain()` | | ![fixable-green][] | | [prefer-to-have-length][] | Suggest using `toHaveLength()` | | ![fixable-green][] | | [prefer-todo][] | Suggest using `test.todo()` | | ![fixable-green][] | -| [require-tothrow-message][] | Require that `toThrow()` and `toThrowError` includes a message | | | +| [require-to-throw-message][] | Require that `toThrow()` and `toThrowError` includes a message | | | | [valid-describe][] | Enforce valid `describe()` callback | ![recommended][] | | | [valid-expect-in-promise][] | Enforce having return statement when testing with promises | ![recommended][] | | | [valid-expect][] | Enforce valid `expect()` usage | ![recommended][] | | @@ -193,7 +193,7 @@ https://github.com/dangreenisrael/eslint-plugin-jest-formatting [prefer-to-contain]: docs/rules/prefer-to-contain.md [prefer-to-have-length]: docs/rules/prefer-to-have-length.md [prefer-todo]: docs/rules/prefer-todo.md -[require-tothrow-message]: docs/rules/require-tothrow-message.md +[require-to-throw-message]: docs/rules/require-to-throw-message.md [valid-describe]: docs/rules/valid-describe.md [valid-expect-in-promise]: docs/rules/valid-expect-in-promise.md [valid-expect]: docs/rules/valid-expect.md diff --git a/docs/rules/require-tothrow-message.md b/docs/rules/require-to-throw-message.md similarity index 100% rename from docs/rules/require-tothrow-message.md rename to docs/rules/require-to-throw-message.md diff --git a/src/__tests__/rules.test.ts b/src/__tests__/rules.test.ts index b7659cc24..921be2f31 100644 --- a/src/__tests__/rules.test.ts +++ b/src/__tests__/rules.test.ts @@ -2,7 +2,15 @@ import { existsSync } from 'fs'; import { resolve } from 'path'; import plugin from '../'; -const ruleNames = Object.keys(plugin.rules); +const excludeRules = [ + // require-tothrow-message has been renamed to require-to-throw-message, remove in major version bump + 'require-tothrow-message', +]; + +const ruleNames = Object.keys(plugin.rules).filter(rule => { + return excludeRules.includes(rule) === false; +}); + const numberOfRules = 38; describe('rules', () => { diff --git a/src/rules/__tests__/require-tothrow-message.test.ts b/src/rules/__tests__/require-to-throw-message.test.ts similarity index 85% rename from src/rules/__tests__/require-tothrow-message.test.ts rename to src/rules/__tests__/require-to-throw-message.test.ts index 8c2bc7407..05bca3b93 100644 --- a/src/rules/__tests__/require-tothrow-message.test.ts +++ b/src/rules/__tests__/require-to-throw-message.test.ts @@ -1,5 +1,6 @@ import { TSESLint } from '@typescript-eslint/experimental-utils'; -import rule from '../require-tothrow-message'; +import rule from '../require-to-throw-message'; +import deprecatedRule from '../require-tothrow-message'; // remove in major version bump const ruleTester = new TSESLint.RuleTester({ parserOptions: { @@ -7,7 +8,7 @@ const ruleTester = new TSESLint.RuleTester({ }, }); -ruleTester.run('require-tothrow-message', rule, { +ruleTester.run('require-to-throw-message', rule, { valid: [ // String "expect(() => { throw new Error('a'); }).toThrow('a');", @@ -110,3 +111,22 @@ ruleTester.run('require-tothrow-message', rule, { }, ], }); + +// remove in major version bump +ruleTester.run('require-tothrow-message', deprecatedRule, { + valid: ["expect(() => { throw new Error('a'); }).toThrow('a');"], + + invalid: [ + { + code: "expect(() => { throw new Error('a'); }).toThrow();", + errors: [ + { + messageId: 'requireRethrow', + data: { propertyName: 'toThrow' }, + column: 41, + line: 1, + }, + ], + }, + ], +}); diff --git a/src/rules/require-to-throw-message.ts b/src/rules/require-to-throw-message.ts new file mode 100644 index 000000000..13282e4fc --- /dev/null +++ b/src/rules/require-to-throw-message.ts @@ -0,0 +1,50 @@ +import { + ModifierName, + createRule, + isExpectCall, + parseExpectCall, +} from './utils'; + +export default createRule({ + name: __filename, + meta: { + docs: { + category: 'Best Practices', + description: 'Require a message for `toThrow()`', + recommended: false, + }, + messages: { + requireRethrow: 'Add an error message to {{ propertyName }}()', + }, + type: 'suggestion', + schema: [], + }, + defaultOptions: [], + create(context) { + return { + CallExpression(node) { + if (!isExpectCall(node)) { + return; + } + + const { matcher, modifier } = parseExpectCall(node); + + if ( + matcher && + matcher.arguments && + matcher.arguments.length === 0 && + ['toThrow', 'toThrowError'].includes(matcher.name) && + (!modifier || + !(modifier.name === ModifierName.not || modifier.negation)) + ) { + // Look for `toThrow` calls with no arguments. + context.report({ + messageId: 'requireRethrow', // todo: rename to 'addErrorMessage' + data: { propertyName: matcher.name }, // todo: rename to 'matcherName' + node: matcher.node.property, + }); + } + }, + }; + }, +}); diff --git a/src/rules/require-tothrow-message.ts b/src/rules/require-tothrow-message.ts index 13282e4fc..2d71a1ba5 100644 --- a/src/rules/require-tothrow-message.ts +++ b/src/rules/require-tothrow-message.ts @@ -1,50 +1,12 @@ -import { - ModifierName, - createRule, - isExpectCall, - parseExpectCall, -} from './utils'; +import requireToThrowMessage from './require-to-throw-message'; -export default createRule({ - name: __filename, - meta: { - docs: { - category: 'Best Practices', - description: 'Require a message for `toThrow()`', - recommended: false, - }, - messages: { - requireRethrow: 'Add an error message to {{ propertyName }}()', - }, - type: 'suggestion', - schema: [], - }, - defaultOptions: [], - create(context) { - return { - CallExpression(node) { - if (!isExpectCall(node)) { - return; - } +// remove this file in major version bump - const { matcher, modifier } = parseExpectCall(node); - - if ( - matcher && - matcher.arguments && - matcher.arguments.length === 0 && - ['toThrow', 'toThrowError'].includes(matcher.name) && - (!modifier || - !(modifier.name === ModifierName.not || modifier.negation)) - ) { - // Look for `toThrow` calls with no arguments. - context.report({ - messageId: 'requireRethrow', // todo: rename to 'addErrorMessage' - data: { propertyName: matcher.name }, // todo: rename to 'matcherName' - node: matcher.node.property, - }); - } - }, - }; +export default { + ...requireToThrowMessage, + meta: { + ...requireToThrowMessage.meta, + deprecated: true, + replacedBy: ['require-to-throw-message'], }, -}); +};