@@ -77,6 +77,9 @@ type IsAsyncUtilFn = (
7777type IsFireEventMethodFn = ( node : TSESTree . Identifier ) => boolean ;
7878type IsUserEventMethodFn = ( node : TSESTree . Identifier ) => boolean ;
7979type IsRenderUtilFn = ( node : TSESTree . Identifier ) => boolean ;
80+ type IsCreateEventUtil = (
81+ node : TSESTree . CallExpression | TSESTree . Identifier
82+ ) => boolean ;
8083type IsRenderVariableDeclaratorFn = (
8184 node : TSESTree . VariableDeclarator
8285) => boolean ;
@@ -115,6 +118,7 @@ export interface DetectionHelpers {
115118 isFireEventMethod : IsFireEventMethodFn ;
116119 isUserEventMethod : IsUserEventMethodFn ;
117120 isRenderUtil : IsRenderUtilFn ;
121+ isCreateEventUtil : IsCreateEventUtil ;
118122 isRenderVariableDeclarator : IsRenderVariableDeclaratorFn ;
119123 isDebugUtil : IsDebugUtilFn ;
120124 isActUtil : ( node : TSESTree . Identifier ) => boolean ;
@@ -128,6 +132,7 @@ export interface DetectionHelpers {
128132const USER_EVENT_PACKAGE = '@testing-library/user-event' ;
129133const REACT_DOM_TEST_UTILS_PACKAGE = 'react-dom/test-utils' ;
130134const FIRE_EVENT_NAME = 'fireEvent' ;
135+ const CREATE_EVENT_NAME = 'createEvent' ;
131136const USER_EVENT_NAME = 'userEvent' ;
132137const RENDER_NAME = 'render' ;
133138
@@ -471,6 +476,7 @@ export function detectTestingLibraryUtils<
471476 /**
472477 * Determines whether a given node is fireEvent method or not
473478 */
479+ // eslint-disable-next-line complexity
474480 const isFireEventMethod : IsFireEventMethodFn = ( node ) => {
475481 const fireEventUtil =
476482 findImportedTestingLibraryUtilSpecifier ( FIRE_EVENT_NAME ) ;
@@ -493,33 +499,54 @@ export function detectTestingLibraryUtils<
493499 ? node . parent
494500 : undefined ;
495501
496- if ( ! parentMemberExpression ) {
502+ const parentCallExpression : TSESTree . CallExpression | undefined =
503+ node . parent && isCallExpression ( node . parent ) ? node . parent : undefined ;
504+
505+ if ( ! parentMemberExpression && ! parentCallExpression ) {
497506 return false ;
498507 }
499508
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 ) ;
507512 }
508513
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+
509519 // check fireEvent.click() usage
510520 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 ;
513526
514527 // check testingLibraryUtils.fireEvent.click() usage
515528 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 ;
523550 } ;
524551
525552 const isUserEventMethod : IsUserEventMethodFn = ( node ) => {
@@ -595,6 +622,40 @@ export function detectTestingLibraryUtils<
595622 }
596623 ) ;
597624
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+
598659 const isRenderVariableDeclarator : IsRenderVariableDeclaratorFn = ( node ) => {
599660 if ( ! node . init ) {
600661 return false ;
@@ -712,7 +773,8 @@ export function detectTestingLibraryUtils<
712773 isRenderUtil ( node ) ||
713774 isFireEventMethod ( node ) ||
714775 isUserEventMethod ( node ) ||
715- isActUtil ( node )
776+ isActUtil ( node ) ||
777+ isCreateEventUtil ( node )
716778 ) ;
717779 } ;
718780
@@ -906,6 +968,7 @@ export function detectTestingLibraryUtils<
906968 isFireEventMethod,
907969 isUserEventMethod,
908970 isRenderUtil,
971+ isCreateEventUtil,
909972 isRenderVariableDeclarator,
910973 isDebugUtil,
911974 isActUtil,
0 commit comments