-
Notifications
You must be signed in to change notification settings - Fork 30.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tools: add ESLint rule for assert.throws arguments
The second argument to "assert.throws" is usually a validation RegExp or function for the thrown error. However, the function also accepts a string and in this case it is interpreted as a message for the AssertionError and not used for validation. It is common for people to forget this and pass a validation string by mistake. This new rule checks that we never pass a string literal as a second argument to "assert.throws". Additionally, there is an option to enforce the function to be called with at least two arguments. It is currently off because we have many tests that do not comply with this rule. PR-URL: #10089 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Teddy Katz <teddy.katz@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
- Loading branch information
1 parent
6087e36
commit 64854f6
Showing
2 changed files
with
60 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
/** | ||
* @fileoverview Check that assert.throws is never called with a string as | ||
* second argument. | ||
* @author Michaël Zasso | ||
*/ | ||
'use strict'; | ||
|
||
//------------------------------------------------------------------------------ | ||
// Rule Definition | ||
//------------------------------------------------------------------------------ | ||
|
||
function checkThrowsArguments(context, node) { | ||
if (node.callee.type === 'MemberExpression' && | ||
node.callee.object.name === 'assert' && | ||
node.callee.property.name === 'throws') { | ||
const args = node.arguments; | ||
if (args.length > 3) { | ||
context.report({ | ||
message: 'Too many arguments', | ||
node: node | ||
}); | ||
} else if (args.length > 1) { | ||
const error = args[1]; | ||
if (error.type === 'Literal' && typeof error.value === 'string') { | ||
context.report({ | ||
message: 'Unexpected string as second argument', | ||
node: error | ||
}); | ||
} | ||
} else { | ||
if (context.options[0].requireTwo) { | ||
context.report({ | ||
message: 'Expected at least two arguments', | ||
node: node | ||
}); | ||
} | ||
} | ||
} | ||
} | ||
|
||
module.exports = { | ||
meta: { | ||
schema: [ | ||
{ | ||
type: 'object', | ||
properties: { | ||
requireTwo: { | ||
type: 'boolean' | ||
} | ||
} | ||
} | ||
] | ||
}, | ||
create: function(context) { | ||
return { | ||
CallExpression: (node) => checkThrowsArguments(context, node) | ||
}; | ||
} | ||
}; |