From 8fbdc11fcdd72fe1baf4a1e9ca30f389c06253e3 Mon Sep 17 00:00:00 2001 From: Kevin Partington Date: Fri, 27 Nov 2015 12:14:25 -0600 Subject: [PATCH] New: Adding rule no-only (fixes #11) --- docs/rules/no-only.md | 29 +++++++++++++++++++++++++++ index.js | 2 ++ lib/rules/no-only.js | 41 ++++++++++++++++++++++++++++++++++++++ tests/lib/rules/no-only.js | 36 +++++++++++++++++++++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 docs/rules/no-only.md create mode 100644 lib/rules/no-only.js create mode 100644 tests/lib/rules/no-only.js diff --git a/docs/rules/no-only.md b/docs/rules/no-only.md new file mode 100644 index 00000000..1b768b96 --- /dev/null +++ b/docs/rules/no-only.md @@ -0,0 +1,29 @@ +# Forbid the use of QUnit.only (no-only) + +`QUnit.only` is useful for restricting a test run to just one test while developing, but committing a test file using this function to a repository is dangerous because it will ensure that the rest of the test suite is not run. + +## Rule Details + +The following patterns are considered warnings: + +```js + +QUnit.only('Name', function () { }); + +``` + +The following patterns are not considered warnings: + +```js + +QUnit.test('Name', function () { }); + +``` + +## When Not to Use It + +If your development pipeline would make running this rule annoying, it could be safely disabled. However, it would be a good idea to ensure that this rule is run in continuous integration at the very least. + +## Further Reading + +* [QUnit.only](https://api.qunitjs.com/QUnit.only/) diff --git a/index.js b/index.js index 52779b38..f46e7832 100644 --- a/index.js +++ b/index.js @@ -6,6 +6,7 @@ module.exports = { "no-async-in-loops": require("./lib/rules/no-async-in-loops"), "no-commented-tests": require("./lib/rules/no-commented-tests"), "no-ok-equality": require("./lib/rules/no-ok-equality"), + "no-only": require("./lib/rules/no-only"), "resolve-async": require("./lib/rules/resolve-async") }, rulesConfig: { @@ -13,6 +14,7 @@ module.exports = { "no-async-in-loops": 1, "no-commented-tests": 0, "no-ok-equality": 1, + "no-only": 1, "resolve-async": 2 } }; diff --git a/lib/rules/no-only.js b/lib/rules/no-only.js new file mode 100644 index 00000000..906b9e62 --- /dev/null +++ b/lib/rules/no-only.js @@ -0,0 +1,41 @@ +/** + * @fileoverview Forbid the use of QUnit.only. + * @author Kevin Partington + */ +"use strict"; + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +var utils = require("../utils"); + +//------------------------------------------------------------------------------ +// Rule Definition +//------------------------------------------------------------------------------ + +module.exports = function (context) { + var MESSAGE = "Unexpected QUnit.only call."; + + function isQUnitOnly (calleeNode) { + return calleeNode && + calleeNode.type === "MemberExpression" && + calleeNode.object && + calleeNode.object.type === "Identifier" && + calleeNode.object.name === "QUnit" && + calleeNode.property && + calleeNode.property.type === "Identifier" && + calleeNode.property.name === "only"; + } + + return { + "CallExpression": function (node) { + if (isQUnitOnly(node.callee)) { + context.report({ + node: node, + message: MESSAGE + }); + } + } + }; +}; diff --git a/tests/lib/rules/no-only.js b/tests/lib/rules/no-only.js new file mode 100644 index 00000000..3f585aa5 --- /dev/null +++ b/tests/lib/rules/no-only.js @@ -0,0 +1,36 @@ +/** + * @fileoverview Forbid the use of QUnit.only. + * @author Kevin Partington + */ +"use strict"; + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +var rule = require("../../../lib/rules/no-only"), + RuleTester = require("eslint").RuleTester; + +//------------------------------------------------------------------------------ +// Tests +//------------------------------------------------------------------------------ + +var ruleTester = new RuleTester(); + +ruleTester.run("no-only", rule, { + valid: [ + "QUnit.test('Name', function() { });", + + // QUnit.only is not exposed globally so this is valid + "only('Name', function() { });" + ], + + invalid: [ + { + code: "QUnit.only('Name', function() { });", + errors: [ + "Unexpected QUnit.only call." + ] + } + ] +});