@@ -77,6 +77,9 @@ type IsAsyncUtilFn = (
77
77
type IsFireEventMethodFn = ( node : TSESTree . Identifier ) => boolean ;
78
78
type IsUserEventMethodFn = ( node : TSESTree . Identifier ) => boolean ;
79
79
type IsRenderUtilFn = ( node : TSESTree . Identifier ) => boolean ;
80
+ type IsCreateEventUtil = (
81
+ node : TSESTree . CallExpression | TSESTree . Identifier
82
+ ) => boolean ;
80
83
type IsRenderVariableDeclaratorFn = (
81
84
node : TSESTree . VariableDeclarator
82
85
) => boolean ;
@@ -115,6 +118,7 @@ export interface DetectionHelpers {
115
118
isFireEventMethod : IsFireEventMethodFn ;
116
119
isUserEventMethod : IsUserEventMethodFn ;
117
120
isRenderUtil : IsRenderUtilFn ;
121
+ isCreateEventUtil : IsCreateEventUtil ;
118
122
isRenderVariableDeclarator : IsRenderVariableDeclaratorFn ;
119
123
isDebugUtil : IsDebugUtilFn ;
120
124
isActUtil : ( node : TSESTree . Identifier ) => boolean ;
@@ -128,6 +132,7 @@ export interface DetectionHelpers {
128
132
const USER_EVENT_PACKAGE = '@testing-library/user-event' ;
129
133
const REACT_DOM_TEST_UTILS_PACKAGE = 'react-dom/test-utils' ;
130
134
const FIRE_EVENT_NAME = 'fireEvent' ;
135
+ const CREATE_EVENT_NAME = 'createEvent' ;
131
136
const USER_EVENT_NAME = 'userEvent' ;
132
137
const RENDER_NAME = 'render' ;
133
138
@@ -471,6 +476,7 @@ export function detectTestingLibraryUtils<
471
476
/**
472
477
* Determines whether a given node is fireEvent method or not
473
478
*/
479
+ // eslint-disable-next-line complexity
474
480
const isFireEventMethod : IsFireEventMethodFn = ( node ) => {
475
481
const fireEventUtil =
476
482
findImportedTestingLibraryUtilSpecifier ( FIRE_EVENT_NAME ) ;
@@ -493,33 +499,54 @@ export function detectTestingLibraryUtils<
493
499
? node . parent
494
500
: undefined ;
495
501
496
- if ( ! parentMemberExpression ) {
502
+ const parentCallExpression : TSESTree . CallExpression | undefined =
503
+ node . parent && isCallExpression ( node . parent ) ? node . parent : undefined ;
504
+
505
+ if ( ! parentMemberExpression && ! parentCallExpression ) {
497
506
return false ;
498
507
}
499
508
500
- // make sure that given node it's not fireEvent object itself
501
- if (
502
- [ fireEventUtilName , FIRE_EVENT_NAME ] . includes ( node . name ) ||
503
- ( ASTUtils . isIdentifier ( parentMemberExpression . object ) &&
504
- parentMemberExpression . object . name === node . name )
505
- ) {
506
- return false ;
509
+ // check fireEvent('method', node) usage
510
+ if ( parentCallExpression ) {
511
+ return [ fireEventUtilName , FIRE_EVENT_NAME ] . includes ( node . name ) ;
507
512
}
508
513
514
+ // we know it's defined at this point, but TS seems to think it is not
515
+ // so here I'm enforcing it once in order to avoid using "!" operator every time
516
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
517
+ const definedParentMemberExpression = parentMemberExpression ! ;
518
+
509
519
// check fireEvent.click() usage
510
520
const regularCall =
511
- ASTUtils . isIdentifier ( parentMemberExpression . object ) &&
512
- parentMemberExpression . object . name === fireEventUtilName ;
521
+ ASTUtils . isIdentifier ( definedParentMemberExpression . object ) &&
522
+ isCallExpression ( definedParentMemberExpression . parent ) &&
523
+ definedParentMemberExpression . object . name === fireEventUtilName &&
524
+ node . name !== FIRE_EVENT_NAME &&
525
+ node . name !== fireEventUtilName ;
513
526
514
527
// check testingLibraryUtils.fireEvent.click() usage
515
528
const wildcardCall =
516
- isMemberExpression ( parentMemberExpression . object ) &&
517
- ASTUtils . isIdentifier ( parentMemberExpression . object . object ) &&
518
- parentMemberExpression . object . object . name === fireEventUtilName &&
519
- ASTUtils . isIdentifier ( parentMemberExpression . object . property ) &&
520
- parentMemberExpression . object . property . name === FIRE_EVENT_NAME ;
521
-
522
- return regularCall || wildcardCall ;
529
+ isMemberExpression ( definedParentMemberExpression . object ) &&
530
+ ASTUtils . isIdentifier ( definedParentMemberExpression . object . object ) &&
531
+ definedParentMemberExpression . object . object . name ===
532
+ fireEventUtilName &&
533
+ ASTUtils . isIdentifier ( definedParentMemberExpression . object . property ) &&
534
+ definedParentMemberExpression . object . property . name ===
535
+ FIRE_EVENT_NAME &&
536
+ node . name !== FIRE_EVENT_NAME &&
537
+ node . name !== fireEventUtilName ;
538
+
539
+ // check testingLibraryUtils.fireEvent('click')
540
+ const wildcardCallWithCallExpression =
541
+ ASTUtils . isIdentifier ( definedParentMemberExpression . object ) &&
542
+ definedParentMemberExpression . object . name === fireEventUtilName &&
543
+ ASTUtils . isIdentifier ( definedParentMemberExpression . property ) &&
544
+ definedParentMemberExpression . property . name === FIRE_EVENT_NAME &&
545
+ ! isMemberExpression ( definedParentMemberExpression . parent ) &&
546
+ node . name === FIRE_EVENT_NAME &&
547
+ node . name !== fireEventUtilName ;
548
+
549
+ return regularCall || wildcardCall || wildcardCallWithCallExpression ;
523
550
} ;
524
551
525
552
const isUserEventMethod : IsUserEventMethodFn = ( node ) => {
@@ -595,6 +622,40 @@ export function detectTestingLibraryUtils<
595
622
}
596
623
) ;
597
624
625
+ const isCreateEventUtil : IsCreateEventUtil = ( node ) => {
626
+ const isCreateEventCallback = (
627
+ identifierNodeName : string ,
628
+ originalNodeName ?: string
629
+ ) => [ identifierNodeName , originalNodeName ] . includes ( CREATE_EVENT_NAME ) ;
630
+ if (
631
+ isCallExpression ( node ) &&
632
+ isMemberExpression ( node . callee ) &&
633
+ ASTUtils . isIdentifier ( node . callee . object )
634
+ ) {
635
+ return isPotentialTestingLibraryFunction (
636
+ node . callee . object ,
637
+ isCreateEventCallback
638
+ ) ;
639
+ }
640
+
641
+ if (
642
+ isCallExpression ( node ) &&
643
+ isMemberExpression ( node . callee ) &&
644
+ isMemberExpression ( node . callee . object ) &&
645
+ ASTUtils . isIdentifier ( node . callee . object . property )
646
+ ) {
647
+ return isPotentialTestingLibraryFunction (
648
+ node . callee . object . property ,
649
+ isCreateEventCallback
650
+ ) ;
651
+ }
652
+ const identifier = getDeepestIdentifierNode ( node ) ;
653
+ return isPotentialTestingLibraryFunction (
654
+ identifier ,
655
+ isCreateEventCallback
656
+ ) ;
657
+ } ;
658
+
598
659
const isRenderVariableDeclarator : IsRenderVariableDeclaratorFn = ( node ) => {
599
660
if ( ! node . init ) {
600
661
return false ;
@@ -712,7 +773,8 @@ export function detectTestingLibraryUtils<
712
773
isRenderUtil ( node ) ||
713
774
isFireEventMethod ( node ) ||
714
775
isUserEventMethod ( node ) ||
715
- isActUtil ( node )
776
+ isActUtil ( node ) ||
777
+ isCreateEventUtil ( node )
716
778
) ;
717
779
} ;
718
780
@@ -906,6 +968,7 @@ export function detectTestingLibraryUtils<
906
968
isFireEventMethod,
907
969
isUserEventMethod,
908
970
isRenderUtil,
971
+ isCreateEventUtil,
909
972
isRenderVariableDeclarator,
910
973
isDebugUtil,
911
974
isActUtil,
0 commit comments