From 7627d571803a9ef7ea47ec11a9bb3e7662bea071 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Tue, 12 Oct 2021 08:13:52 +1300 Subject: [PATCH] fix(valid-expect-in-promise): support deep property call chains --- .../__tests__/valid-expect-in-promise.test.ts | 42 +++++++++++++++++++ src/rules/valid-expect-in-promise.ts | 33 +++++++++------ 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/src/rules/__tests__/valid-expect-in-promise.test.ts b/src/rules/__tests__/valid-expect-in-promise.test.ts index b06a4cd46..751604557 100644 --- a/src/rules/__tests__/valid-expect-in-promise.test.ts +++ b/src/rules/__tests__/valid-expect-in-promise.test.ts @@ -34,6 +34,48 @@ ruleTester.run('valid-expect-in-promise', rule, { return number + 1; }); + expect(await promise).resolves.toBeGreaterThan(1); + }); + `, + dedent` + it('is valid', async () => { + const promise = loadNumber().then(number => { + expect(typeof number).toBe('number'); + + return number + 1; + }); + + expect(1).toBeGreaterThan(await promise); + }); + `, + dedent` + it('is valid', async () => { + const promise = loadNumber().then(number => { + expect(typeof number).toBe('number'); + + return number + 1; + }); + + expect.this.that.is(await promise); + }); + `, + dedent` + it('is valid', async () => { + expect(await loadNumber().then(number => { + expect(typeof number).toBe('number'); + + return number + 1; + })).toBeGreaterThan(1); + }); + `, + dedent` + it('is valid', async () => { + const promise = loadNumber().then(number => { + expect(typeof number).toBe('number'); + + return number + 1; + }); + logValue(await promise); }); `, diff --git a/src/rules/valid-expect-in-promise.ts b/src/rules/valid-expect-in-promise.ts index 5aa7f2894..0bc7b7bf7 100644 --- a/src/rules/valid-expect-in-promise.ts +++ b/src/rules/valid-expect-in-promise.ts @@ -150,22 +150,29 @@ const isPromiseMethodThatUsesValue = ( */ const isValueAwaitedInArguments = ( name: string, - node: TSESTree.CallExpression, + call: TSESTree.CallExpression, ): boolean => { - for (const argument of node.arguments) { - if ( - argument.type === AST_NODE_TYPES.AwaitExpression && - isIdentifier(argument.argument, name) - ) { - return true; + let node: TSESTree.Node = call; + + while (node) { + if (node.type === AST_NODE_TYPES.CallExpression) { + for (const argument of node.arguments) { + if ( + argument.type === AST_NODE_TYPES.AwaitExpression && + isIdentifier(argument.argument, name) + ) { + return true; + } + } + + node = node.callee; } - } - if ( - node.callee.type === AST_NODE_TYPES.MemberExpression && - node.callee.object.type === AST_NODE_TYPES.CallExpression - ) { - return isValueAwaitedInArguments(name, node.callee.object); + if (node.type !== AST_NODE_TYPES.MemberExpression) { + break; + } + + node = node.object; } return false;