@@ -415,6 +415,249 @@ test(`Does not render ${styles.treeViewNode} element with ${styles.modifiers.cur
415415 expect ( treeViewNode ) . not . toHaveClass ( styles . modifiers . current ) ;
416416} ) ;
417417
418+ // Assisted by Cursor AI
419+ describe ( 'isDisabled prop' , ( ) => {
420+ const user = userEvent . setup ( ) ;
421+ const onSelectMock = jest . fn ( ) ;
422+ const onExpandMock = jest . fn ( ) ;
423+ const onCollapseMock = jest . fn ( ) ;
424+
425+ beforeEach ( ( ) => {
426+ jest . clearAllMocks ( ) ;
427+ } ) ;
428+
429+ test ( `Renders button with disabled attribute and ${ styles . modifiers . disabled } class when isDisabled is true` , ( ) => {
430+ render ( < TreeViewListItem isDisabled { ...requiredProps } /> ) ;
431+
432+ const button = screen . getByRole ( 'button' , { name : requiredProps . name } ) ;
433+ expect ( button ) . toBeDisabled ( ) ;
434+ expect ( button ) . toHaveClass ( styles . modifiers . disabled ) ;
435+ } ) ;
436+
437+ test ( 'Does not render button with disabled attribute when isDisabled is false' , ( ) => {
438+ render ( < TreeViewListItem isDisabled = { false } { ...requiredProps } /> ) ;
439+
440+ expect ( screen . getByRole ( 'button' , { name : requiredProps . name } ) ) . not . toBeDisabled ( ) ;
441+ } ) ;
442+
443+ test ( 'Does not call onSelect when isDisabled is true' , async ( ) => {
444+ render ( < TreeViewListItem isDisabled onSelect = { onSelectMock } { ...requiredProps } /> ) ;
445+
446+ await user . click ( screen . getByRole ( 'button' , { name : requiredProps . name } ) ) ;
447+
448+ expect ( onSelectMock ) . not . toHaveBeenCalled ( ) ;
449+ } ) ;
450+
451+ test ( 'Does not call onExpand when isDisabled is true and item is collapsed' , async ( ) => {
452+ render (
453+ < TreeViewListItem isDisabled onExpand = { onExpandMock } { ...requiredProps } >
454+ Content
455+ </ TreeViewListItem >
456+ ) ;
457+
458+ await user . click ( screen . getByRole ( 'button' , { name : requiredProps . name } ) ) ;
459+
460+ expect ( onExpandMock ) . not . toHaveBeenCalled ( ) ;
461+ } ) ;
462+
463+ test ( 'Does not call onCollapse when isDisabled is true and item is expanded' , async ( ) => {
464+ render (
465+ < TreeViewListItem isDisabled isExpanded onCollapse = { onCollapseMock } { ...requiredProps } >
466+ Content
467+ </ TreeViewListItem >
468+ ) ;
469+
470+ await user . click ( screen . getByRole ( 'button' , { name : requiredProps . name } ) ) ;
471+
472+ expect ( onCollapseMock ) . not . toHaveBeenCalled ( ) ;
473+ } ) ;
474+
475+ test ( `Renders toggle with ${ styles . modifiers . disabled } class when isDisabled is true for default TreeViewListItem` , ( ) => {
476+ render (
477+ < TreeViewListItem isDisabled { ...requiredProps } >
478+ Content
479+ </ TreeViewListItem >
480+ ) ;
481+
482+ const toggle = screen . getByText ( requiredProps . name ) . previousElementSibling ;
483+ expect ( toggle ) . toHaveClass ( styles . modifiers . disabled ) ;
484+ } ) ;
485+
486+ test ( 'Renders treeitem with aria-disabled when isDisabled is true for default TreeViewListItem' , ( ) => {
487+ render ( < TreeViewListItem isDisabled { ...requiredProps } /> ) ;
488+
489+ expect ( screen . getByRole ( 'treeitem' ) ) . toHaveAttribute ( 'aria-disabled' , 'true' ) ;
490+ } ) ;
491+
492+ test ( 'Renders treeitem with aria-disabled when isDisabled and isToggleDisabled are true and isSelectable is true' , ( ) => {
493+ render (
494+ < TreeViewListItem isSelectable isDisabled isToggleDisabled { ...requiredProps } >
495+ Content
496+ </ TreeViewListItem >
497+ ) ;
498+
499+ expect ( screen . getByRole ( 'treeitem' ) ) . toHaveAttribute ( 'aria-disabled' , 'true' ) ;
500+ } ) ;
501+
502+ test ( 'Renders treeitem with aria-disabled when isDisabled and isToggleDisabled are true and hasCheckbox is true' , ( ) => {
503+ render (
504+ < TreeViewListItem hasCheckbox isDisabled isToggleDisabled { ...requiredProps } >
505+ Content
506+ </ TreeViewListItem >
507+ ) ;
508+
509+ expect ( screen . getByRole ( 'treeitem' ) ) . toHaveAttribute ( 'aria-disabled' , 'true' ) ;
510+ } ) ;
511+
512+ test ( 'Does not render treeitem with aria-disabled when isDisabled is true, isToggleDisabled is false, and isSelectable is true' , ( ) => {
513+ render (
514+ < TreeViewListItem isSelectable isDisabled { ...requiredProps } >
515+ Content
516+ </ TreeViewListItem >
517+ ) ;
518+
519+ expect ( screen . getByRole ( 'treeitem' ) ) . not . toHaveAttribute ( 'aria-disabled' ) ;
520+ } ) ;
521+
522+ test ( 'Does not render treeitem with aria-disabled when isDisabled is false' , ( ) => {
523+ render ( < TreeViewListItem isDisabled = { false } { ...requiredProps } /> ) ;
524+
525+ expect ( screen . getByRole ( 'treeitem' ) ) . not . toHaveAttribute ( 'aria-disabled' ) ;
526+ } ) ;
527+ } ) ;
528+
529+ // Assisted by Cursor AI
530+ describe ( 'isToggleDisabled prop' , ( ) => {
531+ const user = userEvent . setup ( ) ;
532+ const onExpandMock = jest . fn ( ) ;
533+ const onCollapseMock = jest . fn ( ) ;
534+
535+ beforeEach ( ( ) => {
536+ jest . clearAllMocks ( ) ;
537+ } ) ;
538+
539+ test ( `Renders toggle button with disabled attribute and ${ styles . modifiers . disabled } class when isToggleDisabled is true and hasCheckbox is passed` , ( ) => {
540+ render (
541+ < TreeViewListItem hasCheckbox isToggleDisabled { ...requiredProps } >
542+ Content
543+ </ TreeViewListItem >
544+ ) ;
545+
546+ const toggle = screen . getByText ( requiredProps . name ) . previousElementSibling ?. previousElementSibling ;
547+ expect ( toggle ) . toBeDisabled ( ) ;
548+ expect ( toggle ) . toHaveClass ( styles . modifiers . disabled ) ;
549+ } ) ;
550+
551+ test ( `Renders toggle button with disabled attribute and ${ styles . modifiers . disabled } class when isToggleDisabled is true and isSelectable is passed` , ( ) => {
552+ render (
553+ < TreeViewListItem isSelectable isToggleDisabled { ...requiredProps } >
554+ Content
555+ </ TreeViewListItem >
556+ ) ;
557+
558+ const toggle = screen . getByText ( requiredProps . name ) . previousElementSibling ;
559+ expect ( toggle ) . toBeDisabled ( ) ;
560+ expect ( toggle ) . toHaveClass ( styles . modifiers . disabled ) ;
561+ } ) ;
562+
563+ test ( 'Does not render toggle span with disabled attribute when isToggleDisabled is true (toggle is span by default)' , ( ) => {
564+ render (
565+ < TreeViewListItem isToggleDisabled { ...requiredProps } >
566+ Content
567+ </ TreeViewListItem >
568+ ) ;
569+
570+ const toggle = screen . getByText ( requiredProps . name ) . previousElementSibling ;
571+ expect ( toggle ?. tagName ) . toBe ( 'SPAN' ) ;
572+ expect ( toggle ) . not . toHaveAttribute ( 'disabled' ) ;
573+ } ) ;
574+
575+ test ( 'Does not call onExpand when isToggleDisabled is true and hasCheckbox is passed' , async ( ) => {
576+ render (
577+ < TreeViewListItem hasCheckbox isToggleDisabled onExpand = { onExpandMock } { ...requiredProps } >
578+ Content
579+ </ TreeViewListItem >
580+ ) ;
581+
582+ const toggle = screen . getByText ( requiredProps . name ) . previousElementSibling ?. previousElementSibling ;
583+ await user . click ( toggle as Element ) ;
584+
585+ expect ( onExpandMock ) . not . toHaveBeenCalled ( ) ;
586+ } ) ;
587+
588+ test ( 'Does not call onCollapse when isToggleDisabled is true and hasCheckbox is passed' , async ( ) => {
589+ render (
590+ < TreeViewListItem hasCheckbox isToggleDisabled isExpanded onCollapse = { onCollapseMock } { ...requiredProps } >
591+ Content
592+ </ TreeViewListItem >
593+ ) ;
594+
595+ const toggle = screen . getByText ( requiredProps . name ) . previousElementSibling ?. previousElementSibling ;
596+ await user . click ( toggle as Element ) ;
597+
598+ expect ( onCollapseMock ) . not . toHaveBeenCalled ( ) ;
599+ } ) ;
600+
601+ test ( 'Does not call onExpand when isToggleDisabled is true and isSelectable is passed' , async ( ) => {
602+ render (
603+ < TreeViewListItem isSelectable isToggleDisabled onExpand = { onExpandMock } { ...requiredProps } >
604+ Content
605+ </ TreeViewListItem >
606+ ) ;
607+
608+ const toggle = screen . getByText ( requiredProps . name ) . previousElementSibling ;
609+ await user . click ( toggle as Element ) ;
610+
611+ expect ( onExpandMock ) . not . toHaveBeenCalled ( ) ;
612+ } ) ;
613+
614+ test ( 'Does not call onCollapse when isToggleDisabled is true and isSelectable is passed' , async ( ) => {
615+ render (
616+ < TreeViewListItem isSelectable isToggleDisabled isExpanded onCollapse = { onCollapseMock } { ...requiredProps } >
617+ Content
618+ </ TreeViewListItem >
619+ ) ;
620+
621+ const toggle = screen . getByText ( requiredProps . name ) . previousElementSibling ;
622+ await user . click ( toggle as Element ) ;
623+
624+ expect ( onCollapseMock ) . not . toHaveBeenCalled ( ) ;
625+ } ) ;
626+
627+ test ( `Renders toggle span with ${ styles . modifiers . disabled } class when isDisabled is true for default TreeViewListItem` , ( ) => {
628+ render (
629+ < TreeViewListItem isDisabled { ...requiredProps } >
630+ Content
631+ </ TreeViewListItem >
632+ ) ;
633+
634+ const toggle = screen . getByText ( requiredProps . name ) . previousElementSibling ;
635+ expect ( toggle ) . toHaveClass ( styles . modifiers . disabled ) ;
636+ } ) ;
637+
638+ test ( `Does not render toggle with ${ styles . modifiers . disabled } class when isDisabled is true and hasCheckbox is true` , ( ) => {
639+ render (
640+ < TreeViewListItem hasCheckbox isDisabled { ...requiredProps } >
641+ Content
642+ </ TreeViewListItem >
643+ ) ;
644+
645+ const toggle = screen . getByText ( requiredProps . name ) . previousElementSibling ?. previousElementSibling ;
646+ expect ( toggle ) . not . toHaveClass ( styles . modifiers . disabled ) ;
647+ } ) ;
648+
649+ test ( `Does not render toggle with ${ styles . modifiers . disabled } class when isDisabled is true and isSelectable is true` , ( ) => {
650+ render (
651+ < TreeViewListItem isSelectable isDisabled { ...requiredProps } >
652+ Content
653+ </ TreeViewListItem >
654+ ) ;
655+
656+ const toggle = screen . getByText ( requiredProps . name ) . previousElementSibling ;
657+ expect ( toggle ) . not . toHaveClass ( styles . modifiers . disabled ) ;
658+ } ) ;
659+ } ) ;
660+
418661describe ( 'Callback props' , ( ) => {
419662 const user = userEvent . setup ( ) ;
420663 const compareItemsMock = jest . fn ( ) ;
0 commit comments