Skip to content

Commit 32931c3

Browse files
authored
fix(no-disabled-tests): switch to using jest function call parser (#1125)
1 parent 6d75e8d commit 32931c3

File tree

2 files changed

+59
-59
lines changed

2 files changed

+59
-59
lines changed

src/rules/__tests__/no-disabled-tests.test.ts

+19-19
Original file line numberDiff line numberDiff line change
@@ -65,63 +65,63 @@ ruleTester.run('no-disabled-tests', rule, {
6565
invalid: [
6666
{
6767
code: 'describe.skip("foo", function () {})',
68-
errors: [{ messageId: 'skippedTestSuite', column: 1, line: 1 }],
68+
errors: [{ messageId: 'disabledSuite', column: 1, line: 1 }],
6969
},
7070
{
7171
code: 'describe.skip.each([1, 2, 3])("%s", (a, b) => {});',
72-
errors: [{ messageId: 'skippedTestSuite', column: 1, line: 1 }],
72+
errors: [{ messageId: 'disabledSuite', column: 1, line: 1 }],
7373
},
7474
{
7575
code: 'xdescribe.each([1, 2, 3])("%s", (a, b) => {});',
76-
errors: [{ messageId: 'skippedTestSuite', column: 1, line: 1 }],
76+
errors: [{ messageId: 'disabledSuite', column: 1, line: 1 }],
7777
},
7878
{
7979
code: 'describe[`skip`]("foo", function () {})',
80-
errors: [{ messageId: 'skippedTestSuite', column: 1, line: 1 }],
80+
errors: [{ messageId: 'disabledSuite', column: 1, line: 1 }],
8181
},
8282
{
8383
code: 'describe["skip"]("foo", function () {})',
84-
errors: [{ messageId: 'skippedTestSuite', column: 1, line: 1 }],
84+
errors: [{ messageId: 'disabledSuite', column: 1, line: 1 }],
8585
},
8686
{
8787
code: 'it.skip("foo", function () {})',
88-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
88+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
8989
},
9090
{
9191
code: 'it.concurrent.skip("foo", function () {})',
92-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
92+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
9393
},
9494
{
9595
code: 'it["skip"]("foo", function () {})',
96-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
96+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
9797
},
9898
{
9999
code: 'test.skip("foo", function () {})',
100-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
100+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
101101
},
102102
{
103103
code: 'it.skip.each``("foo", function () {})',
104-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
104+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
105105
},
106106
{
107107
code: 'test.skip.each``("foo", function () {})',
108-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
108+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
109109
},
110110
{
111111
code: 'it.skip.each([])("foo", function () {})',
112-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
112+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
113113
},
114114
{
115115
code: 'test.skip.each([])("foo", function () {})',
116-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
116+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
117117
},
118118
{
119119
code: 'test.concurrent.skip("foo", function () {})',
120-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
120+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
121121
},
122122
{
123123
code: 'test["skip"]("foo", function () {})',
124-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
124+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
125125
},
126126
{
127127
code: 'xdescribe("foo", function () {})',
@@ -137,19 +137,19 @@ ruleTester.run('no-disabled-tests', rule, {
137137
},
138138
{
139139
code: 'xit.each``("foo", function () {})',
140-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
140+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
141141
},
142142
{
143143
code: 'xtest.each``("foo", function () {})',
144-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
144+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
145145
},
146146
{
147147
code: 'xit.each([])("foo", function () {})',
148-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
148+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
149149
},
150150
{
151151
code: 'xtest.each([])("foo", function () {})',
152-
errors: [{ messageId: 'skippedTest', column: 1, line: 1 }],
152+
errors: [{ messageId: 'disabledTest', column: 1, line: 1 }],
153153
},
154154
{
155155
code: 'it("has title but no callback")',

src/rules/no-disabled-tests.ts

+40-40
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { createRule, getNodeName, scopeHasLocalReference } from './utils';
1+
import {
2+
createRule,
3+
getAccessorValue,
4+
parseJestFnCall,
5+
scopeHasLocalReference,
6+
} from './utils';
27

38
export default createRule({
49
name: __filename,
@@ -10,8 +15,6 @@ export default createRule({
1015
},
1116
messages: {
1217
missingFunction: 'Test is missing function argument',
13-
skippedTestSuite: 'Skipped test suite',
14-
skippedTest: 'Skipped test',
1518
pending: 'Call to pending()',
1619
pendingSuite: 'Call to pending() within test suite',
1720
pendingTest: 'Call to pending() within test',
@@ -27,40 +30,49 @@ export default createRule({
2730
let testDepth = 0;
2831

2932
return {
30-
'CallExpression[callee.name="describe"]'() {
31-
suiteDepth++;
32-
},
33-
'CallExpression[callee.name=/^(it|test)$/]'() {
34-
testDepth++;
35-
},
3633
'CallExpression[callee.name=/^(it|test)$/][arguments.length<2]'(node) {
3734
context.report({ messageId: 'missingFunction', node });
3835
},
3936
CallExpression(node) {
40-
const functionName = getNodeName(node.callee);
37+
const jestFnCall = parseJestFnCall(node, context.getScope());
4138

42-
// prevent duplicate warnings for it.each()()
43-
if (node.callee.type === 'CallExpression') {
39+
if (!jestFnCall) {
4440
return;
4541
}
4642

47-
switch (functionName) {
48-
case 'describe.skip.each':
49-
case 'xdescribe.each':
50-
case 'describe.skip':
51-
context.report({ messageId: 'skippedTestSuite', node });
52-
break;
43+
if (jestFnCall.type === 'describe') {
44+
suiteDepth++;
45+
}
46+
47+
if (jestFnCall.type === 'test') {
48+
testDepth++;
49+
}
5350

54-
case 'it.skip':
55-
case 'it.concurrent.skip':
56-
case 'test.skip':
57-
case 'test.concurrent.skip':
58-
case 'it.skip.each':
59-
case 'test.skip.each':
60-
case 'xit.each':
61-
case 'xtest.each':
62-
context.report({ messageId: 'skippedTest', node });
63-
break;
51+
if (
52+
// the only jest functions that are with "x" are "xdescribe", "xtest", and "xit"
53+
jestFnCall.name.startsWith('x') ||
54+
jestFnCall.members.some(s => getAccessorValue(s) === 'skip')
55+
) {
56+
context.report({
57+
messageId:
58+
jestFnCall.type === 'describe' ? 'disabledSuite' : 'disabledTest',
59+
node,
60+
});
61+
}
62+
},
63+
'CallExpression:exit'(node) {
64+
const jestFnCall = parseJestFnCall(node, context.getScope());
65+
66+
if (!jestFnCall) {
67+
return;
68+
}
69+
70+
if (jestFnCall.type === 'describe') {
71+
suiteDepth--;
72+
}
73+
74+
if (jestFnCall.type === 'test') {
75+
testDepth--;
6476
}
6577
},
6678
'CallExpression[callee.name="pending"]'(node) {
@@ -76,18 +88,6 @@ export default createRule({
7688
context.report({ messageId: 'pending', node });
7789
}
7890
},
79-
'CallExpression[callee.name="xdescribe"]'(node) {
80-
context.report({ messageId: 'disabledSuite', node });
81-
},
82-
'CallExpression[callee.name=/^(xit|xtest)$/]'(node) {
83-
context.report({ messageId: 'disabledTest', node });
84-
},
85-
'CallExpression[callee.name="describe"]:exit'() {
86-
suiteDepth--;
87-
},
88-
'CallExpression[callee.name=/^(it|test)$/]:exit'() {
89-
testDepth--;
90-
},
9191
};
9292
},
9393
});

0 commit comments

Comments
 (0)