eslint-plugin-jest 27.1.2 → 27.1.4
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 +81 -80
- package/docs/rules/consistent-test-it.md +4 -11
- package/docs/rules/expect-expect.md +3 -4
- package/docs/rules/max-expects.md +1 -5
- package/docs/rules/max-nested-describe.md +1 -5
- package/docs/rules/no-alias-methods.md +8 -10
- package/docs/rules/no-commented-out-tests.md +3 -4
- package/docs/rules/no-conditional-expect.md +4 -5
- package/docs/rules/no-conditional-in-test.md +1 -5
- package/docs/rules/no-deprecated-functions.md +5 -7
- package/docs/rules/no-disabled-tests.md +3 -4
- package/docs/rules/no-done-callback.md +6 -8
- package/docs/rules/no-duplicate-hooks.md +1 -5
- package/docs/rules/no-export.md +3 -4
- package/docs/rules/no-focused-tests.md +5 -7
- package/docs/rules/no-hooks.md +1 -5
- package/docs/rules/no-identical-title.md +3 -4
- package/docs/rules/no-if.md +2 -2
- package/docs/rules/no-interpolation-in-snapshots.md +3 -4
- package/docs/rules/no-jasmine-globals.md +6 -8
- package/docs/rules/no-large-snapshots.md +2 -6
- package/docs/rules/no-mocks-import.md +3 -4
- package/docs/rules/no-restricted-jest-methods.md +1 -5
- package/docs/rules/no-restricted-matchers.md +1 -5
- package/docs/rules/no-standalone-expect.md +3 -4
- package/docs/rules/no-test-prefixes.md +6 -8
- package/docs/rules/no-test-return-statement.md +1 -5
- package/docs/rules/prefer-called-with.md +1 -5
- package/docs/rules/prefer-comparison-matcher.md +3 -8
- package/docs/rules/prefer-each.md +1 -5
- package/docs/rules/prefer-equality-matcher.md +3 -8
- package/docs/rules/prefer-expect-assertions.md +3 -10
- package/docs/rules/prefer-expect-resolves.md +3 -8
- package/docs/rules/prefer-hooks-in-order.md +1 -5
- package/docs/rules/prefer-hooks-on-top.md +1 -5
- package/docs/rules/prefer-lowercase-title.md +3 -8
- package/docs/rules/prefer-mock-promise-shorthand.md +3 -8
- package/docs/rules/prefer-snapshot-hint.md +1 -5
- package/docs/rules/prefer-spy-on.md +3 -10
- package/docs/rules/prefer-strict-equal.md +3 -10
- package/docs/rules/prefer-to-be.md +5 -7
- package/docs/rules/prefer-to-contain.md +5 -9
- package/docs/rules/prefer-to-have-length.md +5 -9
- package/docs/rules/prefer-todo.md +3 -10
- package/docs/rules/require-hook.md +1 -5
- package/docs/rules/require-to-throw-message.md +1 -7
- package/docs/rules/require-top-level-describe.md +1 -5
- package/docs/rules/unbound-method.md +2 -4
- package/docs/rules/valid-describe-callback.md +3 -4
- package/docs/rules/valid-expect-in-promise.md +4 -5
- package/docs/rules/valid-expect.md +3 -6
- package/docs/rules/valid-title.md +5 -7
- package/lib/index.js +8 -16
- package/lib/processors/snapshot-processor.js +3 -5
- package/lib/rules/consistent-test-it.js +1 -19
- package/lib/rules/expect-expect.js +0 -15
- package/lib/rules/max-expects.js +0 -16
- package/lib/rules/max-nested-describe.js +0 -13
- package/lib/rules/no-alias-methods.js +0 -9
- package/lib/rules/no-commented-out-tests.js +0 -10
- package/lib/rules/no-conditional-expect.js +1 -20
- package/lib/rules/no-conditional-in-test.js +0 -9
- package/lib/rules/no-deprecated-functions.js +2 -18
- package/lib/rules/no-disabled-tests.js +2 -18
- package/lib/rules/no-done-callback.js +2 -31
- package/lib/rules/no-duplicate-hooks.js +0 -12
- package/lib/rules/no-export.js +0 -12
- package/lib/rules/no-focused-tests.js +0 -15
- package/lib/rules/no-hooks.js +0 -7
- package/lib/rules/no-identical-title.js +0 -19
- package/lib/rules/no-if.js +0 -24
- package/lib/rules/no-interpolation-in-snapshots.js +0 -9
- package/lib/rules/no-jasmine-globals.js +0 -22
- package/lib/rules/no-large-snapshots.js +3 -21
- package/lib/rules/no-mocks-import.js +0 -12
- package/lib/rules/no-restricted-jest-methods.js +1 -11
- package/lib/rules/no-restricted-matchers.js +0 -11
- package/lib/rules/no-standalone-expect.js +7 -33
- package/lib/rules/no-test-prefixes.js +1 -13
- package/lib/rules/no-test-return-statement.js +0 -12
- package/lib/rules/prefer-called-with.js +0 -10
- package/lib/rules/prefer-comparison-matcher.js +8 -33
- package/lib/rules/prefer-each.js +0 -18
- package/lib/rules/prefer-equality-matcher.js +11 -23
- package/lib/rules/prefer-expect-assertions.js +4 -51
- package/lib/rules/prefer-expect-resolves.js +0 -12
- package/lib/rules/prefer-hooks-in-order.js +2 -16
- package/lib/rules/prefer-hooks-on-top.js +0 -9
- package/lib/rules/prefer-lowercase-title.js +0 -23
- package/lib/rules/prefer-mock-promise-shorthand.js +5 -26
- package/lib/rules/prefer-snapshot-hint.js +7 -31
- package/lib/rules/prefer-spy-on.js +0 -17
- package/lib/rules/prefer-strict-equal.js +0 -9
- package/lib/rules/prefer-to-be.js +1 -30
- package/lib/rules/prefer-to-contain.js +11 -21
- package/lib/rules/prefer-to-have-length.js +4 -16
- package/lib/rules/prefer-todo.js +2 -18
- package/lib/rules/require-hook.js +0 -22
- package/lib/rules/require-to-throw-message.js +0 -9
- package/lib/rules/require-top-level-describe.js +0 -15
- package/lib/rules/unbound-method.js +2 -21
- package/lib/rules/utils/accessors.js +6 -18
- package/lib/rules/utils/detectJestVersion.js +2 -7
- package/lib/rules/utils/followTypeAssertionChain.js +0 -4
- package/lib/rules/utils/index.js +0 -10
- package/lib/rules/utils/misc.js +2 -46
- package/lib/rules/utils/parseJestFnCall.js +62 -118
- package/lib/rules/valid-describe-callback.js +0 -17
- package/lib/rules/valid-expect-in-promise.js +27 -94
- package/lib/rules/valid-expect.js +5 -48
- package/lib/rules/valid-title.js +0 -33
- package/package.json +3 -2
package/lib/rules/prefer-each.js
CHANGED
|
@@ -4,9 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("./utils");
|
|
9
|
-
|
|
10
8
|
var _default = (0, _utils.createRule)({
|
|
11
9
|
name: __filename,
|
|
12
10
|
meta: {
|
|
@@ -22,32 +20,25 @@ var _default = (0, _utils.createRule)({
|
|
|
22
20
|
schema: []
|
|
23
21
|
},
|
|
24
22
|
defaultOptions: [],
|
|
25
|
-
|
|
26
23
|
create(context) {
|
|
27
24
|
const jestFnCalls = [];
|
|
28
25
|
let inTestCaseCall = false;
|
|
29
|
-
|
|
30
26
|
const recommendFn = () => {
|
|
31
27
|
if (jestFnCalls.length === 1 && jestFnCalls[0] === 'test') {
|
|
32
28
|
return 'it';
|
|
33
29
|
}
|
|
34
|
-
|
|
35
30
|
return 'describe';
|
|
36
31
|
};
|
|
37
|
-
|
|
38
32
|
const enterForLoop = () => {
|
|
39
33
|
if (jestFnCalls.length === 0 || inTestCaseCall) {
|
|
40
34
|
return;
|
|
41
35
|
}
|
|
42
|
-
|
|
43
36
|
jestFnCalls.length = 0;
|
|
44
37
|
};
|
|
45
|
-
|
|
46
38
|
const exitForLoop = node => {
|
|
47
39
|
if (jestFnCalls.length === 0 || inTestCaseCall) {
|
|
48
40
|
return;
|
|
49
41
|
}
|
|
50
|
-
|
|
51
42
|
context.report({
|
|
52
43
|
node,
|
|
53
44
|
messageId: 'preferEach',
|
|
@@ -57,7 +48,6 @@ var _default = (0, _utils.createRule)({
|
|
|
57
48
|
});
|
|
58
49
|
jestFnCalls.length = 0;
|
|
59
50
|
};
|
|
60
|
-
|
|
61
51
|
return {
|
|
62
52
|
ForStatement: enterForLoop,
|
|
63
53
|
'ForStatement:exit': exitForLoop,
|
|
@@ -65,34 +55,26 @@ var _default = (0, _utils.createRule)({
|
|
|
65
55
|
'ForInStatement:exit': exitForLoop,
|
|
66
56
|
ForOfStatement: enterForLoop,
|
|
67
57
|
'ForOfStatement:exit': exitForLoop,
|
|
68
|
-
|
|
69
58
|
CallExpression(node) {
|
|
70
59
|
const {
|
|
71
60
|
type: jestFnCallType
|
|
72
61
|
} = (0, _utils.parseJestFnCall)(node, context) ?? {};
|
|
73
|
-
|
|
74
62
|
if (jestFnCallType === 'hook' || jestFnCallType === 'describe' || jestFnCallType === 'test') {
|
|
75
63
|
jestFnCalls.push(jestFnCallType);
|
|
76
64
|
}
|
|
77
|
-
|
|
78
65
|
if (jestFnCallType === 'test') {
|
|
79
66
|
inTestCaseCall = true;
|
|
80
67
|
}
|
|
81
68
|
},
|
|
82
|
-
|
|
83
69
|
'CallExpression:exit'(node) {
|
|
84
70
|
const {
|
|
85
71
|
type: jestFnCallType
|
|
86
72
|
} = (0, _utils.parseJestFnCall)(node, context) ?? {};
|
|
87
|
-
|
|
88
73
|
if (jestFnCallType === 'test') {
|
|
89
74
|
inTestCaseCall = false;
|
|
90
75
|
}
|
|
91
76
|
}
|
|
92
|
-
|
|
93
77
|
};
|
|
94
78
|
}
|
|
95
|
-
|
|
96
79
|
});
|
|
97
|
-
|
|
98
80
|
exports.default = _default;
|
|
@@ -4,11 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("@typescript-eslint/utils");
|
|
9
|
-
|
|
10
8
|
var _utils2 = require("./utils");
|
|
11
|
-
|
|
12
9
|
var _default = (0, _utils2.createRule)({
|
|
13
10
|
name: __filename,
|
|
14
11
|
meta: {
|
|
@@ -26,24 +23,19 @@ var _default = (0, _utils2.createRule)({
|
|
|
26
23
|
schema: []
|
|
27
24
|
},
|
|
28
25
|
defaultOptions: [],
|
|
29
|
-
|
|
30
26
|
create(context) {
|
|
31
27
|
return {
|
|
32
28
|
CallExpression(node) {
|
|
33
29
|
const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
|
|
34
|
-
|
|
35
30
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect' || jestFnCall.args.length === 0) {
|
|
36
31
|
return;
|
|
37
32
|
}
|
|
38
|
-
|
|
39
33
|
const {
|
|
40
34
|
parent: expect
|
|
41
35
|
} = jestFnCall.head.node;
|
|
42
|
-
|
|
43
36
|
if ((expect === null || expect === void 0 ? void 0 : expect.type) !== _utils.AST_NODE_TYPES.CallExpression) {
|
|
44
37
|
return;
|
|
45
38
|
}
|
|
46
|
-
|
|
47
39
|
const {
|
|
48
40
|
arguments: [comparison],
|
|
49
41
|
range: [, expectCallEnd]
|
|
@@ -52,33 +44,32 @@ var _default = (0, _utils2.createRule)({
|
|
|
52
44
|
matcher
|
|
53
45
|
} = jestFnCall;
|
|
54
46
|
const matcherArg = (0, _utils2.getFirstMatcherArg)(jestFnCall);
|
|
55
|
-
|
|
56
47
|
if ((comparison === null || comparison === void 0 ? void 0 : comparison.type) !== _utils.AST_NODE_TYPES.BinaryExpression || comparison.operator !== '===' && comparison.operator !== '!==' || !_utils2.EqualityMatcher.hasOwnProperty((0, _utils2.getAccessorValue)(matcher)) || !(0, _utils2.isBooleanLiteral)(matcherArg)) {
|
|
57
48
|
return;
|
|
58
49
|
}
|
|
59
|
-
|
|
60
50
|
const matcherValue = matcherArg.value;
|
|
61
51
|
const [modifier] = jestFnCall.modifiers;
|
|
62
|
-
const hasNot = jestFnCall.modifiers.some(nod => (0, _utils2.getAccessorValue)(nod) === 'not');
|
|
63
|
-
// value is itself negated by the "not" modifier
|
|
52
|
+
const hasNot = jestFnCall.modifiers.some(nod => (0, _utils2.getAccessorValue)(nod) === 'not');
|
|
64
53
|
|
|
54
|
+
// we need to negate the expectation if the current expected
|
|
55
|
+
// value is itself negated by the "not" modifier
|
|
65
56
|
const addNotModifier = (comparison.operator === '!==' ? !matcherValue : matcherValue) === hasNot;
|
|
66
|
-
|
|
67
57
|
const buildFixer = equalityMatcher => fixer => {
|
|
68
|
-
const sourceCode = context.getSourceCode();
|
|
58
|
+
const sourceCode = context.getSourceCode();
|
|
69
59
|
|
|
60
|
+
// preserve the existing modifier if it's not a negation
|
|
70
61
|
let modifierText = modifier && (0, _utils2.getAccessorValue)(modifier) !== 'not' ? `.${(0, _utils2.getAccessorValue)(modifier)}` : '';
|
|
71
|
-
|
|
72
62
|
if (addNotModifier) {
|
|
73
63
|
modifierText += `.${_utils2.ModifierName.not}`;
|
|
74
64
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
fixer.replaceText(comparison, sourceCode.getText(comparison.left)),
|
|
78
|
-
|
|
65
|
+
return [
|
|
66
|
+
// replace the comparison argument with the left-hand side of the comparison
|
|
67
|
+
fixer.replaceText(comparison, sourceCode.getText(comparison.left)),
|
|
68
|
+
// replace the current matcher & modifier with the preferred matcher
|
|
69
|
+
fixer.replaceTextRange([expectCallEnd, matcher.parent.range[1]], `${modifierText}.${equalityMatcher}`),
|
|
70
|
+
// replace the matcher argument with the right-hand side of the comparison
|
|
79
71
|
fixer.replaceText(matcherArg, sourceCode.getText(comparison.right))];
|
|
80
72
|
};
|
|
81
|
-
|
|
82
73
|
context.report({
|
|
83
74
|
messageId: 'useEqualityMatcher',
|
|
84
75
|
suggest: ['toBe', 'toEqual', 'toStrictEqual'].map(equalityMatcher => ({
|
|
@@ -91,10 +82,7 @@ var _default = (0, _utils2.createRule)({
|
|
|
91
82
|
node: matcher
|
|
92
83
|
});
|
|
93
84
|
}
|
|
94
|
-
|
|
95
85
|
};
|
|
96
86
|
}
|
|
97
|
-
|
|
98
87
|
});
|
|
99
|
-
|
|
100
88
|
exports.default = _default;
|
|
@@ -4,40 +4,31 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("@typescript-eslint/utils");
|
|
9
|
-
|
|
10
8
|
var _utils2 = require("./utils");
|
|
11
|
-
|
|
12
9
|
const isFirstStatement = node => {
|
|
13
10
|
let parent = node;
|
|
14
|
-
|
|
15
11
|
while (parent) {
|
|
16
12
|
var _parent$parent, _parent$parent2;
|
|
17
|
-
|
|
18
13
|
if (((_parent$parent = parent.parent) === null || _parent$parent === void 0 ? void 0 : _parent$parent.type) === _utils.AST_NODE_TYPES.BlockStatement) {
|
|
19
14
|
return parent.parent.body[0] === parent;
|
|
20
|
-
}
|
|
21
|
-
// as its body, as otherwise we would have hit the block statement already
|
|
22
|
-
|
|
15
|
+
}
|
|
23
16
|
|
|
17
|
+
// if we've hit an arrow function, then it must have a single expression
|
|
18
|
+
// as its body, as otherwise we would have hit the block statement already
|
|
24
19
|
if (((_parent$parent2 = parent.parent) === null || _parent$parent2 === void 0 ? void 0 : _parent$parent2.type) === _utils.AST_NODE_TYPES.ArrowFunctionExpression) {
|
|
25
20
|
return true;
|
|
26
21
|
}
|
|
27
|
-
|
|
28
22
|
parent = parent.parent;
|
|
29
23
|
}
|
|
30
|
-
/* istanbul ignore next */
|
|
31
|
-
|
|
32
24
|
|
|
25
|
+
/* istanbul ignore next */
|
|
33
26
|
throw new Error(`Could not find BlockStatement - please file a github issue at https://github.com/jest-community/eslint-plugin-jest`);
|
|
34
27
|
};
|
|
35
|
-
|
|
36
28
|
const suggestRemovingExtraArguments = (args, extraArgsStartAt) => ({
|
|
37
29
|
messageId: 'suggestRemovingExtraArguments',
|
|
38
30
|
fix: fixer => fixer.removeRange([args[extraArgsStartAt].range[0] - Math.sign(extraArgsStartAt), args[args.length - 1].range[1]])
|
|
39
31
|
});
|
|
40
|
-
|
|
41
32
|
var _default = (0, _utils2.createRule)({
|
|
42
33
|
name: __filename,
|
|
43
34
|
meta: {
|
|
@@ -78,7 +69,6 @@ var _default = (0, _utils2.createRule)({
|
|
|
78
69
|
onlyFunctionsWithExpectInLoop: false,
|
|
79
70
|
onlyFunctionsWithExpectInCallback: false
|
|
80
71
|
}],
|
|
81
|
-
|
|
82
72
|
create(context, [options]) {
|
|
83
73
|
let expressionDepth = 0;
|
|
84
74
|
let hasExpectInCallback = false;
|
|
@@ -86,33 +76,27 @@ var _default = (0, _utils2.createRule)({
|
|
|
86
76
|
let hasExpectAssertionsAsFirstStatement = false;
|
|
87
77
|
let inTestCaseCall = false;
|
|
88
78
|
let inForLoop = false;
|
|
89
|
-
|
|
90
79
|
const shouldCheckFunction = testFunction => {
|
|
91
80
|
if (!options.onlyFunctionsWithAsyncKeyword && !options.onlyFunctionsWithExpectInLoop && !options.onlyFunctionsWithExpectInCallback) {
|
|
92
81
|
return true;
|
|
93
82
|
}
|
|
94
|
-
|
|
95
83
|
if (options.onlyFunctionsWithAsyncKeyword) {
|
|
96
84
|
if (testFunction.async) {
|
|
97
85
|
return true;
|
|
98
86
|
}
|
|
99
87
|
}
|
|
100
|
-
|
|
101
88
|
if (options.onlyFunctionsWithExpectInLoop) {
|
|
102
89
|
if (hasExpectInLoop) {
|
|
103
90
|
return true;
|
|
104
91
|
}
|
|
105
92
|
}
|
|
106
|
-
|
|
107
93
|
if (options.onlyFunctionsWithExpectInCallback) {
|
|
108
94
|
if (hasExpectInCallback) {
|
|
109
95
|
return true;
|
|
110
96
|
}
|
|
111
97
|
}
|
|
112
|
-
|
|
113
98
|
return false;
|
|
114
99
|
};
|
|
115
|
-
|
|
116
100
|
const checkExpectHasAssertions = expectFnCall => {
|
|
117
101
|
if ((0, _utils2.getAccessorValue)(expectFnCall.members[0]) === 'hasAssertions') {
|
|
118
102
|
if (expectFnCall.args.length) {
|
|
@@ -122,21 +106,17 @@ var _default = (0, _utils2.createRule)({
|
|
|
122
106
|
suggest: [suggestRemovingExtraArguments(expectFnCall.args, 0)]
|
|
123
107
|
});
|
|
124
108
|
}
|
|
125
|
-
|
|
126
109
|
return;
|
|
127
110
|
}
|
|
128
|
-
|
|
129
111
|
if (expectFnCall.args.length !== 1) {
|
|
130
112
|
let {
|
|
131
113
|
loc
|
|
132
114
|
} = expectFnCall.matcher;
|
|
133
115
|
const suggest = [];
|
|
134
|
-
|
|
135
116
|
if (expectFnCall.args.length) {
|
|
136
117
|
loc = expectFnCall.args[1].loc;
|
|
137
118
|
suggest.push(suggestRemovingExtraArguments(expectFnCall.args, 1));
|
|
138
119
|
}
|
|
139
|
-
|
|
140
120
|
context.report({
|
|
141
121
|
messageId: 'assertionsRequiresOneArgument',
|
|
142
122
|
suggest,
|
|
@@ -144,27 +124,19 @@ var _default = (0, _utils2.createRule)({
|
|
|
144
124
|
});
|
|
145
125
|
return;
|
|
146
126
|
}
|
|
147
|
-
|
|
148
127
|
const [arg] = expectFnCall.args;
|
|
149
|
-
|
|
150
128
|
if (arg.type === _utils.AST_NODE_TYPES.Literal && typeof arg.value === 'number' && Number.isInteger(arg.value)) {
|
|
151
129
|
return;
|
|
152
130
|
}
|
|
153
|
-
|
|
154
131
|
context.report({
|
|
155
132
|
messageId: 'assertionsRequiresNumberArgument',
|
|
156
133
|
node: arg
|
|
157
134
|
});
|
|
158
135
|
};
|
|
159
|
-
|
|
160
136
|
const enterExpression = () => inTestCaseCall && expressionDepth++;
|
|
161
|
-
|
|
162
137
|
const exitExpression = () => inTestCaseCall && expressionDepth--;
|
|
163
|
-
|
|
164
138
|
const enterForLoop = () => inForLoop = true;
|
|
165
|
-
|
|
166
139
|
const exitForLoop = () => inForLoop = false;
|
|
167
|
-
|
|
168
140
|
return {
|
|
169
141
|
FunctionExpression: enterExpression,
|
|
170
142
|
'FunctionExpression:exit': exitExpression,
|
|
@@ -176,64 +148,48 @@ var _default = (0, _utils2.createRule)({
|
|
|
176
148
|
'ForInStatement:exit': exitForLoop,
|
|
177
149
|
ForOfStatement: enterForLoop,
|
|
178
150
|
'ForOfStatement:exit': exitForLoop,
|
|
179
|
-
|
|
180
151
|
CallExpression(node) {
|
|
181
152
|
const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
|
|
182
|
-
|
|
183
153
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'test') {
|
|
184
154
|
inTestCaseCall = true;
|
|
185
155
|
return;
|
|
186
156
|
}
|
|
187
|
-
|
|
188
157
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'expect' && inTestCaseCall) {
|
|
189
158
|
var _jestFnCall$head$node;
|
|
190
|
-
|
|
191
159
|
if (expressionDepth === 1 && isFirstStatement(node) && ((_jestFnCall$head$node = jestFnCall.head.node.parent) === null || _jestFnCall$head$node === void 0 ? void 0 : _jestFnCall$head$node.type) === _utils.AST_NODE_TYPES.MemberExpression && jestFnCall.members.length === 1 && ['assertions', 'hasAssertions'].includes((0, _utils2.getAccessorValue)(jestFnCall.members[0]))) {
|
|
192
160
|
checkExpectHasAssertions(jestFnCall);
|
|
193
161
|
hasExpectAssertionsAsFirstStatement = true;
|
|
194
162
|
}
|
|
195
|
-
|
|
196
163
|
if (inForLoop) {
|
|
197
164
|
hasExpectInLoop = true;
|
|
198
165
|
}
|
|
199
|
-
|
|
200
166
|
if (expressionDepth > 1) {
|
|
201
167
|
hasExpectInCallback = true;
|
|
202
168
|
}
|
|
203
169
|
}
|
|
204
170
|
},
|
|
205
|
-
|
|
206
171
|
'CallExpression:exit'(node) {
|
|
207
172
|
if (!(0, _utils2.isTypeOfJestFnCall)(node, context, ['test'])) {
|
|
208
173
|
return;
|
|
209
174
|
}
|
|
210
|
-
|
|
211
175
|
inTestCaseCall = false;
|
|
212
|
-
|
|
213
176
|
if (node.arguments.length < 2) {
|
|
214
177
|
return;
|
|
215
178
|
}
|
|
216
|
-
|
|
217
179
|
const [, testFn] = node.arguments;
|
|
218
|
-
|
|
219
180
|
if (!(0, _utils2.isFunction)(testFn) || !shouldCheckFunction(testFn)) {
|
|
220
181
|
return;
|
|
221
182
|
}
|
|
222
|
-
|
|
223
183
|
hasExpectInLoop = false;
|
|
224
184
|
hasExpectInCallback = false;
|
|
225
|
-
|
|
226
185
|
if (hasExpectAssertionsAsFirstStatement) {
|
|
227
186
|
hasExpectAssertionsAsFirstStatement = false;
|
|
228
187
|
return;
|
|
229
188
|
}
|
|
230
|
-
|
|
231
189
|
const suggestions = [];
|
|
232
|
-
|
|
233
190
|
if (testFn.body.type === _utils.AST_NODE_TYPES.BlockStatement) {
|
|
234
191
|
suggestions.push(['suggestAddingHasAssertions', 'expect.hasAssertions();'], ['suggestAddingAssertions', 'expect.assertions();']);
|
|
235
192
|
}
|
|
236
|
-
|
|
237
193
|
context.report({
|
|
238
194
|
messageId: 'haveExpectAssertions',
|
|
239
195
|
node,
|
|
@@ -243,10 +199,7 @@ var _default = (0, _utils2.createRule)({
|
|
|
243
199
|
}))
|
|
244
200
|
});
|
|
245
201
|
}
|
|
246
|
-
|
|
247
202
|
};
|
|
248
203
|
}
|
|
249
|
-
|
|
250
204
|
});
|
|
251
|
-
|
|
252
205
|
exports.default = _default;
|
|
@@ -4,11 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("@typescript-eslint/utils");
|
|
9
|
-
|
|
10
8
|
var _utils2 = require("./utils");
|
|
11
|
-
|
|
12
9
|
var _default = (0, _utils2.createRule)({
|
|
13
10
|
name: __filename,
|
|
14
11
|
meta: {
|
|
@@ -28,35 +25,26 @@ var _default = (0, _utils2.createRule)({
|
|
|
28
25
|
create: context => ({
|
|
29
26
|
CallExpression(node) {
|
|
30
27
|
const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
|
|
31
|
-
|
|
32
28
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
|
|
33
29
|
return;
|
|
34
30
|
}
|
|
35
|
-
|
|
36
31
|
const {
|
|
37
32
|
parent
|
|
38
33
|
} = jestFnCall.head.node;
|
|
39
|
-
|
|
40
34
|
if ((parent === null || parent === void 0 ? void 0 : parent.type) !== _utils.AST_NODE_TYPES.CallExpression) {
|
|
41
35
|
return;
|
|
42
36
|
}
|
|
43
|
-
|
|
44
37
|
const [awaitNode] = parent.arguments;
|
|
45
|
-
|
|
46
38
|
if ((awaitNode === null || awaitNode === void 0 ? void 0 : awaitNode.type) === _utils.AST_NODE_TYPES.AwaitExpression) {
|
|
47
39
|
context.report({
|
|
48
40
|
node: awaitNode,
|
|
49
41
|
messageId: 'expectResolves',
|
|
50
|
-
|
|
51
42
|
fix(fixer) {
|
|
52
43
|
return [fixer.insertTextBefore(parent, 'await '), fixer.removeRange([awaitNode.range[0], awaitNode.argument.range[0]]), fixer.insertTextAfter(parent, '.resolves')];
|
|
53
44
|
}
|
|
54
|
-
|
|
55
45
|
});
|
|
56
46
|
}
|
|
57
47
|
}
|
|
58
|
-
|
|
59
48
|
})
|
|
60
49
|
});
|
|
61
|
-
|
|
62
50
|
exports.default = _default;
|
|
@@ -4,11 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("./utils");
|
|
9
|
-
|
|
10
8
|
const HooksOrder = ['beforeAll', 'beforeEach', 'afterEach', 'afterAll'];
|
|
11
|
-
|
|
12
9
|
var _default = (0, _utils.createRule)({
|
|
13
10
|
name: __filename,
|
|
14
11
|
meta: {
|
|
@@ -24,7 +21,6 @@ var _default = (0, _utils.createRule)({
|
|
|
24
21
|
type: 'suggestion'
|
|
25
22
|
},
|
|
26
23
|
defaultOptions: [],
|
|
27
|
-
|
|
28
24
|
create(context) {
|
|
29
25
|
let previousHookIndex = -1;
|
|
30
26
|
let inHook = false;
|
|
@@ -34,19 +30,15 @@ var _default = (0, _utils.createRule)({
|
|
|
34
30
|
// Ignore everything that is passed into a hook
|
|
35
31
|
return;
|
|
36
32
|
}
|
|
37
|
-
|
|
38
33
|
const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
|
|
39
|
-
|
|
40
34
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'hook') {
|
|
41
35
|
// Reset the previousHookIndex when encountering something different from a hook
|
|
42
36
|
previousHookIndex = -1;
|
|
43
37
|
return;
|
|
44
38
|
}
|
|
45
|
-
|
|
46
39
|
inHook = true;
|
|
47
40
|
const currentHook = jestFnCall.name;
|
|
48
41
|
const currentHookIndex = HooksOrder.indexOf(currentHook);
|
|
49
|
-
|
|
50
42
|
if (currentHookIndex < previousHookIndex) {
|
|
51
43
|
context.report({
|
|
52
44
|
messageId: 'reorderHooks',
|
|
@@ -58,27 +50,21 @@ var _default = (0, _utils.createRule)({
|
|
|
58
50
|
});
|
|
59
51
|
return;
|
|
60
52
|
}
|
|
61
|
-
|
|
62
53
|
previousHookIndex = currentHookIndex;
|
|
63
54
|
},
|
|
64
|
-
|
|
65
55
|
'CallExpression:exit'(node) {
|
|
66
56
|
if ((0, _utils.isTypeOfJestFnCall)(node, context, ['hook'])) {
|
|
67
57
|
inHook = false;
|
|
68
58
|
return;
|
|
69
59
|
}
|
|
70
|
-
|
|
71
60
|
if (inHook) {
|
|
72
61
|
return;
|
|
73
|
-
}
|
|
74
|
-
|
|
62
|
+
}
|
|
75
63
|
|
|
64
|
+
// Reset the previousHookIndex when encountering something different from a hook
|
|
76
65
|
previousHookIndex = -1;
|
|
77
66
|
}
|
|
78
|
-
|
|
79
67
|
};
|
|
80
68
|
}
|
|
81
|
-
|
|
82
69
|
});
|
|
83
|
-
|
|
84
70
|
exports.default = _default;
|
|
@@ -4,9 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("./utils");
|
|
9
|
-
|
|
10
8
|
var _default = (0, _utils.createRule)({
|
|
11
9
|
name: __filename,
|
|
12
10
|
meta: {
|
|
@@ -22,7 +20,6 @@ var _default = (0, _utils.createRule)({
|
|
|
22
20
|
type: 'suggestion'
|
|
23
21
|
},
|
|
24
22
|
defaultOptions: [],
|
|
25
|
-
|
|
26
23
|
create(context) {
|
|
27
24
|
const hooksContext = [false];
|
|
28
25
|
return {
|
|
@@ -30,24 +27,18 @@ var _default = (0, _utils.createRule)({
|
|
|
30
27
|
if ((0, _utils.isTypeOfJestFnCall)(node, context, ['test'])) {
|
|
31
28
|
hooksContext[hooksContext.length - 1] = true;
|
|
32
29
|
}
|
|
33
|
-
|
|
34
30
|
if (hooksContext[hooksContext.length - 1] && (0, _utils.isTypeOfJestFnCall)(node, context, ['hook'])) {
|
|
35
31
|
context.report({
|
|
36
32
|
messageId: 'noHookOnTop',
|
|
37
33
|
node
|
|
38
34
|
});
|
|
39
35
|
}
|
|
40
|
-
|
|
41
36
|
hooksContext.push(false);
|
|
42
37
|
},
|
|
43
|
-
|
|
44
38
|
'CallExpression:exit'() {
|
|
45
39
|
hooksContext.pop();
|
|
46
40
|
}
|
|
47
|
-
|
|
48
41
|
};
|
|
49
42
|
}
|
|
50
|
-
|
|
51
43
|
});
|
|
52
|
-
|
|
53
44
|
exports.default = _default;
|
|
@@ -4,29 +4,21 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("./utils");
|
|
9
|
-
|
|
10
8
|
const hasStringAsFirstArgument = node => node.arguments[0] && (0, _utils.isStringNode)(node.arguments[0]);
|
|
11
|
-
|
|
12
9
|
const populateIgnores = ignore => {
|
|
13
10
|
const ignores = [];
|
|
14
|
-
|
|
15
11
|
if (ignore.includes(_utils.DescribeAlias.describe)) {
|
|
16
12
|
ignores.push(...Object.keys(_utils.DescribeAlias));
|
|
17
13
|
}
|
|
18
|
-
|
|
19
14
|
if (ignore.includes(_utils.TestCaseName.test)) {
|
|
20
15
|
ignores.push(...Object.keys(_utils.TestCaseName).filter(k => k.endsWith(_utils.TestCaseName.test)));
|
|
21
16
|
}
|
|
22
|
-
|
|
23
17
|
if (ignore.includes(_utils.TestCaseName.it)) {
|
|
24
18
|
ignores.push(...Object.keys(_utils.TestCaseName).filter(k => k.endsWith(_utils.TestCaseName.it)));
|
|
25
19
|
}
|
|
26
|
-
|
|
27
20
|
return ignores;
|
|
28
21
|
};
|
|
29
|
-
|
|
30
22
|
var _default = (0, _utils.createRule)({
|
|
31
23
|
name: __filename,
|
|
32
24
|
meta: {
|
|
@@ -70,7 +62,6 @@ var _default = (0, _utils.createRule)({
|
|
|
70
62
|
allowedPrefixes: [],
|
|
71
63
|
ignoreTopLevelDescribe: false
|
|
72
64
|
}],
|
|
73
|
-
|
|
74
65
|
create(context, [{
|
|
75
66
|
ignore = [],
|
|
76
67
|
allowedPrefixes = [],
|
|
@@ -81,60 +72,46 @@ var _default = (0, _utils.createRule)({
|
|
|
81
72
|
return {
|
|
82
73
|
CallExpression(node) {
|
|
83
74
|
const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
|
|
84
|
-
|
|
85
75
|
if (!jestFnCall || !hasStringAsFirstArgument(node)) {
|
|
86
76
|
return;
|
|
87
77
|
}
|
|
88
|
-
|
|
89
78
|
if (jestFnCall.type === 'describe') {
|
|
90
79
|
numberOfDescribeBlocks++;
|
|
91
|
-
|
|
92
80
|
if (ignoreTopLevelDescribe && numberOfDescribeBlocks === 1) {
|
|
93
81
|
return;
|
|
94
82
|
}
|
|
95
83
|
} else if (jestFnCall.type !== 'test') {
|
|
96
84
|
return;
|
|
97
85
|
}
|
|
98
|
-
|
|
99
86
|
const [firstArg] = node.arguments;
|
|
100
87
|
const description = (0, _utils.getStringValue)(firstArg);
|
|
101
|
-
|
|
102
88
|
if (allowedPrefixes.some(name => description.startsWith(name))) {
|
|
103
89
|
return;
|
|
104
90
|
}
|
|
105
|
-
|
|
106
91
|
const firstCharacter = description.charAt(0);
|
|
107
|
-
|
|
108
92
|
if (!firstCharacter || firstCharacter === firstCharacter.toLowerCase() || ignores.includes(jestFnCall.name)) {
|
|
109
93
|
return;
|
|
110
94
|
}
|
|
111
|
-
|
|
112
95
|
context.report({
|
|
113
96
|
messageId: 'unexpectedLowercase',
|
|
114
97
|
node: node.arguments[0],
|
|
115
98
|
data: {
|
|
116
99
|
method: jestFnCall.name
|
|
117
100
|
},
|
|
118
|
-
|
|
119
101
|
fix(fixer) {
|
|
120
102
|
const description = (0, _utils.getStringValue)(firstArg);
|
|
121
103
|
const rangeIgnoringQuotes = [firstArg.range[0] + 1, firstArg.range[1] - 1];
|
|
122
104
|
const newDescription = description.substring(0, 1).toLowerCase() + description.substring(1);
|
|
123
105
|
return [fixer.replaceTextRange(rangeIgnoringQuotes, newDescription)];
|
|
124
106
|
}
|
|
125
|
-
|
|
126
107
|
});
|
|
127
108
|
},
|
|
128
|
-
|
|
129
109
|
'CallExpression:exit'(node) {
|
|
130
110
|
if ((0, _utils.isTypeOfJestFnCall)(node, context, ['describe'])) {
|
|
131
111
|
numberOfDescribeBlocks--;
|
|
132
112
|
}
|
|
133
113
|
}
|
|
134
|
-
|
|
135
114
|
};
|
|
136
115
|
}
|
|
137
|
-
|
|
138
116
|
});
|
|
139
|
-
|
|
140
117
|
exports.default = _default;
|