From 06bbc929a39d56cda5d9c36f10c1f2835cd28e6e Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Tue, 23 Jul 2019 11:06:34 +1000 Subject: [PATCH 1/2] chore(no-try-expect): convert to typescript --- ...y-expect.test.js => no-try-expect.test.ts} | 10 +++++----- .../{no-try-expect.js => no-try-expect.ts} | 20 +++++++++++++------ 2 files changed, 19 insertions(+), 11 deletions(-) rename src/rules/__tests__/{no-try-expect.test.js => no-try-expect.test.ts} (85%) rename src/rules/{no-try-expect.js => no-try-expect.ts} (69%) diff --git a/src/rules/__tests__/no-try-expect.test.js b/src/rules/__tests__/no-try-expect.test.ts similarity index 85% rename from src/rules/__tests__/no-try-expect.test.js rename to src/rules/__tests__/no-try-expect.test.ts index f8409ed23..74c6e6c9c 100644 --- a/src/rules/__tests__/no-try-expect.test.js +++ b/src/rules/__tests__/no-try-expect.test.ts @@ -1,9 +1,9 @@ -import { RuleTester } from 'eslint'; +import { TSESLint } from '@typescript-eslint/experimental-utils'; import rule from '../no-try-expect'; -const ruleTester = new RuleTester({ +const ruleTester = new TSESLint.RuleTester({ parserOptions: { - ecmaVersion: 2019, + ecmaVersion: 9, }, }); @@ -17,13 +17,13 @@ ruleTester.run('no-try-catch', rule, { }); try { - } catch { + } catch(e) { expect('foo').toEqual('foo'); }`, `it.skip('foo'); try { - } catch { + } catch(e) { expect('foo').toEqual('foo'); }`, ], diff --git a/src/rules/no-try-expect.js b/src/rules/no-try-expect.ts similarity index 69% rename from src/rules/no-try-expect.js rename to src/rules/no-try-expect.ts index aa3a424fa..83e64c09d 100644 --- a/src/rules/no-try-expect.js +++ b/src/rules/no-try-expect.ts @@ -1,10 +1,13 @@ -import { getDocsUrl, isTestCase } from './util'; +import { TSESTree } from '@typescript-eslint/experimental-utils'; +import { createRule, isTestCase } from './tsUtils'; -export default { +export default createRule({ + name: __filename, meta: { docs: { description: 'Prefer using toThrow for exception tests', - uri: getDocsUrl(__filename), + category: 'Best Practices', + recommended: false, }, messages: { noTryExpect: [ @@ -13,13 +16,18 @@ export default { 'or "await expect(yourFunction()).rejects.toThrow()" for async tests', ].join(' '), }, + type: 'problem', + schema: [], }, + defaultOptions: [], create(context) { let isTest = false; let catchDepth = 0; - function isThrowExpectCall(node) { - return catchDepth > 0 && node.callee.name === 'expect'; + function isThrowExpectCall(node: TSESTree.CallExpression) { + return ( + catchDepth > 0 && 'name' in node.callee && node.callee.name === 'expect' + ); } return { @@ -50,4 +58,4 @@ export default { }, }; }, -}; +}); From 89e7a50ac34698f84f9b64db9db810138a4b43cc Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Tue, 23 Jul 2019 11:51:21 +0200 Subject: [PATCH 2/2] chore: rollback test changes --- src/rules/__tests__/no-try-expect.test.ts | 15 +++++++++------ src/rules/no-try-expect.ts | 6 ++---- src/rules/tsUtils.ts | 4 +++- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/rules/__tests__/no-try-expect.test.ts b/src/rules/__tests__/no-try-expect.test.ts index 74c6e6c9c..a9d1eeb76 100644 --- a/src/rules/__tests__/no-try-expect.test.ts +++ b/src/rules/__tests__/no-try-expect.test.ts @@ -1,11 +1,14 @@ import { TSESLint } from '@typescript-eslint/experimental-utils'; import rule from '../no-try-expect'; -const ruleTester = new TSESLint.RuleTester({ - parserOptions: { - ecmaVersion: 9, +const ruleTester = new TSESLint.RuleTester( + // @ts-ignore: https://github.com/typescript-eslint/typescript-eslint/pull/746 + { + parserOptions: { + ecmaVersion: 2019, + }, }, -}); +); ruleTester.run('no-try-catch', rule, { valid: [ @@ -17,13 +20,13 @@ ruleTester.run('no-try-catch', rule, { }); try { - } catch(e) { + } catch { expect('foo').toEqual('foo'); }`, `it.skip('foo'); try { - } catch(e) { + } catch { expect('foo').toEqual('foo'); }`, ], diff --git a/src/rules/no-try-expect.ts b/src/rules/no-try-expect.ts index 83e64c09d..97a0c0f92 100644 --- a/src/rules/no-try-expect.ts +++ b/src/rules/no-try-expect.ts @@ -1,5 +1,5 @@ import { TSESTree } from '@typescript-eslint/experimental-utils'; -import { createRule, isTestCase } from './tsUtils'; +import { createRule, isExpectCall, isTestCase } from './tsUtils'; export default createRule({ name: __filename, @@ -25,9 +25,7 @@ export default createRule({ let catchDepth = 0; function isThrowExpectCall(node: TSESTree.CallExpression) { - return ( - catchDepth > 0 && 'name' in node.callee && node.callee.name === 'expect' - ); + return catchDepth > 0 && isExpectCall(node); } return { diff --git a/src/rules/tsUtils.ts b/src/rules/tsUtils.ts index 675162cfe..538abcdf6 100644 --- a/src/rules/tsUtils.ts +++ b/src/rules/tsUtils.ts @@ -59,7 +59,9 @@ interface JestExpectNamespaceMemberExpression * * @return {node is JestExpectCallExpression} */ -const isExpectCall = (node: TSESTree.Node): node is JestExpectCallExpression => +export const isExpectCall = ( + node: TSESTree.Node, +): node is JestExpectCallExpression => node.type === AST_NODE_TYPES.CallExpression && isExpectIdentifier(node.callee);