1
1
import { ASTUtils , TSESTree } from '@typescript-eslint/experimental-utils' ;
2
2
import {
3
3
findClosestCallExpressionNode ,
4
+ getDeepestIdentifierNode ,
4
5
getFunctionName ,
5
6
getInnermostReturningFunction ,
6
7
getVariableReferences ,
@@ -27,9 +28,10 @@ export default createTestingLibraryRule<Options, MessageIds>({
27
28
} ,
28
29
} ,
29
30
messages : {
30
- awaitAsyncQuery : 'promise returned from {{ name }} query must be handled' ,
31
+ awaitAsyncQuery :
32
+ 'promise returned from `{{ name }}` query must be handled' ,
31
33
asyncQueryWrapper :
32
- 'promise returned from {{ name }} wrapper over async query must be handled' ,
34
+ 'promise returned from ` {{ name }}` wrapper over async query must be handled' ,
33
35
} ,
34
36
schema : [ ] ,
35
37
} ,
@@ -46,10 +48,16 @@ export default createTestingLibraryRule<Options, MessageIds>({
46
48
}
47
49
48
50
return {
49
- 'CallExpression Identifier' ( node : TSESTree . Identifier ) {
50
- if ( helpers . isAsyncQuery ( node ) ) {
51
+ CallExpression ( node ) {
52
+ const identifierNode = getDeepestIdentifierNode ( node ) ;
53
+
54
+ if ( ! identifierNode ) {
55
+ return ;
56
+ }
57
+
58
+ if ( helpers . isAsyncQuery ( identifierNode ) ) {
51
59
// detect async query used within wrapper function for later analysis
52
- detectAsyncQueryWrapper ( node ) ;
60
+ detectAsyncQueryWrapper ( identifierNode ) ;
53
61
54
62
const closestCallExpressionNode = findClosestCallExpressionNode (
55
63
node ,
@@ -68,11 +76,11 @@ export default createTestingLibraryRule<Options, MessageIds>({
68
76
// check direct usage of async query:
69
77
// const element = await findByRole('button')
70
78
if ( references && references . length === 0 ) {
71
- if ( ! isPromiseHandled ( node ) ) {
79
+ if ( ! isPromiseHandled ( identifierNode ) ) {
72
80
return context . report ( {
73
- node,
81
+ node : identifierNode ,
74
82
messageId : 'awaitAsyncQuery' ,
75
- data : { name : node . name } ,
83
+ data : { name : identifierNode . name } ,
76
84
} ) ;
77
85
}
78
86
}
@@ -86,19 +94,19 @@ export default createTestingLibraryRule<Options, MessageIds>({
86
94
! isPromiseHandled ( reference . identifier )
87
95
) {
88
96
return context . report ( {
89
- node,
97
+ node : identifierNode ,
90
98
messageId : 'awaitAsyncQuery' ,
91
- data : { name : node . name } ,
99
+ data : { name : identifierNode . name } ,
92
100
} ) ;
93
101
}
94
102
}
95
- } else if ( functionWrappersNames . includes ( node . name ) ) {
103
+ } else if ( functionWrappersNames . includes ( identifierNode . name ) ) {
96
104
// check async queries used within a wrapper previously detected
97
- if ( ! isPromiseHandled ( node ) ) {
105
+ if ( ! isPromiseHandled ( identifierNode ) ) {
98
106
return context . report ( {
99
- node,
107
+ node : identifierNode ,
100
108
messageId : 'asyncQueryWrapper' ,
101
- data : { name : node . name } ,
109
+ data : { name : identifierNode . name } ,
102
110
} ) ;
103
111
}
104
112
}
0 commit comments