From 877d9cc0e5bfb7a8c424063ef562ab4cd5e6bbe3 Mon Sep 17 00:00:00 2001 From: Chris Blossom Date: Wed, 21 Aug 2019 10:37:08 -0700 Subject: [PATCH 1/5] fix(require-tothrow-message): rename rule to require-to-throw-message --- README.md | 4 +- ...message.md => require-to-throw-message.md} | 0 src/__tests__/rules.test.ts | 10 +++- ...st.ts => require-to-throw-message.test.ts} | 24 +++++++- src/rules/require-to-throw-message.ts | 50 +++++++++++++++++ src/rules/require-tothrow-message.ts | 56 +++---------------- 6 files changed, 92 insertions(+), 52 deletions(-) rename docs/rules/{require-tothrow-message.md => require-to-throw-message.md} (100%) rename src/rules/__tests__/{require-tothrow-message.test.ts => require-to-throw-message.test.ts} (85%) create mode 100644 src/rules/require-to-throw-message.ts diff --git a/README.md b/README.md index 34d21478d..d64fde141 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ installations requiring long-term consistency. | [prefer-to-have-length][] | Suggest using `toHaveLength()` | | ![fixable-green][] | | [prefer-todo][] | Suggest using `test.todo()` | | ![fixable-green][] | | [require-top-level-describe][] | Require a top-level `describe` block | | | -| [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][] | | @@ -195,7 +195,7 @@ https://github.com/dangreenisrael/eslint-plugin-jest-formatting [prefer-to-have-length]: docs/rules/prefer-to-have-length.md [prefer-todo]: docs/rules/prefer-todo.md [require-top-level-describe]: docs/rules/require-top-level-describe.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 787c3c4cb..5fcac0052 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 = 39; 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'], }, -}); +}; From 51282f074b154f0025d9b806b74b27989fc66342 Mon Sep 17 00:00:00 2001 From: Chris Blossom Date: Thu, 5 Sep 2019 11:46:18 -0700 Subject: [PATCH 2/5] chore(require-to-throw-message): internal variables renamed --- .../require-to-throw-message.test.ts | 20 +++++++++---------- src/rules/require-to-throw-message.ts | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/rules/__tests__/require-to-throw-message.test.ts b/src/rules/__tests__/require-to-throw-message.test.ts index 05bca3b93..74ef4fd78 100644 --- a/src/rules/__tests__/require-to-throw-message.test.ts +++ b/src/rules/__tests__/require-to-throw-message.test.ts @@ -67,8 +67,8 @@ ruleTester.run('require-to-throw-message', rule, { code: "expect(() => { throw new Error('a'); }).toThrow();", errors: [ { - messageId: 'requireRethrow', - data: { propertyName: 'toThrow' }, + messageId: 'addErrorMessage', + data: { matcherName: 'toThrow' }, column: 41, line: 1, }, @@ -79,8 +79,8 @@ ruleTester.run('require-to-throw-message', rule, { code: "expect(() => { throw new Error('a'); }).toThrowError();", errors: [ { - messageId: 'requireRethrow', - data: { propertyName: 'toThrowError' }, + messageId: 'addErrorMessage', + data: { matcherName: 'toThrowError' }, column: 41, line: 1, }, @@ -96,14 +96,14 @@ ruleTester.run('require-to-throw-message', rule, { })`, errors: [ { - messageId: 'requireRethrow', - data: { propertyName: 'toThrow' }, + messageId: 'addErrorMessage', + data: { matcherName: 'toThrow' }, column: 49, line: 3, }, { - messageId: 'requireRethrow', - data: { propertyName: 'toThrowError' }, + messageId: 'addErrorMessage', + data: { matcherName: 'toThrowError' }, column: 49, line: 4, }, @@ -121,8 +121,8 @@ ruleTester.run('require-tothrow-message', deprecatedRule, { code: "expect(() => { throw new Error('a'); }).toThrow();", errors: [ { - messageId: 'requireRethrow', - data: { propertyName: 'toThrow' }, + messageId: 'addErrorMessage', + data: { matcherName: 'toThrow' }, column: 41, line: 1, }, diff --git a/src/rules/require-to-throw-message.ts b/src/rules/require-to-throw-message.ts index 13282e4fc..ef4201e85 100644 --- a/src/rules/require-to-throw-message.ts +++ b/src/rules/require-to-throw-message.ts @@ -14,7 +14,7 @@ export default createRule({ recommended: false, }, messages: { - requireRethrow: 'Add an error message to {{ propertyName }}()', + addErrorMessage: 'Add an error message to {{ propertyName }}()', }, type: 'suggestion', schema: [], @@ -39,8 +39,8 @@ export default createRule({ ) { // Look for `toThrow` calls with no arguments. context.report({ - messageId: 'requireRethrow', // todo: rename to 'addErrorMessage' - data: { propertyName: matcher.name }, // todo: rename to 'matcherName' + messageId: 'addErrorMessage', + data: { matcherName: matcher.name }, node: matcher.node.property, }); } From 173bba0a38ab68640d1fc35cad7cf9c8edce4d3e Mon Sep 17 00:00:00 2001 From: Chris Blossom Date: Mon, 7 Oct 2019 10:04:06 -0700 Subject: [PATCH 3/5] chore: use implicit return --- src/__tests__/rules.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/__tests__/rules.test.ts b/src/__tests__/rules.test.ts index 5fcac0052..d114b7539 100644 --- a/src/__tests__/rules.test.ts +++ b/src/__tests__/rules.test.ts @@ -7,9 +7,9 @@ const excludeRules = [ 'require-tothrow-message', ]; -const ruleNames = Object.keys(plugin.rules).filter(rule => { - return excludeRules.includes(rule) === false; -}); +const ruleNames = Object.keys(plugin.rules).filter( + rule => !excludeRules.includes(rule), +); const numberOfRules = 39; From c3cd290fbb61076ee5e480e47c55caef535452a1 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Sun, 27 Oct 2019 22:24:58 +0100 Subject: [PATCH 4/5] chore: make breaking --- src/__tests__/rules.test.ts | 9 +-------- .../require-to-throw-message.test.ts | 20 ------------------- src/rules/require-tothrow-message.ts | 12 ----------- 3 files changed, 1 insertion(+), 40 deletions(-) delete mode 100644 src/rules/require-tothrow-message.ts diff --git a/src/__tests__/rules.test.ts b/src/__tests__/rules.test.ts index b92bd6fdf..bd43de12a 100644 --- a/src/__tests__/rules.test.ts +++ b/src/__tests__/rules.test.ts @@ -2,14 +2,7 @@ import { existsSync } from 'fs'; import { resolve } from 'path'; import plugin from '../'; -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 => !excludeRules.includes(rule), -); +const ruleNames = Object.keys(plugin.rules); const numberOfRules = 40; diff --git a/src/rules/__tests__/require-to-throw-message.test.ts b/src/rules/__tests__/require-to-throw-message.test.ts index 73f61a2f5..7c6e38420 100644 --- a/src/rules/__tests__/require-to-throw-message.test.ts +++ b/src/rules/__tests__/require-to-throw-message.test.ts @@ -1,7 +1,6 @@ import { TSESLint } from '@typescript-eslint/experimental-utils'; import resolveFrom from 'resolve-from'; import rule from '../require-to-throw-message'; -import deprecatedRule from '../require-tothrow-message'; // remove in major version bump const ruleTester = new TSESLint.RuleTester({ parser: resolveFrom(require.resolve('eslint'), 'espree'), @@ -113,22 +112,3 @@ ruleTester.run('require-to-throw-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: 'addErrorMessage', - data: { matcherName: 'toThrow' }, - column: 41, - line: 1, - }, - ], - }, - ], -}); diff --git a/src/rules/require-tothrow-message.ts b/src/rules/require-tothrow-message.ts deleted file mode 100644 index 2d71a1ba5..000000000 --- a/src/rules/require-tothrow-message.ts +++ /dev/null @@ -1,12 +0,0 @@ -import requireToThrowMessage from './require-to-throw-message'; - -// remove this file in major version bump - -export default { - ...requireToThrowMessage, - meta: { - ...requireToThrowMessage.meta, - deprecated: true, - replacedBy: ['require-to-throw-message'], - }, -}; From 1010553783e6b6864d972ecb00ffcce45c3a31ba Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Sun, 27 Oct 2019 22:27:01 +0100 Subject: [PATCH 5/5] chore: reduce diff --- src/__tests__/rules.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/__tests__/rules.test.ts b/src/__tests__/rules.test.ts index bd43de12a..6b6e12fcc 100644 --- a/src/__tests__/rules.test.ts +++ b/src/__tests__/rules.test.ts @@ -3,7 +3,6 @@ import { resolve } from 'path'; import plugin from '../'; const ruleNames = Object.keys(plugin.rules); - const numberOfRules = 40; describe('rules', () => {