From 5d8ecffd9904e1696027ada50cd681a787b8d47b Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 22:08:10 -0400 Subject: [PATCH 01/14] Add test library and commands --- package.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9e0c8ad..7279e08 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,9 @@ "node" : ">=6.0.0" }, "scripts": { - "lint": "eslint ./" + "lint": "eslint ./", + "test": "jest", + "test:watch": "jest --watchAll" }, "devDependencies": { "babel-eslint": "^7.1.1", @@ -30,6 +32,12 @@ "eslint-plugin-import": "^2.2.0", "eslint-plugin-no-require-lodash": "^1.1.0", "eslint-plugin-prefer-spread": "^1.0.3", - "eslint-plugin-react": "^6.10.0" + "eslint-plugin-react": "^6.10.0", + "jest": "23.6.0" + }, + "jest": { + "testMatch": [ + "**/tests/**/*.js" + ] } } From 40206564b2a3e1d72a5d1b54a2344d6f3a9b2c80 Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 22:30:00 -0400 Subject: [PATCH 02/14] Add tests for classbody-starts-with-newline --- .../rules/classbody-starts-with-newline.js | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 tests/lib/rules/classbody-starts-with-newline.js diff --git a/tests/lib/rules/classbody-starts-with-newline.js b/tests/lib/rules/classbody-starts-with-newline.js new file mode 100644 index 0000000..ba8f5ac --- /dev/null +++ b/tests/lib/rules/classbody-starts-with-newline.js @@ -0,0 +1,41 @@ +const rule = require('../../../lib/rules/classbody-starts-with-newline'); +const RuleTester = require('eslint/lib/testers/rule-tester'); + +const parserOptions = { ecmaVersion: 6, sourceType: 'module' }; + +const ruleTester = new RuleTester({ parserOptions }); + +/* eslint-disable max-len */ +ruleTester.run('classbody-starts-with-newline', rule, { + valid: [ + // FIXME: These fail but the documentation suggests they should pass + // { + // code: 'export class SomeClass {\n /**\n * Some comment\n */\n constructor() {\n super()\n }\n}', + // options: [ 'always' ] + // }, + { + code: 'export class SomeClass {\n /**\n * Some comment\n */\n constructor() {\n super()\n }\n}', + options: [ 'never' ] + }, + { + code: 'export class SomeClass {\n\n constructor() {\n super()\n }\n}', + options: [ 'always' ] + }, + { + code: 'export class SomeClass {\n constructor() {\n super()\n }\n}', + options: [ 'never' ] + } + ], + invalid: [ + { + code: 'export class SomeClass { \n constructor() { \n super() \n }\n}', + errors: [ { message: 'Start class body with a newline' } ], + options: [ 'always' ] + }, + { + code: 'export class SomeClass { \n\n constructor() { \n super() \n }\n}', + errors: [ { message: 'Do not start class body with a newline' } ], + options: [ 'never' ] + } + ] +}); From f2bf940ab4187761ec3e6284eef6a055cea1faa1 Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 22:37:18 -0400 Subject: [PATCH 03/14] Fix docs for no-numeric-endings-for-variables --- docs/no-numeric-endings-for-variables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/no-numeric-endings-for-variables.md b/docs/no-numeric-endings-for-variables.md index 8921eb4..f9139db 100644 --- a/docs/no-numeric-endings-for-variables.md +++ b/docs/no-numeric-endings-for-variables.md @@ -13,5 +13,5 @@ const user1 = 'Tony Stark'; The following pattern is not considered a warning: ```js -const ironMan = 'Tony Stark +const ironMan = 'Tony Stark'; ``` From 14227d66eb0d49cf285eb7ac2600a2484a5f1623 Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 22:40:07 -0400 Subject: [PATCH 04/14] Add tests for no-numeric-endings-for-variables --- .../rules/no-numeric-endings-for-variables.js | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tests/lib/rules/no-numeric-endings-for-variables.js diff --git a/tests/lib/rules/no-numeric-endings-for-variables.js b/tests/lib/rules/no-numeric-endings-for-variables.js new file mode 100644 index 0000000..9dc4b66 --- /dev/null +++ b/tests/lib/rules/no-numeric-endings-for-variables.js @@ -0,0 +1,32 @@ +const rule = require('../../../lib/rules/no-numeric-endings-for-variables'); +const RuleTester = require('eslint/lib/testers/rule-tester'); + +const parserOptions = { ecmaVersion: 6, sourceType: 'module' }; + +const ruleTester = new RuleTester({ parserOptions }); + +const message = 'Do not use variables with numeric endings'; +const errors = [ { message } ]; + +/* eslint-disable max-len */ +ruleTester.run('no-numeric-endings-for-variables', rule, { + valid: [ + "const ironMan = 'Tony Stark';", + 'let foo = [];', + 'var whatever = 5;' + ], + invalid: [ + { + code: "const user1 = 'Tony Stark';", + errors + }, + { + code: 'let foo1 = [];', + errors + }, + { + code: 'var whatever42 = 5;', + errors + } + ] +}); From ca064ca6175bd11e6945f08fa373d4833b6c2495 Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 22:44:54 -0400 Subject: [PATCH 05/14] Add tests for no-c-like-loops --- tests/lib/rules/no-c-like-loops.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 tests/lib/rules/no-c-like-loops.js diff --git a/tests/lib/rules/no-c-like-loops.js b/tests/lib/rules/no-c-like-loops.js new file mode 100644 index 0000000..1b8f046 --- /dev/null +++ b/tests/lib/rules/no-c-like-loops.js @@ -0,0 +1,29 @@ +const rule = require('../../../lib/rules/no-c-like-loops'); +const RuleTester = require('eslint/lib/testers/rule-tester'); + +const parserOptions = { ecmaVersion: 6, sourceType: 'module' }; + +const ruleTester = new RuleTester({ parserOptions }); + +// eslint-disable-next-line max-len +const message = 'Do not use c-like loop with i++ or i +=1, instead use forEach, Map, or For of'; +const errors = [ { message } ]; + +/* eslint-disable max-len */ +ruleTester.run('no-c-like-loops', rule, { + valid: [ + 'list.forEach(function(item) { });', + 'list.forEach((item) => { });', + 'for (const item of list) { }' + ], + invalid: [ + { + code: 'for (var i = 0; i < list.length; i++) { }', + errors + }, + { + code: 'for (var i = 0; i < list.length; i += 1) { }', + errors + } + ] +}); From c3be16f67915b62908739c08625cef736cb4c4c1 Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 22:54:59 -0400 Subject: [PATCH 06/14] Fix docs for no-duplicated-chains --- docs/no-duplicated-chains.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/no-duplicated-chains.md b/docs/no-duplicated-chains.md index 5bc961a..8a45853 100644 --- a/docs/no-duplicated-chains.md +++ b/docs/no-duplicated-chains.md @@ -10,7 +10,7 @@ The following pattern is considered a warning: render() { return (

{this.props.text}

-
) +
) } ``` @@ -22,7 +22,7 @@ render() { return (

{text}

-
) +
) } ``` @@ -32,6 +32,6 @@ render() { return (

{props.text}

-
) +
) } ``` From 0ca131d20c4a876a8c782f9f99dcfe2b39abfa1b Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 23:11:01 -0400 Subject: [PATCH 07/14] Add tests for no-duplicated-chains --- tests/lib/rules/no-duplicated-chains.js | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 tests/lib/rules/no-duplicated-chains.js diff --git a/tests/lib/rules/no-duplicated-chains.js b/tests/lib/rules/no-duplicated-chains.js new file mode 100644 index 0000000..6e29e08 --- /dev/null +++ b/tests/lib/rules/no-duplicated-chains.js @@ -0,0 +1,29 @@ +const rule = require('../../../lib/rules/no-duplicated-chains'); +const RuleTester = require('eslint/lib/testers/rule-tester'); + +const parserOptions = { + ecmaFeatures: { jsx: true }, + ecmaVersion: 6, + sourceType: 'module' +}; + +const ruleTester = new RuleTester({ parserOptions }); + +/* eslint-disable max-len */ +ruleTester.run('no-duplicated-chains', rule, { + valid: [ + 'function render() {\n\tconst { className, text } = this.props;\n\treturn (
\n\t\t

{text}

\n\t
);\n}', + 'function render() {\n\tconst props = this;\n\treturn (
\n\t\t

{props.text}

\n\t
);\n}' + ], + invalid: [ + { + code: 'function render() {\n\treturn (
\n\t\t

{this.props.className}

\n\t
);\n}', + errors: [ { message: '' } ] + } + // FIXME: This passes but the documentation suggests it should fail + // { + // code: 'function render() {\n\treturn (
\n\t\t

{this.props.text}

\n\t
);\n}', + // errors: [ { message: '' } ] + // } + ] +}); From c52d935376fa471a0eeeeb350c8a578dc4539318 Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 23:18:24 -0400 Subject: [PATCH 08/14] Add tests for force-native-methods --- tests/lib/rules/force-native-methods.js | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tests/lib/rules/force-native-methods.js diff --git a/tests/lib/rules/force-native-methods.js b/tests/lib/rules/force-native-methods.js new file mode 100644 index 0000000..9311bc7 --- /dev/null +++ b/tests/lib/rules/force-native-methods.js @@ -0,0 +1,27 @@ +const rule = require('../../../lib/rules/force-native-methods'); +const RuleTester = require('eslint/lib/testers/rule-tester'); + +const parserOptions = { ecmaVersion: 6, sourceType: 'module' }; + +const ruleTester = new RuleTester({ parserOptions }); + +const message = 'Do not use lodash methods, use native instead'; +const errors = [ { message } ]; + +/* eslint-disable max-len */ +ruleTester.run('force-native-methods', rule, { + valid: [ + 'numbers.filter(num => num % 2 === 0)', + 'numbers.map(num => num + 1)' + ], + invalid: [ + { + code: '_.filter(numbers, num => num % 2 === 0)', + errors + }, + { + code: '_.map(numbers, num => num + 1)', + errors + } + ] +}); From a808f0a381396f09a987530b3a33016dc0decdd7 Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 23:23:12 -0400 Subject: [PATCH 09/14] Fix docs for no-then --- docs/no-then.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/no-then.md b/docs/no-then.md index 4ec2a1b..a4c75fc 100644 --- a/docs/no-then.md +++ b/docs/no-then.md @@ -23,6 +23,6 @@ async function getSomeData() { return fetch('http://some.url/') } -const responst = await getSomeData() +const response = await getSomeData() console.log(response); ``` From dbb463006a0974071f04183eb5c35b948211efd9 Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 23:23:18 -0400 Subject: [PATCH 10/14] Add tests for no-then --- tests/lib/rules/no-then.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tests/lib/rules/no-then.js diff --git a/tests/lib/rules/no-then.js b/tests/lib/rules/no-then.js new file mode 100644 index 0000000..e9febe9 --- /dev/null +++ b/tests/lib/rules/no-then.js @@ -0,0 +1,22 @@ +const rule = require('../../../lib/rules/no-then'); +const RuleTester = require('eslint/lib/testers/rule-tester'); + +const parserOptions = { ecmaVersion: 2017, sourceType: 'module' }; + +const ruleTester = new RuleTester({ parserOptions }); + +const message = 'Do not use .then, instead use async / await'; +const errors = [ { message } ]; + +/* eslint-disable max-len */ +ruleTester.run('no-then', rule, { + valid: [ + 'async function foo() { const response = await getSomeData(); console.log(response); }' + ], + invalid: [ + { + code: 'function foo() { getSomeData().then(response => { console.log(response); }) }', + errors + } + ] +}); From 5b2e61e4a301f5d343dabde95668751975afe322 Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 23:27:16 -0400 Subject: [PATCH 11/14] Fix docs for no-void-map --- docs/no-void-map.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/no-void-map.md b/docs/no-void-map.md index 5e5a356..dc1a335 100644 --- a/docs/no-void-map.md +++ b/docs/no-void-map.md @@ -7,7 +7,7 @@ You have not to leave array.map without variable or property (bad example). Here The following pattern is considered a warning: ```js -users.map(user=> user.status = "ACTIVE"); +users.map(user => user.status == "ACTIVE"); ``` The following pattern is not considered a warning: @@ -22,6 +22,6 @@ const usersIds = users.map(user => user.id); ```js var users = [{id: 1}, {id: 2}, {id: 3}]; -users.map(user => user.id).forEach( id => { console.log(id) } ); +users.map(user => user.id).forEach(id => { console.log(id) } ); ``` From 0789ce3564c1e8a826a9e7e4481dd8ab045a24b2 Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 23:27:21 -0400 Subject: [PATCH 12/14] Add tests for no-void-map --- tests/lib/rules/no-void-map.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tests/lib/rules/no-void-map.js diff --git a/tests/lib/rules/no-void-map.js b/tests/lib/rules/no-void-map.js new file mode 100644 index 0000000..6325ef9 --- /dev/null +++ b/tests/lib/rules/no-void-map.js @@ -0,0 +1,22 @@ +const rule = require('../../../lib/rules/no-void-map'); +const RuleTester = require('eslint/lib/testers/rule-tester'); + +const parserOptions = { ecmaVersion: 6, sourceType: 'module' }; + +const ruleTester = new RuleTester({ parserOptions }); + +const message = 'Here you have to assign this expression to variable or add other function to map'; +const errors = [ { message } ]; + +/* eslint-disable max-len */ +ruleTester.run('no-void-map', rule, { + valid: [ + 'const userIds = users.map(user => user.id)' + ], + invalid: [ + { + code: 'users.map(user => user.status == "ACTIVE")', + errors + } + ] +}); From 922a389c38c5782072d183eee3465d591410e61b Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 23:34:01 -0400 Subject: [PATCH 13/14] Add tests for no-window --- tests/lib/rules/no-window.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 tests/lib/rules/no-window.js diff --git a/tests/lib/rules/no-window.js b/tests/lib/rules/no-window.js new file mode 100644 index 0000000..5d7694f --- /dev/null +++ b/tests/lib/rules/no-window.js @@ -0,0 +1,30 @@ +const rule = require('../../../lib/rules/no-window'); +const RuleTester = require('eslint/lib/testers/rule-tester'); + +const parserOptions = { ecmaVersion: 6, sourceType: 'module' }; + +const ruleTester = new RuleTester({ parserOptions }); + +const message = 'Avoid using window'; +const errors = [ { message } ]; + +/* eslint-disable max-len */ +ruleTester.run('no-window', rule, { + valid: [ + 'let a; function foo() { a = 5; }' + ], + invalid: [ + { + code: 'window.detail = 5;', + errors + }, + { + code: 'function setDetail(detail) { window.detail = detail; }', + errors + }, + { + code: 'function getDetail() { return window.detail; }', + errors + } + ] +}); From 8f9b84c9bd1fdc35dab21fca21b80b4cd1101db7 Mon Sep 17 00:00:00 2001 From: Elad Shahar Date: Mon, 29 Oct 2018 23:36:25 -0400 Subject: [PATCH 14/14] Add tests for prefer-includes --- tests/lib/rules/prefer-includes.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tests/lib/rules/prefer-includes.js diff --git a/tests/lib/rules/prefer-includes.js b/tests/lib/rules/prefer-includes.js new file mode 100644 index 0000000..8733fd1 --- /dev/null +++ b/tests/lib/rules/prefer-includes.js @@ -0,0 +1,22 @@ +const rule = require('../../../lib/rules/prefer-includes'); +const RuleTester = require('eslint/lib/testers/rule-tester'); + +const parserOptions = { ecmaVersion: 6, sourceType: 'module' }; + +const ruleTester = new RuleTester({ parserOptions }); + +const message = 'Do not use indexOf, instead use includes '; +const errors = [ { message } ]; + +/* eslint-disable max-len */ +ruleTester.run('prefer-includes', rule, { + valid: [ + '[1, 2, 3, 4].includes(2)' + ], + invalid: [ + { + code: '[1, 2, 3, 4].indexOf(2) === -1', + errors + } + ] +});