@@ -641,4 +641,172 @@ describe('ActionMenu', () => {
641641 expect ( baseAnchor ) . not . toHaveAttribute ( 'aria-expanded' , 'true' )
642642 } )
643643 } )
644+
645+ describe ( 'calls event handlers on trigger' , ( ) => {
646+ it ( 'should call onClick and onKeyDown passed to ActionMenu.Button' , async ( ) => {
647+ const mockOnClick = jest . fn ( )
648+ const mockOnKeyDown = jest . fn ( )
649+
650+ const component = HTMLRender (
651+ < ThemeProvider theme = { theme } >
652+ < ActionMenu >
653+ < ActionMenu . Button onClick = { mockOnClick } onKeyDown = { mockOnKeyDown } >
654+ Open menu
655+ </ ActionMenu . Button >
656+ < ActionMenu . Overlay >
657+ < ActionList >
658+ < ActionList . Item > New file</ ActionList . Item >
659+ < ActionList . Item > Copy link</ ActionList . Item >
660+ </ ActionList >
661+ </ ActionMenu . Overlay >
662+ </ ActionMenu >
663+ </ ThemeProvider > ,
664+ )
665+
666+ const user = userEvent . setup ( )
667+ const button = component . getByRole ( 'button' )
668+ await user . click ( button )
669+
670+ expect ( component . getByRole ( 'menu' ) ) . toBeInTheDocument ( )
671+ expect ( mockOnClick ) . toHaveBeenCalledTimes ( 1 )
672+
673+ // select and close menu
674+ const menuItems = component . getAllByRole ( 'menuitem' )
675+ await user . click ( menuItems [ 0 ] )
676+ expect ( component . queryByRole ( 'menu' ) ) . toBeNull ( )
677+
678+ expect ( button ) . toEqual ( document . activeElement )
679+ await user . keyboard ( '{Enter}' )
680+ expect ( component . queryByRole ( 'menu' ) ) . toBeInTheDocument ( )
681+ expect ( mockOnKeyDown ) . toHaveBeenCalledTimes ( 1 )
682+ } )
683+
684+ it ( 'should call onClick and onKeyDown passed to IconButton inside ActionMenu.Anchor' , async ( ) => {
685+ const mockOnClick = jest . fn ( )
686+ const mockOnKeyDown = jest . fn ( )
687+
688+ const component = HTMLRender (
689+ < ThemeProvider theme = { theme } >
690+ < ActionMenu >
691+ < ActionMenu . Anchor >
692+ < IconButton
693+ icon = { KebabHorizontalIcon }
694+ aria-label = "Open menu"
695+ onClick = { mockOnClick }
696+ onKeyDown = { mockOnKeyDown }
697+ />
698+ </ ActionMenu . Anchor >
699+ < ActionMenu . Overlay >
700+ < ActionList >
701+ < ActionList . Item > New file</ ActionList . Item >
702+ < ActionList . Item > Copy link</ ActionList . Item >
703+ </ ActionList >
704+ </ ActionMenu . Overlay >
705+ </ ActionMenu >
706+ </ ThemeProvider > ,
707+ )
708+
709+ const user = userEvent . setup ( )
710+ const button = component . getByRole ( 'button' )
711+ await user . click ( button )
712+
713+ expect ( component . getByRole ( 'menu' ) ) . toBeInTheDocument ( )
714+ expect ( mockOnClick ) . toHaveBeenCalledTimes ( 1 )
715+
716+ // select and close menu
717+ const menuItems = component . getAllByRole ( 'menuitem' )
718+ await user . click ( menuItems [ 0 ] )
719+ expect ( component . queryByRole ( 'menu' ) ) . toBeNull ( )
720+
721+ expect ( button ) . toEqual ( document . activeElement )
722+ await user . keyboard ( '{Enter}' )
723+ expect ( component . queryByRole ( 'menu' ) ) . toBeInTheDocument ( )
724+ expect ( mockOnKeyDown ) . toHaveBeenCalledTimes ( 1 )
725+ } )
726+
727+ it ( 'should call onClick and onKeyDown passed to ActionMenu.Button with Tooltip' , async ( ) => {
728+ const mockOnClick = jest . fn ( )
729+ const mockOnKeyDown = jest . fn ( )
730+
731+ const component = HTMLRender (
732+ < ThemeProvider theme = { theme } >
733+ < ActionMenu >
734+ < TooltipV2 text = "Additional context about the menu button" direction = "s" >
735+ < ActionMenu . Button onClick = { mockOnClick } onKeyDown = { mockOnKeyDown } >
736+ Open menu
737+ </ ActionMenu . Button >
738+ </ TooltipV2 >
739+ < ActionMenu . Overlay >
740+ < ActionList >
741+ < ActionList . Item > New file</ ActionList . Item >
742+ < ActionList . Item > Copy link</ ActionList . Item >
743+ </ ActionList >
744+ </ ActionMenu . Overlay >
745+ </ ActionMenu >
746+ </ ThemeProvider > ,
747+ )
748+
749+ const user = userEvent . setup ( )
750+ const button = component . getByRole ( 'button' )
751+ await user . click ( button )
752+
753+ expect ( component . getByRole ( 'menu' ) ) . toBeInTheDocument ( )
754+ expect ( mockOnClick ) . toHaveBeenCalledTimes ( 1 )
755+
756+ // select and close menu
757+ const menuItems = component . getAllByRole ( 'menuitem' )
758+ await user . click ( menuItems [ 0 ] )
759+ expect ( component . queryByRole ( 'menu' ) ) . toBeNull ( )
760+
761+ expect ( button ) . toEqual ( document . activeElement )
762+ await user . keyboard ( '{Enter}' )
763+ expect ( component . queryByRole ( 'menu' ) ) . toBeInTheDocument ( )
764+ expect ( mockOnKeyDown ) . toHaveBeenCalledTimes ( 1 )
765+ } )
766+
767+ it ( 'should call onClick and onKeyDown passed to IconButton inside ActionMenu.Anchor with Tooltip' , async ( ) => {
768+ const mockOnClick = jest . fn ( )
769+ const mockOnKeyDown = jest . fn ( )
770+
771+ const component = HTMLRender (
772+ < ThemeProvider theme = { theme } >
773+ < ActionMenu >
774+ < ActionMenu . Anchor >
775+ < TooltipV2 text = "Additional context about the menu button" direction = "s" >
776+ < IconButton
777+ icon = { KebabHorizontalIcon }
778+ aria-label = "Open menu"
779+ onClick = { mockOnClick }
780+ onKeyDown = { mockOnKeyDown }
781+ />
782+ </ TooltipV2 >
783+ </ ActionMenu . Anchor >
784+ < ActionMenu . Overlay >
785+ < ActionList >
786+ < ActionList . Item > New file</ ActionList . Item >
787+ < ActionList . Item > Copy link</ ActionList . Item >
788+ </ ActionList >
789+ </ ActionMenu . Overlay >
790+ </ ActionMenu >
791+ </ ThemeProvider > ,
792+ )
793+
794+ const user = userEvent . setup ( )
795+ const button = component . getByRole ( 'button' )
796+ await user . click ( button )
797+
798+ expect ( component . getByRole ( 'menu' ) ) . toBeInTheDocument ( )
799+ expect ( mockOnClick ) . toHaveBeenCalledTimes ( 1 )
800+
801+ // select and close menu
802+ const menuItems = component . getAllByRole ( 'menuitem' )
803+ await user . click ( menuItems [ 0 ] )
804+ expect ( component . queryByRole ( 'menu' ) ) . toBeNull ( )
805+
806+ expect ( button ) . toEqual ( document . activeElement )
807+ await user . keyboard ( '{Enter}' )
808+ expect ( component . queryByRole ( 'menu' ) ) . toBeInTheDocument ( )
809+ expect ( mockOnKeyDown ) . toHaveBeenCalledTimes ( 1 )
810+ } )
811+ } )
644812} )
0 commit comments