Skip to content

Commit 10e5087

Browse files
authored
Better support valid each (#460)
* chore(utils): create `getJestFunctionArguments` utility function * fix(valid-describe): better support `.each` function * fix(valid-title): better support `.each` function
1 parent ea9558b commit 10e5087

File tree

5 files changed

+60
-16
lines changed

5 files changed

+60
-16
lines changed

src/rules/__tests__/valid-describe.test.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,11 @@ const ruleTester = new TSESLint.RuleTester({
1111

1212
ruleTester.run('valid-describe', rule, {
1313
valid: [
14-
'describe.each()()',
15-
'describe.each(() => {})()',
1614
'describe["each"]()()',
1715
'describe["each"](() => {})()',
1816
'describe["each"](() => {})("foo")',
19-
'describe.each(() => {})("foo")',
2017
'describe["each"]()(() => {})',
21-
'describe.each()(() => {})',
2218
'describe["each"]("foo")(() => {})',
23-
'describe.each("foo")(() => {})',
2419
'describe("foo", function() {})',
2520
'describe("foo", () => {})',
2621
'describe(`foo`, () => {})',
@@ -55,6 +50,26 @@ ruleTester.run('valid-describe', rule, {
5550
`,
5651
],
5752
invalid: [
53+
{
54+
code: 'describe.each()()',
55+
errors: [{ messageId: 'nameAndCallback', line: 1, column: 1 }],
56+
},
57+
{
58+
code: 'describe.each(() => {})()',
59+
errors: [{ messageId: 'nameAndCallback', line: 1, column: 1 }],
60+
},
61+
{
62+
code: 'describe.each(() => {})("foo")',
63+
errors: [{ messageId: 'nameAndCallback', line: 1, column: 25 }],
64+
},
65+
{
66+
code: 'describe.each()(() => {})',
67+
errors: [{ messageId: 'nameAndCallback', line: 1, column: 17 }],
68+
},
69+
{
70+
code: 'describe.each("foo")(() => {})',
71+
errors: [{ messageId: 'nameAndCallback', line: 1, column: 22 }],
72+
},
5873
{
5974
code: 'describe(() => {})',
6075
errors: [{ messageId: 'nameAndCallback', line: 1, column: 10 }],

src/rules/__tests__/valid-title.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ ruleTester.run('title-must-be-string', rule, {
3333
},
3434
],
3535
invalid: [
36+
{
37+
code: 'it.each([])(1, () => {});',
38+
errors: [
39+
{
40+
messageId: 'titleMustBeString',
41+
column: 13,
42+
line: 1,
43+
},
44+
],
45+
},
3646
{
3747
code: 'it(123, () => {});',
3848
errors: [

src/rules/utils.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,26 @@ export const isDescribe = (
651651
);
652652
};
653653

654+
/**
655+
* Gets the arguments of the given `JestFunctionCallExpression`.
656+
*
657+
* If the `node` is an `each` call, then the arguments of the actual suite
658+
* are returned, rather then the `each` array argument.
659+
*
660+
* @param {JestFunctionCallExpression<DescribeAlias | TestCaseName>} node
661+
*
662+
* @return {Expression[]}
663+
*/
664+
export const getJestFunctionArguments = (
665+
node: JestFunctionCallExpression<DescribeAlias | TestCaseName>,
666+
) =>
667+
node.callee.type === AST_NODE_TYPES.MemberExpression &&
668+
isSupportedAccessor(node.callee.property, DescribeProperty.each) &&
669+
node.parent &&
670+
node.parent.type === AST_NODE_TYPES.CallExpression
671+
? node.parent.arguments
672+
: node.arguments;
673+
654674
const collectReferences = (scope: TSESLint.Scope.Scope) => {
655675
const locals = new Set();
656676
const unresolved = new Set();

src/rules/valid-describe.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import {
44
} from '@typescript-eslint/experimental-utils';
55
import {
66
createRule,
7+
getJestFunctionArguments,
78
isDescribe,
89
isFunction,
9-
isSupportedAccessor,
1010
} from './utils';
1111

1212
const paramsLocation = (
@@ -21,10 +21,6 @@ const paramsLocation = (
2121
};
2222
};
2323

24-
const isDescribeEach = (node: TSESTree.CallExpression) =>
25-
node.callee.type === AST_NODE_TYPES.MemberExpression &&
26-
isSupportedAccessor(node.callee.property, 'each');
27-
2824
export default createRule({
2925
name: __filename,
3026
meta: {
@@ -49,23 +45,25 @@ export default createRule({
4945
create(context) {
5046
return {
5147
CallExpression(node) {
52-
if (!isDescribe(node) || isDescribeEach(node)) {
48+
if (!isDescribe(node)) {
5349
return;
5450
}
5551

56-
if (node.arguments.length < 1) {
52+
const nodeArguments = getJestFunctionArguments(node);
53+
54+
if (nodeArguments.length < 1) {
5755
return context.report({
5856
messageId: 'nameAndCallback',
5957
loc: node.loc,
6058
});
6159
}
6260

63-
const [, callback] = node.arguments;
61+
const [, callback] = nodeArguments;
6462

6563
if (!callback) {
6664
context.report({
6765
messageId: 'nameAndCallback',
68-
loc: paramsLocation(node.arguments),
66+
loc: paramsLocation(nodeArguments),
6967
});
7068

7169
return;
@@ -74,7 +72,7 @@ export default createRule({
7472
if (!isFunction(callback)) {
7573
context.report({
7674
messageId: 'secondArgumentMustBeFunction',
77-
loc: paramsLocation(node.arguments),
75+
loc: paramsLocation(nodeArguments),
7876
});
7977

8078
return;

src/rules/valid-title.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
DescribeAlias,
77
TestCaseName,
88
createRule,
9+
getJestFunctionArguments,
910
getNodeName,
1011
getStringValue,
1112
isDescribe,
@@ -53,7 +54,7 @@ export default createRule({
5354
return;
5455
}
5556

56-
const [argument] = node.arguments;
57+
const [argument] = getJestFunctionArguments(node);
5758

5859
if (!isStringNode(argument)) {
5960
if (

0 commit comments

Comments
 (0)