From d7c2c33764a277a88b7c113d3dbf53aec79447a1 Mon Sep 17 00:00:00 2001 From: Tryggvi Gylfason Date: Mon, 30 Jul 2018 01:25:09 +0200 Subject: [PATCH] feat(rules): add prefer-strict-equal (#134) --- README.md | 2 ++ docs/rules/prefer-strict-equal.md | 25 ++++++++++++++++++ index.js | 2 ++ rules/__tests__/prefer-strict-equal.test.js | 23 +++++++++++++++++ rules/prefer-strict-equal.js | 28 +++++++++++++++++++++ 5 files changed, 80 insertions(+) create mode 100644 docs/rules/prefer-strict-equal.md create mode 100644 rules/__tests__/prefer-strict-equal.test.js create mode 100644 rules/prefer-strict-equal.js diff --git a/README.md b/README.md index ff3e001a1..355643704 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ for more information about extending configuration files. | [no-large-snapshots][] | Disallow large snapshots | | | | [no-test-prefixes][] | Disallow using `f` & `x` prefixes to define focused/skipped tests | | ![fixable-green][] | | [prefer-expect-assertions][] | Suggest using `expect.assertions()` OR `expect.hasAssertions()` | | | +| [prefer-strict-equal][] | Suggest using `toStrictEqual()` | | ![fixable-green][] | | [prefer-to-be-null][] | Suggest using `toBeNull()` | | ![fixable-green][] | | [prefer-to-be-undefined][] | Suggest using `toBeUndefined()` | | ![fixable-green][] | | [prefer-to-have-length][] | Suggest using `toHaveLength()` | ![recommended][] | ![fixable-green][] | @@ -115,6 +116,7 @@ for more information about extending configuration files. [no-large-snapshots]: docs/rules/no-large-snapshots.md [no-test-prefixes]: docs/rules/no-test-prefixes.md [prefer-expect-assertions]: docs/rules/prefer-expect-assertions.md +[prefer-strict-equal]: docs/rules/prefer-strict-equal.md [prefer-to-be-null]: docs/rules/prefer-to-be-null.md [prefer-to-be-undefined]: docs/rules/prefer-to-be-undefined.md [prefer-to-have-length]: docs/rules/prefer-to-have-length.md diff --git a/docs/rules/prefer-strict-equal.md b/docs/rules/prefer-strict-equal.md new file mode 100644 index 000000000..d1f64045e --- /dev/null +++ b/docs/rules/prefer-strict-equal.md @@ -0,0 +1,25 @@ +# Suggest using `toStrictEqual()` ` (prefer-strict-equal) + +`toStrictEqual` not only checks that two objects contain the same data but also +that they have the same shape. The believe is that imposing a stricter equality +results in safer tests. + +## Rule details + +This rule triggers a warning if `toEqual()` is used to assert equality. + +This rule is enabled by default. + +### Default configuration + +The following pattern is considered warning: + +```js +expect({ a: 'a', b: undefined }).toEqual({ a: 'a' }); // true +``` + +The following pattern is not warning: + +```js +expect({ a: 'a', b: undefined }).toStrictEqual({ a: 'a' }); // false +``` diff --git a/index.js b/index.js index 0d7e3e483..32c2059ed 100644 --- a/index.js +++ b/index.js @@ -18,6 +18,7 @@ const validExpect = require('./rules/valid-expect'); const preferExpectAssertions = require('./rules/prefer-expect-assertions'); const validExpectInPromise = require('./rules/valid-expect-in-promise'); const preferInlineSnapshots = require('./rules/prefer-inline-snapshots'); +const preferStrictEqual = require('./rules/prefer-strict-equal'); const snapshotProcessor = require('./processors/snapshot-processor'); @@ -83,5 +84,6 @@ module.exports = { 'prefer-expect-assertions': preferExpectAssertions, 'valid-expect-in-promise': validExpectInPromise, 'prefer-inline-snapshots': preferInlineSnapshots, + 'prefer-strict-equal': preferStrictEqual, }, }; diff --git a/rules/__tests__/prefer-strict-equal.test.js b/rules/__tests__/prefer-strict-equal.test.js new file mode 100644 index 000000000..8104f43d8 --- /dev/null +++ b/rules/__tests__/prefer-strict-equal.test.js @@ -0,0 +1,23 @@ +'use strict'; + +const RuleTester = require('eslint').RuleTester; +const rule = require('../prefer-strict-equal'); + +const ruleTester = new RuleTester(); + +ruleTester.run('prefer-strict-equal', rule, { + valid: ['expect(something).toStrictEqual(somethingElse);'], + invalid: [ + { + code: 'expect(something).toEqual(somethingElse);', + errors: [ + { + message: 'Use toStrictEqual() instead', + column: 19, + line: 1, + }, + ], + output: 'expect(something).toStrictEqual(somethingElse);', + }, + ], +}); diff --git a/rules/prefer-strict-equal.js b/rules/prefer-strict-equal.js new file mode 100644 index 000000000..838438913 --- /dev/null +++ b/rules/prefer-strict-equal.js @@ -0,0 +1,28 @@ +'use strict'; + +const getDocsUrl = require('./util').getDocsUrl; + +module.exports = { + meta: { + docs: { + url: getDocsUrl(__filename), + }, + fixable: 'code', + }, + create(context) { + return { + CallExpression(node) { + const propertyName = node.callee.property && node.callee.property.name; + if (propertyName === 'toEqual') { + context.report({ + fix(fixer) { + return [fixer.replaceText(node.callee.property, 'toStrictEqual')]; + }, + message: 'Use toStrictEqual() instead', + node: node.callee.property, + }); + } + }, + }; + }, +};