1212
1313import { act , fireEvent , mockClickDefault , pointerMap , render , within } from '@react-spectrum/test-utils-internal' ;
1414import Bell from '@spectrum-icons/workflow/Bell' ;
15+ import { Button } from '@react-spectrum/button' ;
1516import { Dialog , DialogTrigger } from '@react-spectrum/dialog' ;
16- import { Item , Menu , Section } from '../' ;
17+ import { Item , Menu , MenuTrigger , Section } from '../' ;
1718import { Keyboard , Text } from '@react-spectrum/text' ;
1819import { MenuContext } from '../src/context' ;
1920import { Provider } from '@react-spectrum/provider' ;
@@ -789,20 +790,31 @@ describe('Menu', function () {
789790 } ) ;
790791
791792 describe ( 'supports links' , function ( ) {
792- describe . each ( [ 'mouse' , 'keyboard ' ] ) ( '%s' , ( type ) => {
793+ describe . each ( [ 'mouse' , 'Enter' , 'Space '] ) ( '%s' , ( type ) => {
793794 it . each ( [ 'none' , 'single' , 'multiple' ] ) ( 'with selectionMode = %s' , async function ( selectionMode ) {
794795 let user = userEvent . setup ( { delay : null , pointerMap} ) ;
795796 let onAction = jest . fn ( ) ;
796797 let onSelectionChange = jest . fn ( ) ;
797798 let tree = render (
798799 < Provider theme = { theme } >
799- < Menu aria-label = "menu" selectionMode = { selectionMode } onSelectionChange = { onSelectionChange } onAction = { onAction } >
800- < Item href = "https://google.com" > One</ Item >
801- < Item href = "https://adobe.com" > Two</ Item >
802- </ Menu >
800+ < MenuTrigger >
801+ < Button > Button</ Button >
802+ < Menu aria-label = "menu" selectionMode = { selectionMode } onSelectionChange = { onSelectionChange } onAction = { onAction } >
803+ < Item href = "https://google.com" > One</ Item >
804+ < Item href = "https://adobe.com" > Two</ Item >
805+ </ Menu >
806+ </ MenuTrigger >
803807 </ Provider >
804808 ) ;
805809
810+ let button = tree . getByRole ( 'button' ) ;
811+ if ( type === 'mouse' ) {
812+ await user . click ( button ) ;
813+ } else {
814+ await user . tab ( ) ;
815+ await user . keyboard ( '{Enter}' ) ;
816+ }
817+
806818 let role = {
807819 none : 'menuitem' ,
808820 single : 'menuitemradio' ,
@@ -820,15 +832,43 @@ describe('Menu', function () {
820832 if ( type === 'mouse' ) {
821833 await user . click ( items [ 1 ] ) ;
822834 } else {
823- fireEvent . keyDown ( items [ 1 ] , { key : 'Enter' } ) ;
835+ fireEvent . keyDown ( items [ 1 ] , { key : type } ) ;
824836 fireEvent . click ( items [ 1 ] ) ;
825- fireEvent . keyUp ( items [ 1 ] , { key : 'Enter' } ) ;
837+ fireEvent . keyUp ( items [ 1 ] , { key : type } ) ;
826838 }
827839 expect ( onAction ) . toHaveBeenCalledTimes ( 1 ) ;
828840 expect ( onSelectionChange ) . not . toHaveBeenCalled ( ) ;
829841 expect ( onClick ) . toHaveBeenCalledTimes ( 1 ) ;
830842 window . removeEventListener ( 'click' , onClick ) ;
831843 } ) ;
832844 } ) ;
845+
846+ it ( 'should support dragging and releasing' , async ( ) => {
847+ let user = userEvent . setup ( { delay : null , pointerMap} ) ;
848+ let onAction = jest . fn ( ) ;
849+ let tree = render (
850+ < Provider theme = { theme } >
851+ < MenuTrigger >
852+ < Button > Button</ Button >
853+ < Menu aria-label = "menu" onAction = { onAction } >
854+ < Item href = "https://google.com" > One</ Item >
855+ < Item href = "https://adobe.com" > Two</ Item >
856+ </ Menu >
857+ </ MenuTrigger >
858+ </ Provider >
859+ ) ;
860+
861+ let button = tree . getByRole ( 'button' ) ;
862+ await user . pointer ( { target : button , keys : '[MouseLeft>]' } ) ;
863+
864+ let items = tree . getAllByRole ( 'menuitem' ) ;
865+ let onClick = mockClickDefault ( { capture : true } ) ;
866+
867+ await user . pointer ( { target : items [ 0 ] , keys : '[/MouseLeft]' } ) ;
868+
869+ expect ( onAction ) . toHaveBeenCalledTimes ( 1 ) ;
870+ expect ( onClick ) . toHaveBeenCalledTimes ( 1 ) ;
871+ window . removeEventListener ( 'click' , onClick ) ;
872+ } ) ;
833873 } ) ;
834874} ) ;
0 commit comments