From b868a5fc86fe7cc14350af444e01501e436b1464 Mon Sep 17 00:00:00 2001 From: Thomas Lombart Date: Mon, 20 Jan 2020 14:05:48 +0100 Subject: [PATCH 1/3] feat: add support for resolves/rejects matchers in async queries --- lib/rules/await-async-query.js | 21 ++++++++++++++++++++- tests/lib/rules/await-async-query.js | 16 ++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/lib/rules/await-async-query.js b/lib/rules/await-async-query.js index 11e10b85..def38ddf 100644 --- a/lib/rules/await-async-query.js +++ b/lib/rules/await-async-query.js @@ -30,7 +30,11 @@ module.exports = { const testingLibraryQueryUsage = []; return { [`CallExpression > Identifier[name=${ASYNC_QUERIES_REGEXP}]`](node) { - if (!isAwaited(node.parent.parent) && !isPromiseResolved(node)) { + if ( + !isAwaited(node.parent.parent) && + !isPromiseResolved(node) && + !hasClosestExpectResolvesRejects(node) + ) { testingLibraryQueryUsage.push(node); } }, @@ -101,3 +105,18 @@ function isPromiseResolved(node) { // promise.then(...) return hasAThenProperty(parent); } + +function hasClosestExpectResolvesRejects(node) { + if (!node.parent) { + return; + } + + if (node.type === 'CallExpression' && node.callee.name === 'expect') { + const expectMatcher = node.parent.property; + return ( + expectMatcher.name === 'resolves' || expectMatcher.name === 'rejects' + ); + } else { + return hasClosestExpectResolvesRejects(node.parent); + } +} diff --git a/tests/lib/rules/await-async-query.js b/tests/lib/rules/await-async-query.js index f4032413..b21d6a8c 100644 --- a/tests/lib/rules/await-async-query.js +++ b/tests/lib/rules/await-async-query.js @@ -118,6 +118,22 @@ ruleTester.run('await-async-query', rule, { } `, }, + + // resolves/rejects matchers are valid + ...ASYNC_QUERIES_COMBINATIONS.map(query => ({ + code: `test(() => { + expect(${query}("foo")).resolves.toBe("bar") + expect(wrappedQuery(${query}("foo"))).resolves.toBe("bar") + }) + `, + })), + ...ASYNC_QUERIES_COMBINATIONS.map(query => ({ + code: `test(() => { + expect(${query}("foo")).rejects.toBe("bar") + expect(wrappedQuery(${query}("foo"))).rejects.toBe("bar") + }) + `, + })), ], invalid: From 48477c4bc5f9ab5e5d1e7dd69b64e2f63217fb98 Mon Sep 17 00:00:00 2001 From: Thomas Lombart Date: Tue, 21 Jan 2020 11:56:26 +0100 Subject: [PATCH 2/3] fix: check if there is an expect matcher --- lib/rules/await-async-query.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/rules/await-async-query.js b/lib/rules/await-async-query.js index def38ddf..d46ef702 100644 --- a/lib/rules/await-async-query.js +++ b/lib/rules/await-async-query.js @@ -114,7 +114,8 @@ function hasClosestExpectResolvesRejects(node) { if (node.type === 'CallExpression' && node.callee.name === 'expect') { const expectMatcher = node.parent.property; return ( - expectMatcher.name === 'resolves' || expectMatcher.name === 'rejects' + expectMatcher && + (expectMatcher.name === 'resolves' || expectMatcher.name === 'rejects') ); } else { return hasClosestExpectResolvesRejects(node.parent); From 284d1a44067539d8d44a8f04b2a577d9982445a7 Mon Sep 17 00:00:00 2001 From: Thomas Lombart Date: Tue, 21 Jan 2020 12:00:54 +0100 Subject: [PATCH 3/3] docs: add example for resolves/reject matcher in async queries --- docs/rules/await-async-query.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/rules/await-async-query.md b/docs/rules/await-async-query.md index 29f32cac..0f86c9eb 100644 --- a/docs/rules/await-async-query.md +++ b/docs/rules/await-async-query.md @@ -52,6 +52,10 @@ const bar = () => { // return the promise within a function is correct too! const findMyButton = () => findByText('my button'); + +// using a resolves/rejects matcher is also correct +expect(findByTestId('alert')).resolves.toBe('Success'); +expect(findByTestId('alert')).rejects.toBe('Error'); ``` ## Further Reading