From 92b1d5c47937131c844156c6eafeceab7165ee9c Mon Sep 17 00:00:00 2001 From: Tryggvi Gylfason Date: Sat, 11 Aug 2018 15:11:17 +0200 Subject: [PATCH] feat(rules): add prefer-strict-equal (#134) --- README.md | 2 ++ docs/rules/prefer-strict-equal.md | 22 ++++++++++++++++ index.js | 2 ++ rules/__tests__/prefer-strict-equal.test.js | 23 +++++++++++++++++ rules/prefer-strict-equal.js | 28 +++++++++++++++++++++ 5 files changed, 77 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 4675ecd60..a5db90365 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,7 @@ for more information about extending configuration files. | [no-test-prefixes][] | Disallow using `f` & `x` prefixes to define focused/skipped tests | | ![fixable-green][] | | [no-test-return-statement][] | Disallow explicitly returning from tests | | | | [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][] | @@ -119,6 +120,7 @@ for more information about extending configuration files. [no-test-prefixes]: docs/rules/no-test-prefixes.md [no-test-return-statement]: docs/rules/no-test-return-statement.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..0436b1c0a --- /dev/null +++ b/docs/rules/prefer-strict-equal.md @@ -0,0 +1,22 @@ +# Suggest using `toStrictEqual()` (prefer-strict-equal) + +`toStrictEqual` not only checks that two objects contain the same data but also +that they have the same structure. It is common to expect objects to not only have identical values but also to have identical keys. A stricter equality will catch cases where two objects do not have identical keys. + +## Rule details + +This rule triggers a warning if `toEqual()` is used to assert equality. + +### 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 87a3bb071..44ec39abb 100644 --- a/index.js +++ b/index.js @@ -20,6 +20,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'); @@ -87,5 +88,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, + }); + } + }, + }; + }, +};