12
12
13
13
import { act , fireEvent , mockClickDefault , pointerMap , render , within } from '@react-spectrum/test-utils-internal' ;
14
14
import Bell from '@spectrum-icons/workflow/Bell' ;
15
+ import { Button } from '@react-spectrum/button' ;
15
16
import { Dialog , DialogTrigger } from '@react-spectrum/dialog' ;
16
- import { Item , Menu , Section } from '../' ;
17
+ import { Item , Menu , MenuTrigger , Section } from '../' ;
17
18
import { Keyboard , Text } from '@react-spectrum/text' ;
18
19
import { MenuContext } from '../src/context' ;
19
20
import { Provider } from '@react-spectrum/provider' ;
@@ -789,20 +790,31 @@ describe('Menu', function () {
789
790
} ) ;
790
791
791
792
describe ( 'supports links' , function ( ) {
792
- describe . each ( [ 'mouse' , 'keyboard ' ] ) ( '%s' , ( type ) => {
793
+ describe . each ( [ 'mouse' , 'Enter' , 'Space '] ) ( '%s' , ( type ) => {
793
794
it . each ( [ 'none' , 'single' , 'multiple' ] ) ( 'with selectionMode = %s' , async function ( selectionMode ) {
794
795
let user = userEvent . setup ( { delay : null , pointerMap} ) ;
795
796
let onAction = jest . fn ( ) ;
796
797
let onSelectionChange = jest . fn ( ) ;
797
798
let tree = render (
798
799
< 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 >
803
807
</ Provider >
804
808
) ;
805
809
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
+
806
818
let role = {
807
819
none : 'menuitem' ,
808
820
single : 'menuitemradio' ,
@@ -820,15 +832,43 @@ describe('Menu', function () {
820
832
if ( type === 'mouse' ) {
821
833
await user . click ( items [ 1 ] ) ;
822
834
} else {
823
- fireEvent . keyDown ( items [ 1 ] , { key : 'Enter' } ) ;
835
+ fireEvent . keyDown ( items [ 1 ] , { key : type } ) ;
824
836
fireEvent . click ( items [ 1 ] ) ;
825
- fireEvent . keyUp ( items [ 1 ] , { key : 'Enter' } ) ;
837
+ fireEvent . keyUp ( items [ 1 ] , { key : type } ) ;
826
838
}
827
839
expect ( onAction ) . toHaveBeenCalledTimes ( 1 ) ;
828
840
expect ( onSelectionChange ) . not . toHaveBeenCalled ( ) ;
829
841
expect ( onClick ) . toHaveBeenCalledTimes ( 1 ) ;
830
842
window . removeEventListener ( 'click' , onClick ) ;
831
843
} ) ;
832
844
} ) ;
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
+ } ) ;
833
873
} ) ;
834
874
} ) ;
0 commit comments