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
package/README.md
CHANGED
|
@@ -104,46 +104,47 @@ installations requiring long-term consistency.
|
|
|
104
104
|
|
|
105
105
|
## Rules
|
|
106
106
|
|
|
107
|
-
| Rule
|
|
108
|
-
|
|
|
109
|
-
| [consistent-test-it][]
|
|
110
|
-
| [expect-expect][]
|
|
111
|
-
| [lowercase-name][]
|
|
112
|
-
| [no-alias-methods][]
|
|
113
|
-
| [no-commented-out-tests][]
|
|
114
|
-
| [no-disabled-tests][]
|
|
115
|
-
| [no-duplicate-hooks][]
|
|
116
|
-
| [no-empty-title][]
|
|
117
|
-
| [no-expect-resolves][]
|
|
118
|
-
| [no-export][]
|
|
119
|
-
| [no-focused-tests][]
|
|
120
|
-
| [no-hooks][]
|
|
121
|
-
| [no-identical-title][]
|
|
122
|
-
| [no-if][]
|
|
123
|
-
| [no-jasmine-globals][]
|
|
124
|
-
| [no-jest-import][]
|
|
125
|
-
| [no-large-snapshots][]
|
|
126
|
-
| [no-mocks-import][]
|
|
127
|
-
| [no-standalone-expect][]
|
|
128
|
-
| [no-test-callback][]
|
|
129
|
-
| [no-test-prefixes][]
|
|
130
|
-
| [no-test-return-statement][]
|
|
131
|
-
| [no-truthy-falsy][]
|
|
132
|
-
| [no-try-expect][]
|
|
133
|
-
| [prefer-called-with][]
|
|
134
|
-
| [prefer-expect-assertions][]
|
|
135
|
-
| [prefer-inline-snapshots][]
|
|
136
|
-
| [prefer-spy-on][]
|
|
137
|
-
| [prefer-strict-equal][]
|
|
138
|
-
| [prefer-to-be-null][]
|
|
139
|
-
| [prefer-to-be-undefined][]
|
|
140
|
-
| [prefer-to-contain][]
|
|
141
|
-
| [prefer-to-have-length][]
|
|
142
|
-
| [prefer-todo][]
|
|
143
|
-
| [require-
|
|
144
|
-
| [
|
|
145
|
-
| [valid-
|
|
146
|
-
| [valid-expect][]
|
|
107
|
+
| Rule | Description | Recommended | Fixable |
|
|
108
|
+
| ------------------------------ | ----------------------------------------------------------------- | ---------------- | ------------------- |
|
|
109
|
+
| [consistent-test-it][] | Enforce consistent test or it keyword | | ![fixable-green][] |
|
|
110
|
+
| [expect-expect][] | Enforce assertion to be made in a test body | | |
|
|
111
|
+
| [lowercase-name][] | Disallow capitalized test names | | ![fixable-green][] |
|
|
112
|
+
| [no-alias-methods][] | Disallow alias methods | ![recommended][] | ![fixable-green][] |
|
|
113
|
+
| [no-commented-out-tests][] | Disallow commented out tests | | |
|
|
114
|
+
| [no-disabled-tests][] | Disallow disabled tests | ![recommended][] | |
|
|
115
|
+
| [no-duplicate-hooks][] | Disallow duplicate hooks within a `describe` block | | |
|
|
116
|
+
| [no-empty-title][] | Disallow empty titles | | |
|
|
117
|
+
| [no-expect-resolves][] | Disallow using `expect().resolves` | | |
|
|
118
|
+
| [no-export][] | Disallow export from test files | | |
|
|
119
|
+
| [no-focused-tests][] | Disallow focused tests | ![recommended][] | |
|
|
120
|
+
| [no-hooks][] | Disallow setup and teardown hooks | | |
|
|
121
|
+
| [no-identical-title][] | Disallow identical titles | ![recommended][] | |
|
|
122
|
+
| [no-if][] | Disallow conditional logic | | |
|
|
123
|
+
| [no-jasmine-globals][] | Disallow Jasmine globals | ![recommended][] | ![fixable-yellow][] |
|
|
124
|
+
| [no-jest-import][] | Disallow importing `jest` | ![recommended][] | |
|
|
125
|
+
| [no-large-snapshots][] | Disallow large snapshots | | |
|
|
126
|
+
| [no-mocks-import][] | Disallow manually importing from `__mocks__` | | |
|
|
127
|
+
| [no-standalone-expect][] | Prevents `expect` statements outside of a `test` or `it` block | | |
|
|
128
|
+
| [no-test-callback][] | Using a callback in asynchronous tests | | ![fixable-green][] |
|
|
129
|
+
| [no-test-prefixes][] | Disallow using `f` & `x` prefixes to define focused/skipped tests | ![recommended][] | ![fixable-green][] |
|
|
130
|
+
| [no-test-return-statement][] | Disallow explicitly returning from tests | | |
|
|
131
|
+
| [no-truthy-falsy][] | Disallow using `toBeTruthy()` & `toBeFalsy()` | | |
|
|
132
|
+
| [no-try-expect][] | Prevent `catch` assertions in tests | | |
|
|
133
|
+
| [prefer-called-with][] | Suggest using `toBeCalledWith()` OR `toHaveBeenCalledWith()` | | |
|
|
134
|
+
| [prefer-expect-assertions][] | Suggest using `expect.assertions()` OR `expect.hasAssertions()` | | |
|
|
135
|
+
| [prefer-inline-snapshots][] | Suggest using `toMatchInlineSnapshot()` | | ![fixable-green][] |
|
|
136
|
+
| [prefer-spy-on][] | Suggest using `jest.spyOn()` | | ![fixable-green][] |
|
|
137
|
+
| [prefer-strict-equal][] | Suggest using `toStrictEqual()` | | ![fixable-green][] |
|
|
138
|
+
| [prefer-to-be-null][] | Suggest using `toBeNull()` | | ![fixable-green][] |
|
|
139
|
+
| [prefer-to-be-undefined][] | Suggest using `toBeUndefined()` | | ![fixable-green][] |
|
|
140
|
+
| [prefer-to-contain][] | Suggest using `toContain()` | | ![fixable-green][] |
|
|
141
|
+
| [prefer-to-have-length][] | Suggest using `toHaveLength()` | | ![fixable-green][] |
|
|
142
|
+
| [prefer-todo][] | Suggest using `test.todo()` | | ![fixable-green][] |
|
|
143
|
+
| [require-top-level-describe][] | Require a top-level `describe` block | | |
|
|
144
|
+
| [require-tothrow-message][] | Require that `toThrow()` and `toThrowError` includes a message | | |
|
|
145
|
+
| [valid-describe][] | Enforce valid `describe()` callback | ![recommended][] | |
|
|
146
|
+
| [valid-expect-in-promise][] | Enforce having return statement when testing with promises | ![recommended][] | |
|
|
147
|
+
| [valid-expect][] | Enforce valid `expect()` usage | ![recommended][] | |
|
|
147
148
|
|
|
148
149
|
## Credit
|
|
149
150
|
|
|
@@ -193,6 +194,7 @@ https://github.com/dangreenisrael/eslint-plugin-jest-formatting
|
|
|
193
194
|
[prefer-to-contain]: docs/rules/prefer-to-contain.md
|
|
194
195
|
[prefer-to-have-length]: docs/rules/prefer-to-have-length.md
|
|
195
196
|
[prefer-todo]: docs/rules/prefer-todo.md
|
|
197
|
+
[require-top-level-describe]: docs/rules/require-top-level-describe.md
|
|
196
198
|
[require-tothrow-message]: docs/rules/require-tothrow-message.md
|
|
197
199
|
[valid-describe]: docs/rules/valid-describe.md
|
|
198
200
|
[valid-expect-in-promise]: docs/rules/valid-expect-in-promise.md
|
|
@@ -5,7 +5,8 @@ asserting expections on null value.
|
|
|
5
5
|
|
|
6
6
|
## Rule details
|
|
7
7
|
|
|
8
|
-
This rule triggers a warning if `toBe()`
|
|
8
|
+
This rule triggers a warning if `toBe()`, `isEqual()` or `toStrictEqual()` is
|
|
9
|
+
used to assert a null value.
|
|
9
10
|
|
|
10
11
|
```js
|
|
11
12
|
expect(null).toBe(null);
|
|
@@ -15,10 +16,14 @@ This rule is enabled by default.
|
|
|
15
16
|
|
|
16
17
|
### Default configuration
|
|
17
18
|
|
|
18
|
-
The following
|
|
19
|
+
The following patterns are considered warnings:
|
|
19
20
|
|
|
20
21
|
```js
|
|
21
22
|
expect(null).toBe(null);
|
|
23
|
+
|
|
24
|
+
expect(null).isEqual(null);
|
|
25
|
+
|
|
26
|
+
expect(null).toStrictEqual(null);
|
|
22
27
|
```
|
|
23
28
|
|
|
24
29
|
The following pattern is not warning:
|
|
@@ -5,7 +5,8 @@ asserting expections on undefined value.
|
|
|
5
5
|
|
|
6
6
|
## Rule details
|
|
7
7
|
|
|
8
|
-
This rule triggers a warning if `toBe()`
|
|
8
|
+
This rule triggers a warning if `toBe()`, `isEqual()` or `toStrictEqual()` is
|
|
9
|
+
used to assert an undefined value.
|
|
9
10
|
|
|
10
11
|
```js
|
|
11
12
|
expect(undefined).toBe(undefined);
|
|
@@ -15,10 +16,14 @@ This rule is enabled by default.
|
|
|
15
16
|
|
|
16
17
|
### Default configuration
|
|
17
18
|
|
|
18
|
-
The following
|
|
19
|
+
The following patterns are considered warnings:
|
|
19
20
|
|
|
20
21
|
```js
|
|
21
22
|
expect(undefined).toBe(undefined);
|
|
23
|
+
|
|
24
|
+
expect(undefined).isEqual(undefined);
|
|
25
|
+
|
|
26
|
+
expect(undefined).toStrictEqual(undefined);
|
|
22
27
|
```
|
|
23
28
|
|
|
24
29
|
The following pattern is not warning:
|
|
@@ -5,8 +5,8 @@ asserting expectations on an array containing an object.
|
|
|
5
5
|
|
|
6
6
|
## Rule details
|
|
7
7
|
|
|
8
|
-
This rule triggers a warning if `toBe()` or `
|
|
9
|
-
inclusion in an array
|
|
8
|
+
This rule triggers a warning if `toBe()`, `isEqual()` or `toStrictEqual()` is
|
|
9
|
+
used to assert object inclusion in an array
|
|
10
10
|
|
|
11
11
|
```js
|
|
12
12
|
expect(a.includes(b)).toBe(true);
|
|
@@ -22,26 +22,24 @@ expect(a.includes(b)).toBe(false);
|
|
|
22
22
|
|
|
23
23
|
### Default configuration
|
|
24
24
|
|
|
25
|
-
The following patterns are considered
|
|
25
|
+
The following patterns are considered warnings:
|
|
26
26
|
|
|
27
27
|
```js
|
|
28
28
|
expect(a.includes(b)).toBe(true);
|
|
29
|
-
```
|
|
30
29
|
|
|
31
|
-
```js
|
|
32
30
|
expect(a.includes(b)).not.toBe(true);
|
|
33
|
-
```
|
|
34
31
|
|
|
35
|
-
```js
|
|
36
32
|
expect(a.includes(b)).toBe(false);
|
|
33
|
+
|
|
34
|
+
expect(a.includes(b)).toEqual(true);
|
|
35
|
+
|
|
36
|
+
expect(a.includes(b)).toStrictEqual(true);
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
The following patterns are not
|
|
39
|
+
The following patterns are not considered warnings:
|
|
40
40
|
|
|
41
41
|
```js
|
|
42
42
|
expect(a).toContain(b);
|
|
43
|
-
```
|
|
44
43
|
|
|
45
|
-
```js
|
|
46
44
|
expect(a).not.toContain(b);
|
|
47
45
|
```
|
|
@@ -5,8 +5,8 @@ asserting expectations on object's length property.
|
|
|
5
5
|
|
|
6
6
|
## Rule details
|
|
7
7
|
|
|
8
|
-
This rule triggers a warning if `toBe()`
|
|
9
|
-
property.
|
|
8
|
+
This rule triggers a warning if `toBe()`, `isEqual()` or `toStrictEqual()` is
|
|
9
|
+
used to assert object's length property.
|
|
10
10
|
|
|
11
11
|
```js
|
|
12
12
|
expect(files.length).toBe(1);
|
|
@@ -16,10 +16,14 @@ This rule is enabled by default.
|
|
|
16
16
|
|
|
17
17
|
### Default configuration
|
|
18
18
|
|
|
19
|
-
The following
|
|
19
|
+
The following patterns are considered warnings:
|
|
20
20
|
|
|
21
21
|
```js
|
|
22
22
|
expect(files.length).toBe(1);
|
|
23
|
+
|
|
24
|
+
expect(files.length).toEqual(1);
|
|
25
|
+
|
|
26
|
+
expect(files.length).toStrictEqual(1);
|
|
23
27
|
```
|
|
24
28
|
|
|
25
29
|
The following pattern is not warning:
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Require top-level describe block (require-top-level-describe)
|
|
2
|
+
|
|
3
|
+
Jest allows you to organise your test files the way you want it. However, the
|
|
4
|
+
more your codebase grows, the more it becomes hard to navigate in your test
|
|
5
|
+
files. This rule makes sure that you provide at least a top-level describe block
|
|
6
|
+
in your test file.
|
|
7
|
+
|
|
8
|
+
## Rule Details
|
|
9
|
+
|
|
10
|
+
This rule triggers a warning if a test case (`test` and `it`) or a hook
|
|
11
|
+
(`beforeAll`, `beforeEach`, `afterEach`, `afterAll`) is not located in a
|
|
12
|
+
top-level describe block.
|
|
13
|
+
|
|
14
|
+
The following patterns are considered warnings:
|
|
15
|
+
|
|
16
|
+
```js
|
|
17
|
+
// Above a describe block
|
|
18
|
+
test('my test', () => {});
|
|
19
|
+
describe('test suite', () => {
|
|
20
|
+
it('test', () => {});
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Below a describe block
|
|
24
|
+
describe('test suite', () => {});
|
|
25
|
+
test('my test', () => {});
|
|
26
|
+
|
|
27
|
+
// Same for hooks
|
|
28
|
+
beforeAll('my beforeAll', () => {});
|
|
29
|
+
describe('test suite', () => {});
|
|
30
|
+
afterEach('my afterEach', () => {});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The following patterns are **not** considered warnings:
|
|
34
|
+
|
|
35
|
+
```js
|
|
36
|
+
// In a describe block
|
|
37
|
+
describe('test suite', () => {
|
|
38
|
+
test('my test', () => {});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// In a nested describe block
|
|
42
|
+
describe('test suite', () => {
|
|
43
|
+
test('my test', () => {});
|
|
44
|
+
describe('another test suite', () => {
|
|
45
|
+
test('my other test', () => {});
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## When Not To Use It
|
|
51
|
+
|
|
52
|
+
Don't use this rule on non-jest test files.
|
|
@@ -4,11 +4,12 @@ var _fs = require("fs");
|
|
|
4
4
|
|
|
5
5
|
var _path = require("path");
|
|
6
6
|
|
|
7
|
-
var _ = require("../");
|
|
7
|
+
var _ = _interopRequireDefault(require("../"));
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
|
|
11
|
+
const ruleNames = Object.keys(_.default.rules);
|
|
12
|
+
const numberOfRules = 39;
|
|
12
13
|
describe('rules', () => {
|
|
13
14
|
it('should have a corresponding doc for each rule', () => {
|
|
14
15
|
ruleNames.forEach(rule => {
|
package/lib/index.js
CHANGED
|
@@ -29,14 +29,13 @@ const importDefault = moduleName => // eslint-disable-next-line @typescript-esli
|
|
|
29
29
|
interopRequireDefault(require(moduleName)).default;
|
|
30
30
|
|
|
31
31
|
const rulesDir = (0, _path.join)(__dirname, 'rules');
|
|
32
|
-
const excludedFiles = ['__tests__', '
|
|
32
|
+
const excludedFiles = ['__tests__', 'utils'];
|
|
33
33
|
const rules = (0, _fs.readdirSync)(rulesDir).map(rule => (0, _path.parse)(rule).name).filter(rule => !excludedFiles.includes(rule)).reduce((acc, curr) => Object.assign(acc, {
|
|
34
34
|
[curr]: importDefault((0, _path.join)(rulesDir, curr))
|
|
35
35
|
}), {});
|
|
36
36
|
const allRules = Object.keys(rules).reduce((rules, key) => _objectSpread({}, rules, {
|
|
37
37
|
[`jest/${key}`]: 'error'
|
|
38
|
-
}), {});
|
|
39
|
-
|
|
38
|
+
}), {});
|
|
40
39
|
module.exports = {
|
|
41
40
|
configs: {
|
|
42
41
|
all: {
|
|
@@ -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: {
|
|
@@ -48,17 +48,17 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
48
48
|
let describeNestingLevel = 0;
|
|
49
49
|
return {
|
|
50
50
|
CallExpression(node) {
|
|
51
|
-
const nodeName = (0,
|
|
51
|
+
const nodeName = (0, _utils.getNodeName)(node.callee);
|
|
52
52
|
|
|
53
53
|
if (!nodeName) {
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
if ((0,
|
|
57
|
+
if ((0, _utils.isDescribe)(node)) {
|
|
58
58
|
describeNestingLevel++;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
if ((0,
|
|
61
|
+
if ((0, _utils.isTestCase)(node) && describeNestingLevel === 0 && !nodeName.includes(testKeyword)) {
|
|
62
62
|
const oppositeTestKeyword = getOppositeTestKeyword(testKeyword);
|
|
63
63
|
context.report({
|
|
64
64
|
messageId: 'consistentMethod',
|
|
@@ -77,7 +77,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
if ((0,
|
|
80
|
+
if ((0, _utils.isTestCase)(node) && describeNestingLevel > 0 && !nodeName.includes(testKeywordWithinDescribe)) {
|
|
81
81
|
const oppositeTestKeyword = getOppositeTestKeyword(testKeywordWithinDescribe);
|
|
82
82
|
context.report({
|
|
83
83
|
messageId: 'consistentMethodWithingDescribe',
|
|
@@ -98,7 +98,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
98
98
|
},
|
|
99
99
|
|
|
100
100
|
'CallExpression:exit'(node) {
|
|
101
|
-
if ((0,
|
|
101
|
+
if ((0, _utils.isDescribe)(node)) {
|
|
102
102
|
describeNestingLevel--;
|
|
103
103
|
}
|
|
104
104
|
}
|
|
@@ -7,13 +7,13 @@ 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
|
/*
|
|
13
13
|
* This implementation is adapted from eslint-plugin-jasmine.
|
|
14
14
|
* MIT license, Remco Haszing.
|
|
15
15
|
*/
|
|
16
|
-
var _default = (0,
|
|
16
|
+
var _default = (0, _utils.createRule)({
|
|
17
17
|
name: __filename,
|
|
18
18
|
meta: {
|
|
19
19
|
docs: {
|
|
@@ -48,7 +48,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
48
48
|
const unchecked = [];
|
|
49
49
|
return {
|
|
50
50
|
CallExpression(node) {
|
|
51
|
-
const name = (0,
|
|
51
|
+
const name = (0, _utils.getNodeName)(node.callee);
|
|
52
52
|
|
|
53
53
|
if (name === 'it' || name === 'test') {
|
|
54
54
|
unchecked.push(node);
|
|
@@ -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
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
|
|
13
13
|
|
|
@@ -19,7 +19,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
19
19
|
|
|
20
20
|
const hasStringAsFirstArgument = node => node.arguments && node.arguments[0] && (node.arguments[0].type === _experimentalUtils.AST_NODE_TYPES.Literal || node.arguments[0].type === _experimentalUtils.AST_NODE_TYPES.TemplateLiteral);
|
|
21
21
|
|
|
22
|
-
const isJestFunctionWithLiteralArg = node => ((0,
|
|
22
|
+
const isJestFunctionWithLiteralArg = node => ((0, _utils.isTestCase)(node) || (0, _utils.isDescribe)(node)) && node.callee.type === _experimentalUtils.AST_NODE_TYPES.Identifier && hasStringAsFirstArgument(node);
|
|
23
23
|
|
|
24
24
|
const testDescription = argument => {
|
|
25
25
|
if (argument.type === _experimentalUtils.AST_NODE_TYPES.Literal) {
|
|
@@ -55,7 +55,7 @@ const jestFunctionName = node => {
|
|
|
55
55
|
return null;
|
|
56
56
|
};
|
|
57
57
|
|
|
58
|
-
var _default = (0,
|
|
58
|
+
var _default = (0, _utils.createRule)({
|
|
59
59
|
name: __filename,
|
|
60
60
|
meta: {
|
|
61
61
|
type: 'suggestion',
|
|
@@ -5,42 +5,45 @@ 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 = {
|
|
10
|
+
var _default = (0, _utils.createRule)({
|
|
11
|
+
name: __filename,
|
|
11
12
|
meta: {
|
|
12
13
|
docs: {
|
|
13
|
-
|
|
14
|
+
category: 'Best Practices',
|
|
15
|
+
description: 'Disallow alias methods',
|
|
16
|
+
recommended: 'warn'
|
|
14
17
|
},
|
|
15
18
|
messages: {
|
|
16
19
|
replaceAlias: `Replace {{ replace }}() with its canonical name of {{ canonical }}()`
|
|
17
20
|
},
|
|
18
21
|
fixable: 'code',
|
|
22
|
+
type: 'suggestion',
|
|
19
23
|
schema: []
|
|
20
24
|
},
|
|
25
|
+
defaultOptions: [],
|
|
21
26
|
|
|
22
27
|
create(context) {
|
|
23
28
|
// The Jest methods which have aliases. The canonical name is the first
|
|
24
29
|
// index of each item.
|
|
30
|
+
// todo: replace w/ Map
|
|
25
31
|
const methodNames = [['toHaveBeenCalled', 'toBeCalled'], ['toHaveBeenCalledTimes', 'toBeCalledTimes'], ['toHaveBeenCalledWith', 'toBeCalledWith'], ['toHaveBeenLastCalledWith', 'lastCalledWith'], ['toHaveBeenNthCalledWith', 'nthCalledWith'], ['toHaveReturned', 'toReturn'], ['toHaveReturnedTimes', 'toReturnTimes'], ['toHaveReturnedWith', 'toReturnWith'], ['toHaveLastReturnedWith', 'lastReturnedWith'], ['toHaveNthReturnedWith', 'nthReturnedWith'], ['toThrow', 'toThrowError']];
|
|
26
32
|
return {
|
|
27
33
|
CallExpression(node) {
|
|
28
|
-
if (!(0,
|
|
34
|
+
if (!(0, _utils.isExpectCall)(node)) {
|
|
29
35
|
return;
|
|
30
36
|
}
|
|
31
37
|
|
|
32
|
-
|
|
38
|
+
const _parseExpectCall = (0, _utils.parseExpectCall)(node),
|
|
39
|
+
matcher = _parseExpectCall.matcher;
|
|
33
40
|
|
|
34
|
-
if (
|
|
35
|
-
targetNode = (0, _util.method)(node.parent);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (!targetNode) {
|
|
41
|
+
if (!matcher) {
|
|
39
42
|
return;
|
|
40
43
|
} // Check if the method used matches any of ours
|
|
41
44
|
|
|
42
45
|
|
|
43
|
-
const methodItem = methodNames.find(item => item[1] ===
|
|
46
|
+
const methodItem = methodNames.find(item => item[1] === matcher.name);
|
|
44
47
|
|
|
45
48
|
if (methodItem) {
|
|
46
49
|
context.report({
|
|
@@ -49,8 +52,8 @@ var _default = {
|
|
|
49
52
|
replace: methodItem[1],
|
|
50
53
|
canonical: methodItem[0]
|
|
51
54
|
},
|
|
52
|
-
node:
|
|
53
|
-
fix: fixer => [fixer.replaceText(
|
|
55
|
+
node: matcher.node.property,
|
|
56
|
+
fix: fixer => [fixer.replaceText(matcher.node.property, methodItem[0])]
|
|
54
57
|
});
|
|
55
58
|
}
|
|
56
59
|
}
|
|
@@ -58,5 +61,6 @@ var _default = {
|
|
|
58
61
|
};
|
|
59
62
|
}
|
|
60
63
|
|
|
61
|
-
};
|
|
64
|
+
});
|
|
65
|
+
|
|
62
66
|
exports.default = _default;
|
|
@@ -5,13 +5,13 @@ 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 hasTests(node) {
|
|
11
11
|
return /^\s*(x|f)?(test|it|describe)(\.\w+|\[['"]\w+['"]\])?\s*\(/m.test(node.value);
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
var _default = (0,
|
|
14
|
+
var _default = (0, _utils.createRule)({
|
|
15
15
|
name: __filename,
|
|
16
16
|
meta: {
|
|
17
17
|
docs: {
|
|
@@ -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: {
|
|
@@ -50,7 +50,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
50
50
|
},
|
|
51
51
|
|
|
52
52
|
CallExpression(node) {
|
|
53
|
-
const functionName = (0,
|
|
53
|
+
const functionName = (0, _utils.getNodeName)(node.callee);
|
|
54
54
|
|
|
55
55
|
switch (functionName) {
|
|
56
56
|
case 'describe.skip':
|
|
@@ -71,7 +71,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
71
71
|
},
|
|
72
72
|
|
|
73
73
|
'CallExpression[callee.name="pending"]'(node) {
|
|
74
|
-
if ((0,
|
|
74
|
+
if ((0, _utils.scopeHasLocalReference)(context.getScope(), 'pending')) {
|
|
75
75
|
return;
|
|
76
76
|
}
|
|
77
77
|
|
|
@@ -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
|
const newHookContext = () => ({
|
|
11
11
|
beforeAll: 0,
|
|
@@ -14,7 +14,7 @@ const newHookContext = () => ({
|
|
|
14
14
|
afterEach: 0
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
var _default = (0,
|
|
17
|
+
var _default = (0, _utils.createRule)({
|
|
18
18
|
name: __filename,
|
|
19
19
|
meta: {
|
|
20
20
|
docs: {
|
|
@@ -34,11 +34,11 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
34
34
|
const hookContexts = [newHookContext()];
|
|
35
35
|
return {
|
|
36
36
|
CallExpression(node) {
|
|
37
|
-
if ((0,
|
|
37
|
+
if ((0, _utils.isDescribe)(node)) {
|
|
38
38
|
hookContexts.push(newHookContext());
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
if ((0,
|
|
41
|
+
if ((0, _utils.isHook)(node)) {
|
|
42
42
|
const currentLayer = hookContexts[hookContexts.length - 1];
|
|
43
43
|
currentLayer[node.callee.name] += 1;
|
|
44
44
|
|
|
@@ -55,7 +55,7 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
55
55
|
},
|
|
56
56
|
|
|
57
57
|
'CallExpression:exit'(node) {
|
|
58
|
-
if ((0,
|
|
58
|
+
if ((0, _utils.isDescribe)(node)) {
|
|
59
59
|
hookContexts.pop();
|
|
60
60
|
}
|
|
61
61
|
}
|
|
@@ -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,27 +35,21 @@ var _default = (0, _tsUtils.createRule)({
|
|
|
35
35
|
create(context) {
|
|
36
36
|
return {
|
|
37
37
|
CallExpression(node) {
|
|
38
|
-
if (!(0,
|
|
38
|
+
if (!(0, _utils.isDescribe)(node) && !(0, _utils.isTestCase)(node)) {
|
|
39
39
|
return;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
const _node$arguments = _slicedToArray(node.arguments, 1),
|
|
43
43
|
firstArgument = _node$arguments[0];
|
|
44
44
|
|
|
45
|
-
if (!(0,
|
|
45
|
+
if (!firstArgument || !(0, _utils.isStringNode)(firstArgument, '')) {
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if ((0, _tsUtils.getStringValue)(firstArgument) === '') {
|
|
54
|
-
context.report({
|
|
55
|
-
messageId: (0, _tsUtils.isDescribe)(node) ? 'describe' : 'test',
|
|
56
|
-
node
|
|
57
|
-
});
|
|
58
|
-
}
|
|
49
|
+
context.report({
|
|
50
|
+
messageId: (0, _utils.isDescribe)(node) ? 'describe' : 'test',
|
|
51
|
+
node
|
|
52
|
+
});
|
|
59
53
|
}
|
|
60
54
|
|
|
61
55
|
};
|