diff --git a/src/rules/utils/__tests__/parseJestFnCall.test.ts b/src/rules/utils/__tests__/parseJestFnCall.test.ts index 49b6cc825..dba29a592 100644 --- a/src/rules/utils/__tests__/parseJestFnCall.test.ts +++ b/src/rules/utils/__tests__/parseJestFnCall.test.ts @@ -114,6 +114,10 @@ ruleTester.run('nonexistent methods', rule, { 'describe.concurrent()()', 'describe.concurrent``()', 'describe.every``()', + '/regex/.test()', + '"something".describe()', + '[].describe()', + 'new describe().only()', ], invalid: [], }); diff --git a/src/rules/utils/parseJestFnCall.ts b/src/rules/utils/parseJestFnCall.ts index b8462b8d0..4824547ba 100644 --- a/src/rules/utils/parseJestFnCall.ts +++ b/src/rules/utils/parseJestFnCall.ts @@ -21,7 +21,12 @@ export const isTypeOfJestFnCall = ( return jestFnCall !== null && types.includes(jestFnCall.type); }; -export function getNodeChain(node: TSESTree.Node): AccessorNode[] { +const joinChains = ( + a: AccessorNode[] | null, + b: AccessorNode[] | null, +): AccessorNode[] | null => (a && b ? [...a, ...b] : null); + +export function getNodeChain(node: TSESTree.Node): AccessorNode[] | null { if (isSupportedAccessor(node)) { return [node]; } @@ -30,13 +35,12 @@ export function getNodeChain(node: TSESTree.Node): AccessorNode[] { case AST_NODE_TYPES.TaggedTemplateExpression: return getNodeChain(node.tag); case AST_NODE_TYPES.MemberExpression: - return [...getNodeChain(node.object), ...getNodeChain(node.property)]; - case AST_NODE_TYPES.NewExpression: + return joinChains(getNodeChain(node.object), getNodeChain(node.property)); case AST_NODE_TYPES.CallExpression: return getNodeChain(node.callee); } - return []; + return null; } export interface ResolvedJestFnWithNode extends ResolvedJestFn { @@ -152,7 +156,7 @@ export const parseJestFnCall = ( const chain = getNodeChain(node); - if (chain.length === 0) { + if (!chain?.length) { return null; }