Skip to content

Commit

Permalink
Add prefer-to-be-defined rule
Browse files Browse the repository at this point in the history
  • Loading branch information
xfumihiro committed Nov 24, 2017
1 parent 15cebfa commit 819ff47
Show file tree
Hide file tree
Showing 6 changed files with 126 additions and 1 deletion.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ project adheres to [Semantic Versioning](http://semver.org/).
([#10](https://github.com/jest-community/eslint-plugin-jest/pull/10))
* Add `prefer-to-be-undefined` rule
([#9](https://github.com/jest-community/eslint-plugin-jest/pull/9))
* Add `prefer-to-be-defined` rule
([#8](https://github.com/jest-community/eslint-plugin-jest/pull/8))

## [21.3.2] - 2017-11-09

Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
[![Build Status](https://travis-ci.org/jest-community/eslint-plugin-jest.svg?branch=master)](https://travis-ci.org/jest-community/eslint-plugin-jest) [![Greenkeeper badge](https://badges.greenkeeper.io/jest-community/eslint-plugin-jest.svg)](https://greenkeeper.io/)
[![Build Status](https://travis-ci.org/jest-community/eslint-plugin-jest.svg?branch=master)](https://travis-ci.org/jest-community/eslint-plugin-jest)
[![Greenkeeper badge](https://badges.greenkeeper.io/jest-community/eslint-plugin-jest.svg)](https://greenkeeper.io/)

<div align="center">
<a href="https://eslint.org/">
Expand Down Expand Up @@ -66,6 +67,8 @@ You can also whitelist the environment variables provided by Jest by doing:
`toBeNull()`.
* [prefer-to-be-undefined](/docs/rules/prefer-to-be-undefined.md) - suggest
using `toBeUndefined()`.
* [prefer-to-be-defined](/docs/rules/prefer-to-be-defined.md) - suggest using
`toBeDefined()`.
* [prefer-to-have-length](/docs/rules/prefer-to-have-length.md) - suggest using
`toHaveLength()`.
* [valid-expect](/docs/rules/valid-expect.md) - ensure expect is called
Expand Down
29 changes: 29 additions & 0 deletions docs/rules/prefer-to-be-defined.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Suggest using `toBeDefined()` (prefer-to-be-defined)

In order to have a better failure message, `toBeDefined()` should be used upon
asserting expections on defined value.

## Rule details

This rule triggers a warning if `not.toBe()` is used to assert a undefined
value.

```js
expect(true).not.toBe(undefined);
```

This rule is enabled by default.

### Default configuration

The following patterns are considered warning:

```js
expect(true).not.toBeUndefined();
```

The following pattern is not warning:

```js
expect(true).toBeDefined();
```
2 changes: 2 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const noFocusedTests = require('./rules/no_focused_tests');
const noIdenticalTitle = require('./rules/no_identical_title');
const preferToBeNull = require('./rules/prefer_to_be_null');
const preferToBeUndefined = require('./rules/prefer_to_be_undefined');
const preferToBeDefined = require('./rules/prefer_to_be_defined');
const preferToHaveLength = require('./rules/prefer_to_have_length');
const validExpect = require('./rules/valid_expect');

Expand Down Expand Up @@ -49,6 +50,7 @@ module.exports = {
'no-identical-title': noIdenticalTitle,
'prefer-to-be-null': preferToBeNull,
'prefer-to-be-undefined': preferToBeUndefined,
'prefer-to-be-defined': preferToBeDefined,
'prefer-to-have-length': preferToHaveLength,
'valid-expect': validExpect,
},
Expand Down
35 changes: 35 additions & 0 deletions rules/__tests__/prefer_to_be_defined.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
'use strict';

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

const ruleTester = new RuleTester();

ruleTester.run('prefer_to_be_defined', rules['prefer-to-be-defined'], {
valid: ['expect(true).toBeDefined();'],

invalid: [
{
code: 'expect(true).not.toEqual(undefined);',
errors: [
{
message: 'Use toBeDefined() instead',
column: 14,
line: 1,
},
],
output: 'expect(true).toBeDefined();',
},
{
code: 'expect(true).not.toBeUndefined();',
errors: [
{
message: 'Use toBeDefined() instead',
column: 14,
line: 1,
},
],
output: 'expect(true).toBeDefined();',
},
],
});
54 changes: 54 additions & 0 deletions rules/prefer_to_be_defined.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
'use strict';

module.exports = context => {
return {
CallExpression(node) {
const calleeName = node.callee.name;

if (
calleeName === 'expect' &&
node.arguments.length == 1 &&
node.parent &&
node.parent.type === 'MemberExpression' &&
node.parent.parent &&
node.parent.parent.type === 'MemberExpression'
) {
const parentProperty = node.parent.property;
const propertyName = parentProperty.name;
const parentProperty2 = node.parent.parent.property;
const propertyName2 = parentProperty2.name;
const argument = node.parent.parent.parent.arguments[0];

if (
(propertyName === 'not' &&
(propertyName2 === 'toBe' || propertyName2 === 'toEqual') &&
argument.value === undefined) ||
(propertyName === 'not' && propertyName2 === 'toBeUndefined')
) {
context.report({
fix(fixer) {
const propertyDot = context
.getSourceCode()
.getFirstTokenBetween(
parentProperty,
parentProperty2,
token => token.value === '.'
);
const fixes = [
fixer.remove(parentProperty),
fixer.remove(propertyDot),
fixer.replaceText(parentProperty2, 'toBeDefined'),
];
if (argument) {
fixes.push(fixer.remove(argument));
}
return fixes;
},
message: 'Use toBeDefined() instead',
node: parentProperty,
});
}
}
},
};
};

0 comments on commit 819ff47

Please sign in to comment.