eslint-plugin-jest 22.15.0 → 22.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -40
- package/docs/rules/prefer-to-be-null.md +7 -2
- package/docs/rules/prefer-to-be-undefined.md +7 -2
- package/docs/rules/prefer-to-contain.md +8 -10
- package/docs/rules/prefer-to-have-length.md +7 -3
- package/docs/rules/require-top-level-describe.md +52 -0
- package/lib/__tests__/rules.test.js +5 -4
- package/lib/index.js +2 -3
- package/lib/rules/consistent-test-it.js +7 -7
- package/lib/rules/expect-expect.js +3 -3
- package/lib/rules/lowercase-name.js +3 -3
- package/lib/rules/no-alias-methods.js +18 -14
- package/lib/rules/no-commented-out-tests.js +2 -2
- package/lib/rules/no-disabled-tests.js +4 -4
- package/lib/rules/no-duplicate-hooks.js +5 -5
- package/lib/rules/no-empty-title.js +8 -14
- package/lib/rules/no-expect-resolves.js +3 -3
- package/lib/rules/no-export.js +3 -3
- package/lib/rules/no-focused-tests.js +4 -4
- package/lib/rules/no-hooks.js +3 -3
- package/lib/rules/no-identical-title.js +9 -9
- package/lib/rules/no-if.js +5 -5
- package/lib/rules/no-jasmine-globals.js +4 -4
- package/lib/rules/no-jest-import.js +2 -2
- package/lib/rules/no-large-snapshots.js +25 -18
- package/lib/rules/no-mocks-import.js +18 -7
- package/lib/rules/no-standalone-expect.js +8 -8
- package/lib/rules/no-test-callback.js +5 -5
- package/lib/rules/no-test-prefixes.js +4 -4
- package/lib/rules/no-test-return-statement.js +4 -4
- package/lib/rules/no-truthy-falsy.js +31 -19
- package/lib/rules/no-try-expect.js +5 -5
- package/lib/rules/prefer-called-with.js +23 -11
- package/lib/rules/prefer-expect-assertions.js +45 -34
- package/lib/rules/prefer-inline-snapshots.js +2 -2
- package/lib/rules/prefer-spy-on.js +4 -4
- package/lib/rules/prefer-strict-equal.js +10 -12
- package/lib/rules/prefer-to-be-null.js +34 -16
- package/lib/rules/prefer-to-be-undefined.js +34 -16
- package/lib/rules/prefer-to-contain.js +112 -51
- package/lib/rules/prefer-to-have-length.js +47 -14
- package/lib/rules/prefer-todo.js +13 -17
- package/lib/rules/require-top-level-describe.js +66 -0
- package/lib/rules/require-tothrow-message.js +20 -15
- package/lib/rules/utils.js +486 -0
- package/lib/rules/valid-describe.js +36 -44
- package/lib/rules/valid-expect-in-promise.js +71 -66
- package/lib/rules/valid-expect.js +140 -173
- package/package.json +6 -5
- package/lib/rules/tsUtils.js +0 -250
- package/lib/rules/util.js +0 -100
|
@@ -7,17 +7,17 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _experimentalUtils = require("@typescript-eslint/experimental-utils");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _utils = require("./utils");
|
|
11
11
|
|
|
12
12
|
function isIdentifierResolves(node) {
|
|
13
13
|
return node.property.type === _experimentalUtils.AST_NODE_TYPES.Identifier && node.property.name === 'resolves';
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
function isExpectResolves(node) {
|
|
17
|
-
return (0,
|
|
17
|
+
return (0, _utils.isExpectCall)(node.object) && isIdentifierResolves(node);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
var _default = (0,
|
|
20
|
+
var _default = (0, _utils.createRule)({
|
|
21
21
|
name: __filename,
|
|
22
22
|
meta: {
|
|
23
23
|
docs: {
|
package/lib/rules/no-export.js
CHANGED
|
@@ -7,9 +7,9 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _experimentalUtils = require("@typescript-eslint/experimental-utils");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _utils = require("./utils");
|
|
11
11
|
|
|
12
|
-
var _default = (0,
|
|
12
|
+
var _default = (0, _utils.createRule)({
|
|
13
13
|
name: __filename,
|
|
14
14
|
meta: {
|
|
15
15
|
docs: {
|
|
@@ -42,7 +42,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
42
42
|
},
|
|
43
43
|
|
|
44
44
|
CallExpression(node) {
|
|
45
|
-
if ((0,
|
|
45
|
+
if ((0, _utils.isTestCase)(node)) {
|
|
46
46
|
hasTestCase = true;
|
|
47
47
|
}
|
|
48
48
|
},
|
|
@@ -7,19 +7,19 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _experimentalUtils = require("@typescript-eslint/experimental-utils");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _utils = require("./utils");
|
|
11
11
|
|
|
12
12
|
const testFunctions = new Set(['describe', 'it', 'test']);
|
|
13
13
|
|
|
14
|
-
const matchesTestFunction = object => object && 'name' in object && (object.name in
|
|
14
|
+
const matchesTestFunction = object => object && 'name' in object && (object.name in _utils.TestCaseName || object.name in _utils.DescribeAlias);
|
|
15
15
|
|
|
16
|
-
const isCallToFocusedTestFunction = object => object && object.name
|
|
16
|
+
const isCallToFocusedTestFunction = object => object && object.name.startsWith('f') && testFunctions.has(object.name.substring(1));
|
|
17
17
|
|
|
18
18
|
const isPropertyNamedOnly = property => property && ('name' in property && property.name === 'only' || 'value' in property && property.value === 'only');
|
|
19
19
|
|
|
20
20
|
const isCallToTestOnlyFunction = callee => matchesTestFunction(callee.object) && isPropertyNamedOnly(callee.property);
|
|
21
21
|
|
|
22
|
-
var _default = (0,
|
|
22
|
+
var _default = (0, _utils.createRule)({
|
|
23
23
|
name: __filename,
|
|
24
24
|
meta: {
|
|
25
25
|
docs: {
|
package/lib/rules/no-hooks.js
CHANGED
|
@@ -5,9 +5,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _utils = require("./utils");
|
|
9
9
|
|
|
10
|
-
var _default = (0,
|
|
10
|
+
var _default = (0, _utils.createRule)({
|
|
11
11
|
name: __filename,
|
|
12
12
|
meta: {
|
|
13
13
|
docs: {
|
|
@@ -46,7 +46,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
46
46
|
|
|
47
47
|
return {
|
|
48
48
|
CallExpression(node) {
|
|
49
|
-
if ((0,
|
|
49
|
+
if ((0, _utils.isHook)(node) && !isWhitelisted(node)) {
|
|
50
50
|
context.report({
|
|
51
51
|
node,
|
|
52
52
|
messageId: 'unexpectedHook',
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _utils = require("./utils");
|
|
9
9
|
|
|
10
10
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
|
|
11
11
|
|
|
@@ -20,7 +20,7 @@ const newDescribeContext = () => ({
|
|
|
20
20
|
testTitles: []
|
|
21
21
|
});
|
|
22
22
|
|
|
23
|
-
var _default = (0,
|
|
23
|
+
var _default = (0, _utils.createRule)({
|
|
24
24
|
name: __filename,
|
|
25
25
|
meta: {
|
|
26
26
|
docs: {
|
|
@@ -43,20 +43,20 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
43
43
|
CallExpression(node) {
|
|
44
44
|
const currentLayer = contexts[contexts.length - 1];
|
|
45
45
|
|
|
46
|
-
if ((0,
|
|
46
|
+
if ((0, _utils.isDescribe)(node)) {
|
|
47
47
|
contexts.push(newDescribeContext());
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
const _node$arguments = _slicedToArray(node.arguments, 1),
|
|
51
|
-
|
|
51
|
+
argument = _node$arguments[0];
|
|
52
52
|
|
|
53
|
-
if (!(0,
|
|
53
|
+
if (!argument || !(0, _utils.isStringNode)(argument) || (0, _utils.isTemplateLiteral)(argument) && argument.expressions.length > 0) {
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
const title = (0,
|
|
57
|
+
const title = (0, _utils.getAccessorValue)(argument);
|
|
58
58
|
|
|
59
|
-
if ((0,
|
|
59
|
+
if ((0, _utils.isTestCase)(node)) {
|
|
60
60
|
if (currentLayer.testTitles.includes(title)) {
|
|
61
61
|
context.report({
|
|
62
62
|
messageId: 'multipleTestTitle',
|
|
@@ -67,7 +67,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
67
67
|
currentLayer.testTitles.push(title);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
if (!(0,
|
|
70
|
+
if (!(0, _utils.isDescribe)(node)) {
|
|
71
71
|
return;
|
|
72
72
|
}
|
|
73
73
|
|
|
@@ -82,7 +82,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
82
82
|
},
|
|
83
83
|
|
|
84
84
|
'CallExpression:exit'(node) {
|
|
85
|
-
if ((0,
|
|
85
|
+
if ((0, _utils.isDescribe)(node)) {
|
|
86
86
|
contexts.pop();
|
|
87
87
|
}
|
|
88
88
|
}
|
package/lib/rules/no-if.js
CHANGED
|
@@ -5,15 +5,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _utils = require("./utils");
|
|
9
9
|
|
|
10
10
|
var _experimentalUtils = require("@typescript-eslint/experimental-utils");
|
|
11
11
|
|
|
12
|
-
const testCaseNames = new Set([...Object.keys(
|
|
12
|
+
const testCaseNames = new Set([...Object.keys(_utils.TestCaseName), 'it.only', 'it.skip', 'test.only', 'test.skip']);
|
|
13
13
|
|
|
14
|
-
const isTestArrowFunction = node => node.parent !== undefined && node.parent.type === _experimentalUtils.AST_NODE_TYPES.CallExpression && testCaseNames.has((0,
|
|
14
|
+
const isTestArrowFunction = node => node.parent !== undefined && node.parent.type === _experimentalUtils.AST_NODE_TYPES.CallExpression && testCaseNames.has((0, _utils.getNodeName)(node.parent.callee));
|
|
15
15
|
|
|
16
|
-
var _default = (0,
|
|
16
|
+
var _default = (0, _utils.createRule)({
|
|
17
17
|
name: __filename,
|
|
18
18
|
meta: {
|
|
19
19
|
docs: {
|
|
@@ -49,7 +49,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
49
49
|
|
|
50
50
|
return {
|
|
51
51
|
CallExpression(node) {
|
|
52
|
-
stack.push((0,
|
|
52
|
+
stack.push((0, _utils.isTestCase)(node));
|
|
53
53
|
},
|
|
54
54
|
|
|
55
55
|
FunctionExpression() {
|
|
@@ -7,9 +7,9 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _experimentalUtils = require("@typescript-eslint/experimental-utils");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _utils = require("./utils");
|
|
11
11
|
|
|
12
|
-
var _default = (0,
|
|
12
|
+
var _default = (0, _utils.createRule)({
|
|
13
13
|
name: __filename,
|
|
14
14
|
meta: {
|
|
15
15
|
docs: {
|
|
@@ -34,14 +34,14 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
34
34
|
return {
|
|
35
35
|
CallExpression(node) {
|
|
36
36
|
const callee = node.callee;
|
|
37
|
-
const calleeName = (0,
|
|
37
|
+
const calleeName = (0, _utils.getNodeName)(callee);
|
|
38
38
|
|
|
39
39
|
if (!calleeName) {
|
|
40
40
|
return;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
if (calleeName === 'spyOn' || calleeName === 'spyOnProperty' || calleeName === 'fail' || calleeName === 'pending') {
|
|
44
|
-
if ((0,
|
|
44
|
+
if ((0, _utils.scopeHasLocalReference)(context.getScope(), calleeName)) {
|
|
45
45
|
// It's a local variable, not a jasmine global.
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
@@ -5,9 +5,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _utils = require("./utils");
|
|
9
9
|
|
|
10
|
-
var _default = (0,
|
|
10
|
+
var _default = (0, _utils.createRule)({
|
|
11
11
|
name: __filename,
|
|
12
12
|
meta: {
|
|
13
13
|
type: 'problem',
|
|
@@ -5,17 +5,20 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
+
var _experimentalUtils = require("@typescript-eslint/experimental-utils");
|
|
9
|
+
|
|
8
10
|
var _path = require("path");
|
|
9
11
|
|
|
10
|
-
var
|
|
12
|
+
var _utils = require("./utils");
|
|
11
13
|
|
|
12
|
-
const reportOnViolation = (context, node
|
|
13
|
-
|
|
14
|
+
const reportOnViolation = (context, node, {
|
|
15
|
+
maxSize: lineLimit = 50,
|
|
16
|
+
whitelistedSnapshots = {}
|
|
17
|
+
}) => {
|
|
14
18
|
const startLine = node.loc.start.line;
|
|
15
19
|
const endLine = node.loc.end.line;
|
|
16
20
|
const lineCount = endLine - startLine;
|
|
17
|
-
const
|
|
18
|
-
const allPathsAreAbsolute = Object.keys(whitelistedSnapshots || {}).every(_path.isAbsolute);
|
|
21
|
+
const allPathsAreAbsolute = Object.keys(whitelistedSnapshots).every(_path.isAbsolute);
|
|
19
22
|
|
|
20
23
|
if (!allPathsAreAbsolute) {
|
|
21
24
|
throw new Error('All paths for whitelistedSnapshots must be absolute. You can use JS config and `path.resolve`');
|
|
@@ -23,18 +26,18 @@ const reportOnViolation = (context, node) => {
|
|
|
23
26
|
|
|
24
27
|
let isWhitelisted = false;
|
|
25
28
|
|
|
26
|
-
if (whitelistedSnapshots) {
|
|
29
|
+
if (whitelistedSnapshots && node.type === _experimentalUtils.AST_NODE_TYPES.ExpressionStatement && 'left' in node.expression && (0, _utils.isExpectMember)(node.expression.left)) {
|
|
27
30
|
const fileName = context.getFilename();
|
|
28
31
|
const whitelistedSnapshotsInFile = whitelistedSnapshots[fileName];
|
|
29
32
|
|
|
30
33
|
if (whitelistedSnapshotsInFile) {
|
|
31
|
-
const snapshotName = (0,
|
|
34
|
+
const snapshotName = (0, _utils.getAccessorValue)(node.expression.left.property);
|
|
32
35
|
isWhitelisted = whitelistedSnapshotsInFile.some(name => {
|
|
33
|
-
if (name
|
|
36
|
+
if (name instanceof RegExp) {
|
|
34
37
|
return name.test(snapshotName);
|
|
35
38
|
}
|
|
36
39
|
|
|
37
|
-
return
|
|
40
|
+
return snapshotName;
|
|
38
41
|
});
|
|
39
42
|
}
|
|
40
43
|
}
|
|
@@ -51,15 +54,19 @@ const reportOnViolation = (context, node) => {
|
|
|
51
54
|
}
|
|
52
55
|
};
|
|
53
56
|
|
|
54
|
-
var _default = {
|
|
57
|
+
var _default = (0, _utils.createRule)({
|
|
58
|
+
name: __filename,
|
|
55
59
|
meta: {
|
|
56
60
|
docs: {
|
|
57
|
-
|
|
61
|
+
category: 'Best Practices',
|
|
62
|
+
description: 'disallow large snapshots',
|
|
63
|
+
recommended: false
|
|
58
64
|
},
|
|
59
65
|
messages: {
|
|
60
66
|
noSnapshot: '`{{ lineCount }}`s should begin with lowercase',
|
|
61
67
|
tooLongSnapshots: 'Expected Jest snapshot to be smaller than {{ lineLimit }} lines but was {{ lineCount }} lines long'
|
|
62
68
|
},
|
|
69
|
+
type: 'suggestion',
|
|
63
70
|
schema: [{
|
|
64
71
|
type: 'object',
|
|
65
72
|
properties: {
|
|
@@ -78,22 +85,21 @@ var _default = {
|
|
|
78
85
|
additionalProperties: false
|
|
79
86
|
}]
|
|
80
87
|
},
|
|
88
|
+
defaultOptions: [{}],
|
|
81
89
|
|
|
82
|
-
create(context) {
|
|
90
|
+
create(context, [options]) {
|
|
83
91
|
if (context.getFilename().endsWith('.snap')) {
|
|
84
92
|
return {
|
|
85
93
|
ExpressionStatement(node) {
|
|
86
|
-
reportOnViolation(context, node);
|
|
94
|
+
reportOnViolation(context, node, options);
|
|
87
95
|
}
|
|
88
96
|
|
|
89
97
|
};
|
|
90
98
|
} else if (context.getFilename().endsWith('.js')) {
|
|
91
99
|
return {
|
|
92
100
|
CallExpression(node) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (propertyName === 'toMatchInlineSnapshot' || propertyName === 'toThrowErrorMatchingInlineSnapshot') {
|
|
96
|
-
reportOnViolation(context, node);
|
|
101
|
+
if ('property' in node.callee && ((0, _utils.isSupportedAccessor)(node.callee.property, 'toMatchInlineSnapshot') || (0, _utils.isSupportedAccessor)(node.callee.property, 'toThrowErrorMatchingInlineSnapshot'))) {
|
|
102
|
+
reportOnViolation(context, node, options);
|
|
97
103
|
}
|
|
98
104
|
}
|
|
99
105
|
|
|
@@ -103,5 +109,6 @@ var _default = {
|
|
|
103
109
|
return {};
|
|
104
110
|
}
|
|
105
111
|
|
|
106
|
-
};
|
|
112
|
+
});
|
|
113
|
+
|
|
107
114
|
exports.default = _default;
|
|
@@ -7,21 +7,29 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _path = require("path");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _utils = require("./utils");
|
|
11
|
+
|
|
12
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
|
|
13
|
+
|
|
14
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
|
15
|
+
|
|
16
|
+
function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
17
|
+
|
|
18
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
11
19
|
|
|
12
20
|
const mocksDirName = '__mocks__';
|
|
13
21
|
|
|
14
22
|
const isMockPath = path => path.split(_path.posix.sep).includes(mocksDirName);
|
|
15
23
|
|
|
16
|
-
const isMockImportLiteral = expression =>
|
|
24
|
+
const isMockImportLiteral = expression => (0, _utils.isStringNode)(expression) && isMockPath((0, _utils.getStringValue)(expression));
|
|
17
25
|
|
|
18
|
-
var _default = (0,
|
|
26
|
+
var _default = (0, _utils.createRule)({
|
|
19
27
|
name: __filename,
|
|
20
28
|
meta: {
|
|
21
29
|
type: 'problem',
|
|
22
30
|
docs: {
|
|
23
|
-
description: 'When using `jest.mock`, your tests (just like the code being tested) should import from `./x`, not `./__mocks__/x`. Not following this rule can lead to confusion, because you will have multiple instances of the mocked module',
|
|
24
31
|
category: 'Best Practices',
|
|
32
|
+
description: 'When using `jest.mock`, your tests (just like the code being tested) should import from `./x`, not `./__mocks__/x`. Not following this rule can lead to confusion, because you will have multiple instances of the mocked module',
|
|
25
33
|
recommended: 'error'
|
|
26
34
|
},
|
|
27
35
|
messages: {
|
|
@@ -34,7 +42,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
34
42
|
create(context) {
|
|
35
43
|
return {
|
|
36
44
|
ImportDeclaration(node) {
|
|
37
|
-
if (isMockImportLiteral(node.source)) {
|
|
45
|
+
if (node.source && isMockImportLiteral(node.source)) {
|
|
38
46
|
context.report({
|
|
39
47
|
node,
|
|
40
48
|
messageId: 'noManualImport'
|
|
@@ -43,9 +51,12 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
43
51
|
},
|
|
44
52
|
|
|
45
53
|
'CallExpression[callee.name="require"]'(node) {
|
|
46
|
-
|
|
54
|
+
const _node$arguments = _slicedToArray(node.arguments, 1),
|
|
55
|
+
arg = _node$arguments[0];
|
|
56
|
+
|
|
57
|
+
if (arg && isMockImportLiteral(arg)) {
|
|
47
58
|
context.report({
|
|
48
|
-
node:
|
|
59
|
+
node: arg,
|
|
49
60
|
messageId: 'noManualImport'
|
|
50
61
|
});
|
|
51
62
|
}
|
|
@@ -7,7 +7,7 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _experimentalUtils = require("@typescript-eslint/experimental-utils");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _utils = require("./utils");
|
|
11
11
|
|
|
12
12
|
const getBlockType = stmt => {
|
|
13
13
|
const func = stmt.parent;
|
|
@@ -22,7 +22,7 @@ const getBlockType = stmt => {
|
|
|
22
22
|
return 'function';
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
if ((0,
|
|
25
|
+
if ((0, _utils.isFunction)(func) && func.parent) {
|
|
26
26
|
const expr = func.parent; // arrowfunction or function expr
|
|
27
27
|
|
|
28
28
|
if (expr.type === _experimentalUtils.AST_NODE_TYPES.VariableDeclarator) {
|
|
@@ -30,7 +30,7 @@ const getBlockType = stmt => {
|
|
|
30
30
|
} // if it's not a variable, it will be callExpr, we only care about describe
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
if (expr.type === _experimentalUtils.AST_NODE_TYPES.CallExpression && (0,
|
|
33
|
+
if (expr.type === _experimentalUtils.AST_NODE_TYPES.CallExpression && (0, _utils.isDescribe)(expr)) {
|
|
34
34
|
return 'describe';
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -39,14 +39,14 @@ const getBlockType = stmt => {
|
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
const isEach = node => {
|
|
42
|
-
if (node && node.callee && node.callee.type === _experimentalUtils.AST_NODE_TYPES.CallExpression && node.callee.callee && node.callee.callee.type === _experimentalUtils.AST_NODE_TYPES.MemberExpression && node.callee.callee.property && node.callee.callee.property.type === _experimentalUtils.AST_NODE_TYPES.Identifier && node.callee.callee.property.name === 'each' && node.callee.callee.object && node.callee.callee.object.type === _experimentalUtils.AST_NODE_TYPES.Identifier &&
|
|
42
|
+
if (node && node.callee && node.callee.type === _experimentalUtils.AST_NODE_TYPES.CallExpression && node.callee.callee && node.callee.callee.type === _experimentalUtils.AST_NODE_TYPES.MemberExpression && node.callee.callee.property && node.callee.callee.property.type === _experimentalUtils.AST_NODE_TYPES.Identifier && node.callee.callee.property.name === 'each' && node.callee.callee.object && node.callee.callee.object.type === _experimentalUtils.AST_NODE_TYPES.Identifier && _utils.TestCaseName.hasOwnProperty(node.callee.callee.object.name)) {
|
|
43
43
|
return true;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
return false;
|
|
47
47
|
};
|
|
48
48
|
|
|
49
|
-
var _default = (0,
|
|
49
|
+
var _default = (0, _utils.createRule)({
|
|
50
50
|
name: __filename,
|
|
51
51
|
meta: {
|
|
52
52
|
docs: {
|
|
@@ -66,7 +66,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
66
66
|
const callStack = [];
|
|
67
67
|
return {
|
|
68
68
|
CallExpression(node) {
|
|
69
|
-
if ((0,
|
|
69
|
+
if ((0, _utils.isExpectCall)(node)) {
|
|
70
70
|
const parent = callStack[callStack.length - 1];
|
|
71
71
|
|
|
72
72
|
if (!parent || parent === 'describe') {
|
|
@@ -79,7 +79,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
if ((0,
|
|
82
|
+
if ((0, _utils.isTestCase)(node)) {
|
|
83
83
|
callStack.push('test');
|
|
84
84
|
}
|
|
85
85
|
|
|
@@ -91,7 +91,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
91
91
|
'CallExpression:exit'(node) {
|
|
92
92
|
const top = callStack[callStack.length - 1];
|
|
93
93
|
|
|
94
|
-
if (((0,
|
|
94
|
+
if (((0, _utils.isTestCase)(node) && node.callee.type !== _experimentalUtils.AST_NODE_TYPES.MemberExpression || isEach(node)) && top === 'test' || node.callee.type === _experimentalUtils.AST_NODE_TYPES.TaggedTemplateExpression && top === 'template') {
|
|
95
95
|
callStack.pop();
|
|
96
96
|
}
|
|
97
97
|
},
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _utils = require("./utils");
|
|
9
9
|
|
|
10
10
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
|
|
11
11
|
|
|
@@ -15,7 +15,7 @@ function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d =
|
|
|
15
15
|
|
|
16
16
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
17
17
|
|
|
18
|
-
var _default = (0,
|
|
18
|
+
var _default = (0, _utils.createRule)({
|
|
19
19
|
name: __filename,
|
|
20
20
|
meta: {
|
|
21
21
|
docs: {
|
|
@@ -35,14 +35,14 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
35
35
|
create(context) {
|
|
36
36
|
return {
|
|
37
37
|
CallExpression(node) {
|
|
38
|
-
if (!(0,
|
|
38
|
+
if (!(0, _utils.isTestCase)(node) || node.arguments.length !== 2) {
|
|
39
39
|
return;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
const _node$arguments = _slicedToArray(node.arguments, 2),
|
|
43
43
|
callback = _node$arguments[1];
|
|
44
44
|
|
|
45
|
-
if (!(0,
|
|
45
|
+
if (!(0, _utils.isFunction)(callback) || callback.params.length !== 1) {
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
48
|
|
|
@@ -55,7 +55,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
55
55
|
|
|
56
56
|
fix(fixer) {
|
|
57
57
|
const body = callback.body;
|
|
58
|
-
/* istanbul ignore if */
|
|
58
|
+
/* istanbul ignore if https://github.com/typescript-eslint/typescript-eslint/issues/734 */
|
|
59
59
|
|
|
60
60
|
if (!body) {
|
|
61
61
|
throw new Error(`Unexpected null when attempting to fix ${context.getFilename()} - please file a github issue at https://github.com/jest-community/eslint-plugin-jest`);
|
|
@@ -5,9 +5,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _utils = require("./utils");
|
|
9
9
|
|
|
10
|
-
var _default = (0,
|
|
10
|
+
var _default = (0, _utils.createRule)({
|
|
11
11
|
name: __filename,
|
|
12
12
|
meta: {
|
|
13
13
|
docs: {
|
|
@@ -27,8 +27,8 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
27
27
|
create(context) {
|
|
28
28
|
return {
|
|
29
29
|
CallExpression(node) {
|
|
30
|
-
const nodeName = (0,
|
|
31
|
-
if (!nodeName || !(0,
|
|
30
|
+
const nodeName = (0, _utils.getNodeName)(node.callee);
|
|
31
|
+
if (!nodeName || !(0, _utils.isDescribe)(node) && !(0, _utils.isTestCase)(node)) return;
|
|
32
32
|
const preferredNodeName = getPreferredNodeName(nodeName);
|
|
33
33
|
if (!preferredNodeName) return;
|
|
34
34
|
context.report({
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _utils = require("./utils");
|
|
9
9
|
|
|
10
10
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
|
|
11
11
|
|
|
@@ -22,14 +22,14 @@ const getBody = args => {
|
|
|
22
22
|
const _args = _slicedToArray(args, 2),
|
|
23
23
|
secondArg = _args[1];
|
|
24
24
|
|
|
25
|
-
if (secondArg && (0,
|
|
25
|
+
if (secondArg && (0, _utils.isFunction)(secondArg) && secondArg.body && secondArg.body.type === BLOCK_STATEMENT) {
|
|
26
26
|
return secondArg.body.body;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
return [];
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
-
var _default = (0,
|
|
32
|
+
var _default = (0, _utils.createRule)({
|
|
33
33
|
name: __filename,
|
|
34
34
|
meta: {
|
|
35
35
|
docs: {
|
|
@@ -48,7 +48,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
48
48
|
create(context) {
|
|
49
49
|
return {
|
|
50
50
|
CallExpression(node) {
|
|
51
|
-
if (!(0,
|
|
51
|
+
if (!(0, _utils.isTestCase)(node)) return;
|
|
52
52
|
const body = getBody(node.arguments);
|
|
53
53
|
const returnStmt = body.find(t => t.type === RETURN_STATEMENT);
|
|
54
54
|
if (!returnStmt) return;
|
|
@@ -5,41 +5,53 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _utils = require("./utils");
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
// todo: refactor into "ban-matchers"
|
|
11
|
+
var _default = (0, _utils.createRule)({
|
|
12
|
+
name: __filename,
|
|
11
13
|
meta: {
|
|
12
14
|
docs: {
|
|
13
|
-
|
|
15
|
+
category: 'Best Practices',
|
|
16
|
+
description: 'Disallow using `toBeTruthy()` & `toBeFalsy()`',
|
|
17
|
+
recommended: false
|
|
14
18
|
},
|
|
15
19
|
messages: {
|
|
16
|
-
avoidMessage: 'Avoid {{methodName}}'
|
|
20
|
+
avoidMessage: 'Avoid {{ methodName }}'
|
|
17
21
|
},
|
|
22
|
+
type: 'suggestion',
|
|
18
23
|
schema: []
|
|
19
24
|
},
|
|
25
|
+
defaultOptions: [],
|
|
20
26
|
|
|
21
27
|
create(context) {
|
|
22
28
|
return {
|
|
23
29
|
CallExpression(node) {
|
|
24
|
-
if ((0,
|
|
25
|
-
|
|
26
|
-
const methodNode = (0, _util.method)(targetNode);
|
|
27
|
-
const methodName = methodNode.name;
|
|
28
|
-
|
|
29
|
-
if (methodName === 'toBeTruthy' || methodName === 'toBeFalsy') {
|
|
30
|
-
context.report({
|
|
31
|
-
data: {
|
|
32
|
-
methodName
|
|
33
|
-
},
|
|
34
|
-
messageId: 'avoidMessage',
|
|
35
|
-
node: methodNode
|
|
36
|
-
});
|
|
37
|
-
}
|
|
30
|
+
if (!(0, _utils.isExpectCall)(node)) {
|
|
31
|
+
return;
|
|
38
32
|
}
|
|
33
|
+
|
|
34
|
+
const _parseExpectCall = (0, _utils.parseExpectCall)(node),
|
|
35
|
+
matcher = _parseExpectCall.matcher;
|
|
36
|
+
|
|
37
|
+
if (!matcher || !['toBeTruthy', 'toBeFalsy'].includes(matcher.name)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
context.report({
|
|
42
|
+
data: {
|
|
43
|
+
methodName: matcher.name
|
|
44
|
+
},
|
|
45
|
+
// todo: rename to 'matcherName'
|
|
46
|
+
messageId: 'avoidMessage',
|
|
47
|
+
// todo: rename to 'avoidMatcher'
|
|
48
|
+
node: matcher.node.property
|
|
49
|
+
});
|
|
39
50
|
}
|
|
40
51
|
|
|
41
52
|
};
|
|
42
53
|
}
|
|
43
54
|
|
|
44
|
-
};
|
|
55
|
+
});
|
|
56
|
+
|
|
45
57
|
exports.default = _default;
|