10
10
* governing permissions and limitations under the License.
11
11
*/
12
12
13
+ import { act , pointerMap , render , within } from '@react-spectrum/test-utils-internal' ;
13
14
import {
14
15
Button ,
15
16
Dialog ,
16
17
DialogTrigger ,
17
18
Heading ,
19
+ Input ,
20
+ Label ,
21
+ Menu ,
22
+ MenuItem ,
23
+ MenuTrigger ,
18
24
Modal ,
19
25
ModalOverlay ,
20
26
OverlayArrow ,
21
- Popover
27
+ Popover ,
28
+ TextField
22
29
} from '../' ;
23
- import { pointerMap , render , within } from '@react-spectrum/test-utils-internal' ;
24
30
import React , { useRef } from 'react' ;
25
31
import { UNSAFE_PortalProvider } from '@react-aria/overlays' ;
26
32
import userEvent from '@testing-library/user-event' ;
@@ -29,6 +35,7 @@ describe('Dialog', () => {
29
35
let user ;
30
36
beforeAll ( ( ) => {
31
37
user = userEvent . setup ( { delay : null , pointerMap} ) ;
38
+ jest . useFakeTimers ( ) ;
32
39
} ) ;
33
40
34
41
it ( 'should have a base default set of attributes' , ( ) => {
@@ -379,4 +386,59 @@ describe('Dialog', () => {
379
386
await user . click ( document . body ) ;
380
387
} ) ;
381
388
} ) ;
389
+
390
+ it ( 'ensure Input autoFocus works when opening Modal from MenuItem via keyboard' , async ( ) => {
391
+ function App ( ) {
392
+ const [ isOpen , setOpen ] = React . useState ( false ) ;
393
+ return (
394
+ < >
395
+ < MenuTrigger >
396
+ < Button > Open menu</ Button >
397
+ < Popover >
398
+ < Menu >
399
+ < MenuItem onAction = { ( ) => setOpen ( true ) } > Add account</ MenuItem >
400
+ < MenuItem > Sign out</ MenuItem >
401
+ </ Menu >
402
+ </ Popover >
403
+ </ MenuTrigger >
404
+ < ModalOverlay isDismissable isOpen = { isOpen } onOpenChange = { setOpen } >
405
+ < Modal >
406
+ < Dialog >
407
+ < form >
408
+ < Heading slot = "title" > Sign up</ Heading >
409
+ < TextField autoFocus >
410
+ < Label > Email</ Label >
411
+ < Input data-testid = "email" />
412
+ </ TextField >
413
+ < TextField >
414
+ < Label > Password</ Label >
415
+ < Input />
416
+ </ TextField >
417
+ </ form >
418
+ </ Dialog >
419
+ </ Modal >
420
+ </ ModalOverlay >
421
+ </ >
422
+ ) ;
423
+ }
424
+
425
+ const { getAllByRole, getByRole, getByTestId} = render ( < App /> ) ;
426
+ const button = getByRole ( 'button' ) ;
427
+ await user . tab ( ) ;
428
+ expect ( document . activeElement ) . toBe ( button ) ;
429
+ await user . keyboard ( '{Enter}' ) ;
430
+ act ( ( ) => {
431
+ jest . runAllTimers ( ) ;
432
+ } ) ;
433
+
434
+ const menuitem = getAllByRole ( 'menuitem' ) [ 0 ] ;
435
+ expect ( document . activeElement ) . toBe ( menuitem ) ;
436
+ await user . keyboard ( '{Enter}' ) ;
437
+ act ( ( ) => {
438
+ jest . runAllTimers ( ) ;
439
+ } ) ;
440
+
441
+ const input = getByTestId ( 'email' ) ;
442
+ expect ( document . activeElement ) . toBe ( input ) ;
443
+ } ) ;
382
444
} ) ;
0 commit comments