From a62130c28d01dea065cc6900a062180de2079876 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Thu, 14 Oct 2021 19:54:57 +1300 Subject: [PATCH] fix(valid-expect-in-promise): support `await` in arrays (#949) --- .../__tests__/valid-expect-in-promise.test.ts | 22 +++++++++++ src/rules/valid-expect-in-promise.ts | 38 +++++++++++++++---- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/rules/__tests__/valid-expect-in-promise.test.ts b/src/rules/__tests__/valid-expect-in-promise.test.ts index 546ebe47c..c15983dea 100644 --- a/src/rules/__tests__/valid-expect-in-promise.test.ts +++ b/src/rules/__tests__/valid-expect-in-promise.test.ts @@ -120,6 +120,28 @@ ruleTester.run('valid-expect-in-promise', rule, { return number + 1; }); + expect([await promise]).toHaveLength(1); + }); + `, + dedent` + it('is valid', async () => { + const promise = loadNumber().then(number => { + expect(typeof number).toBe('number'); + + return number + 1; + }); + + expect([[await promise]]).toHaveLength(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 81195fc69..70f747738 100644 --- a/src/rules/valid-expect-in-promise.ts +++ b/src/rules/valid-expect-in-promise.ts @@ -143,6 +143,35 @@ const isPromiseMethodThatUsesValue = ( return isIdentifier(node.argument, name); }; +/** + * Attempts to determine if the runtime value represented by the given `identifier` + * is `await`ed within the given array of elements + */ +const isValueAwaitedInElements = ( + name: string, + elements: + | TSESTree.ArrayExpression['elements'] + | TSESTree.CallExpression['arguments'], +): boolean => { + for (const element of elements) { + if ( + element.type === AST_NODE_TYPES.AwaitExpression && + isIdentifier(element.argument, name) + ) { + return true; + } + + if ( + element.type === AST_NODE_TYPES.ArrayExpression && + isValueAwaitedInElements(name, element.elements) + ) { + return true; + } + } + + return false; +}; + /** * Attempts to determine if the runtime value represented by the given `identifier` * is `await`ed as an argument along the given call expression @@ -155,13 +184,8 @@ const isValueAwaitedInArguments = ( 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; - } + if (isValueAwaitedInElements(name, node.arguments)) { + return true; } node = node.callee;