@@ -459,6 +459,124 @@ describe("DatePicker", () => {
459
459
} ) ;
460
460
} ) ;
461
461
462
+
463
+ describe ( "Month and Year Picker" , ( ) => {
464
+ const onHeaderExpandedChangeSpy = jest . fn ( ) ;
465
+
466
+ afterEach ( ( ) => {
467
+ onHeaderExpandedChangeSpy . mockClear ( ) ;
468
+ } ) ;
469
+
470
+ it ( "should show the month and year picker (uncontrolled)" , ( ) => {
471
+ const { getByRole} = render (
472
+ < DatePicker
473
+ showMonthAndYearPickers
474
+ calendarProps = { {
475
+ onHeaderExpandedChange : onHeaderExpandedChangeSpy ,
476
+ } }
477
+ defaultValue = { new CalendarDate ( 2024 , 4 , 26 ) }
478
+ label = "Date"
479
+ /> ,
480
+ ) ;
481
+
482
+ const button = getByRole ( "button" ) ;
483
+
484
+ triggerPress ( button ) ;
485
+
486
+ const dialog = getByRole ( "dialog" ) ;
487
+ const header = document . querySelector < HTMLButtonElement > ( `button[data-slot="header"]` ) ! ;
488
+
489
+ expect ( dialog ) . toBeVisible ( ) ;
490
+ expect ( onHeaderExpandedChangeSpy ) . not . toHaveBeenCalled ( ) ;
491
+
492
+ triggerPress ( header ) ;
493
+
494
+ const month = getByRole ( "button" , { name : "April" } ) ;
495
+ const year = getByRole ( "button" , { name : "2024" } ) ;
496
+
497
+ expect ( month ) . toHaveAttribute ( "data-value" , "4" ) ;
498
+ expect ( year ) . toHaveAttribute ( "data-value" , "2024" ) ;
499
+ expect ( onHeaderExpandedChangeSpy ) . toHaveBeenCalledTimes ( 1 ) ;
500
+ expect ( onHeaderExpandedChangeSpy ) . toHaveBeenCalledWith ( true ) ;
501
+
502
+ triggerPress ( button ) ;
503
+
504
+ expect ( dialog ) . not . toBeInTheDocument ( ) ;
505
+ expect ( onHeaderExpandedChangeSpy ) . toHaveBeenCalledTimes ( 2 ) ;
506
+ expect ( onHeaderExpandedChangeSpy ) . toHaveBeenCalledWith ( false ) ;
507
+ } ) ;
508
+
509
+ it ( "should show the month and year picker (controlled)" , ( ) => {
510
+ const { getByRole} = render (
511
+ < DatePicker
512
+ showMonthAndYearPickers
513
+ calendarProps = { {
514
+ isHeaderExpanded : true ,
515
+ onHeaderExpandedChange : onHeaderExpandedChangeSpy ,
516
+ } }
517
+ defaultValue = { new CalendarDate ( 2024 , 4 , 26 ) }
518
+ label = "Date"
519
+ /> ,
520
+ ) ;
521
+
522
+ const button = getByRole ( "button" ) ;
523
+
524
+ triggerPress ( button ) ;
525
+
526
+ const dialog = getByRole ( "dialog" ) ;
527
+ const month = getByRole ( "button" , { name : "April" } ) ;
528
+ const year = getByRole ( "button" , { name : "2024" } ) ;
529
+
530
+ expect ( dialog ) . toBeVisible ( ) ;
531
+ expect ( month ) . toHaveAttribute ( "data-value" , "4" ) ;
532
+ expect ( year ) . toHaveAttribute ( "data-value" , "2024" ) ;
533
+ expect ( onHeaderExpandedChangeSpy ) . not . toHaveBeenCalled ( ) ;
534
+
535
+ triggerPress ( button ) ;
536
+
537
+ expect ( dialog ) . not . toBeInTheDocument ( ) ;
538
+ expect ( onHeaderExpandedChangeSpy ) . not . toHaveBeenCalled ( ) ;
539
+ } ) ;
540
+
541
+ it ( "CalendarBottomContent should render correctly" , ( ) => {
542
+ const { getByRole, getByTestId} = render (
543
+ < DatePicker
544
+ showMonthAndYearPickers
545
+ CalendarBottomContent = { < div data-testid = "calendar-bottom-content" /> }
546
+ label = "Date"
547
+ /> ,
548
+ ) ;
549
+
550
+ const button = getByRole ( "button" ) ;
551
+
552
+ triggerPress ( button ) ;
553
+
554
+ let dialog = getByRole ( "dialog" ) ;
555
+ let calendarBottomContent = getByTestId ( "calendar-bottom-content" ) ;
556
+ const header = document . querySelector < HTMLButtonElement > ( `button[data-slot="header"]` ) ! ;
557
+
558
+ expect ( dialog ) . toBeVisible ( ) ;
559
+ expect ( calendarBottomContent ) . toBeVisible ( ) ;
560
+
561
+ triggerPress ( header ) ;
562
+
563
+ expect ( dialog ) . toBeVisible ( ) ;
564
+ expect ( calendarBottomContent ) . not . toBeInTheDocument ( ) ;
565
+
566
+ triggerPress ( button ) ; // close date picker
567
+
568
+ expect ( dialog ) . not . toBeInTheDocument ( ) ;
569
+ expect ( calendarBottomContent ) . not . toBeInTheDocument ( ) ;
570
+
571
+ triggerPress ( button ) ;
572
+
573
+ dialog = getByRole ( "dialog" ) ;
574
+ calendarBottomContent = getByTestId ( "calendar-bottom-content" ) ;
575
+
576
+ expect ( dialog ) . toBeVisible ( ) ;
577
+ expect ( calendarBottomContent ) . toBeVisible ( ) ;
578
+ } ) ;
579
+ } ) ;
462
580
it ( "should close listbox by clicking another datepicker" , async ( ) => {
463
581
const { getByRole, getAllByRole} = render (
464
582
< >
0 commit comments