Skip to content

Commit

Permalink
Add lowercase-description rule
Browse files Browse the repository at this point in the history
  • Loading branch information
ismail-syed committed Jan 14, 2018
1 parent 16889bb commit bd752c2
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 0 deletions.
21 changes: 21 additions & 0 deletions docs/rules/lowercase-description.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Enforce lowercase descriptions in it() (lowercase-description)

## Rule details

Enforce `it()` tests to have descriptions that begin with a lowercase letter. This provides more readable test failures. This rule is not enabled by default.

The following pattern is considered a warning:

```js
it('Adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
```

The following pattern is not considered a warning:

```js
it('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
```
2 changes: 2 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
'use strict';

const lowercaseDescription = require('./rules/lowercase_description');
const noDisabledTests = require('./rules/no_disabled_tests');
const noFocusedTests = require('./rules/no_focused_tests');
const noIdenticalTitle = require('./rules/no_identical_title');
Expand Down Expand Up @@ -55,6 +56,7 @@ module.exports = {
'.snap': snapshotProcessor,
},
rules: {
'lowercase-description': lowercaseDescription,
'no-disabled-tests': noDisabledTests,
'no-focused-tests': noFocusedTests,
'no-identical-title': noIdenticalTitle,
Expand Down
40 changes: 40 additions & 0 deletions rules/__tests__/lowercase_description.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
'use strict';

const RuleTester = require('eslint').RuleTester;
const rules = require('../..').rules;

const ruleTester = new RuleTester({
parserOptions: {
ecmaVersion: 6,
},
});

const errMessage = 'it() description should begin with lowercase';
const errors = [{ message: errMessage, column: 1, line: 1 }];

ruleTester.run('lowercase-description', rules['lowercase-description'], {
valid: [
"it('foo', function () {})",
'it("foo", function () {})',
'it(`foo`, function () {})',
'it("<Foo/>", function () {})',
'it("123 foo", function () {})',
'describe("foo", function () {})',
'test("foo", function () {})',
],

invalid: [
{
code: "it('Foo', function () {})",
errors,
},
{
code: 'it("Foo", function () {})',
errors,
},
{
code: 'it(`Foo`, function () {})',
errors,
},
],
});
49 changes: 49 additions & 0 deletions rules/lowercase_description.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
'use strict';

const ruleMsg = 'it() description should begin with lowercase';

const isItFunction = node => {
return (
node.type === 'CallExpression' && node.callee && node.callee.name === 'it'
);
};

const isItDescription = node => {
const foo =
node.arguments &&
node.arguments[0] &&
(node.arguments[0].type === 'Literal' ||
node.arguments[0].type === 'TemplateLiteral');
return foo;
};

const testDescription = node => {
const { type } = node.arguments[0];
if (type === 'Literal') {
return node.arguments[0].value;
}
if (type === 'TemplateLiteral') {
return node.arguments[0].quasis[0].value.raw;
}
};

const descriptionBeginsWithLowerCase = node => {
if (isItFunction(node) && isItDescription(node)) {
const description = testDescription(node);
return description[0] === description[0].toLowerCase();
}
return true;
};

module.exports = context => {
return {
CallExpression(node) {
if (!descriptionBeginsWithLowerCase(node)) {
context.report({
message: ruleMsg,
node: node,
});
}
},
};
};

0 comments on commit bd752c2

Please sign in to comment.