@@ -23,13 +23,15 @@ let CLOSE_TIME = 350;
23
23
24
24
describe ( 'ActionMenu' , function ( ) {
25
25
let onActionSpy = jest . fn ( ) ;
26
+ let onOpenChange = jest . fn ( ) ;
26
27
27
28
beforeAll ( function ( ) {
28
29
jest . useFakeTimers ( 'legacy' ) ;
29
30
} ) ;
30
31
31
32
afterEach ( ( ) => {
32
33
onActionSpy . mockClear ( ) ;
34
+ onOpenChange . mockClear ( ) ;
33
35
act ( ( ) => {
34
36
jest . runAllTimers ( ) ;
35
37
} ) ;
@@ -107,6 +109,59 @@ describe('ActionMenu', function () {
107
109
expect ( document . activeElement ) . toBe ( button ) ;
108
110
} ) ;
109
111
112
+ it ( 'supports a controlled open state ' , function ( ) {
113
+ let tree = render (
114
+ < Provider theme = { theme } >
115
+ < ActionMenu onOpenChange = { onOpenChange } isOpen >
116
+ < Item > Foo</ Item >
117
+ < Item > Bar</ Item >
118
+ < Item > Baz</ Item >
119
+ </ ActionMenu >
120
+ </ Provider >
121
+ ) ;
122
+
123
+ act ( ( ) => { jest . runAllTimers ( ) ; } ) ;
124
+ expect ( onOpenChange ) . toBeCalledTimes ( 0 ) ;
125
+
126
+ let menu = tree . getByRole ( 'menu' ) ;
127
+ expect ( menu ) . toBeTruthy ( ) ;
128
+
129
+ let triggerButton = tree . getByLabelText ( 'More actions' ) ;
130
+ triggerPress ( triggerButton ) ;
131
+ act ( ( ) => { jest . runAllTimers ( ) ; } ) ;
132
+
133
+ menu = tree . getByRole ( 'menu' ) ;
134
+ expect ( menu ) . toBeTruthy ( ) ;
135
+ expect ( onOpenChange ) . toBeCalledTimes ( 1 ) ;
136
+ expect ( triggerButton ) . toHaveAttribute ( 'aria-expanded' , 'true' ) ;
137
+ } ) ;
138
+
139
+ it ( 'supports an uncontrolled default open state ' , function ( ) {
140
+ let tree = render (
141
+ < Provider theme = { theme } >
142
+ < ActionMenu onOpenChange = { onOpenChange } defaultOpen >
143
+ < Item > Foo</ Item >
144
+ < Item > Bar</ Item >
145
+ < Item > Baz</ Item >
146
+ </ ActionMenu >
147
+ </ Provider >
148
+ ) ;
149
+
150
+ act ( ( ) => { jest . runAllTimers ( ) ; } ) ;
151
+ expect ( onOpenChange ) . toBeCalledTimes ( 0 ) ;
152
+
153
+ let menu = tree . getByRole ( 'menu' ) ;
154
+ expect ( menu ) . toBeTruthy ( ) ;
155
+
156
+ let triggerButton = tree . getByLabelText ( 'More actions' ) ;
157
+ triggerPress ( triggerButton ) ;
158
+ act ( ( ) => { jest . runAllTimers ( ) ; } ) ;
159
+
160
+ expect ( menu ) . not . toBeInTheDocument ( ) ;
161
+ expect ( onOpenChange ) . toBeCalledTimes ( 1 ) ;
162
+ expect ( triggerButton ) . toHaveAttribute ( 'aria-expanded' , 'false' ) ;
163
+ } ) ;
164
+
110
165
describe ( 'with tooltips' , function ( ) {
111
166
it ( 'using mouse' , function ( ) {
112
167
let tree = render (
0 commit comments