@@ -395,6 +395,147 @@ describe(componentName, () => {
395395 expect ( tab . textContent ) . toEqual ( tabContent ) ;
396396 } ) ;
397397 } ) ;
398+
399+ describe ( 'enablePresence' , ( ) => {
400+ it ( 'renders tearsheet when enablePresence is true and open is true' , ( ) => {
401+ render (
402+ < Tearsheet
403+ open
404+ enablePresence
405+ title = "Test Tearsheet"
406+ closeIconDescription = "Close"
407+ >
408+ { children }
409+ </ Tearsheet >
410+ ) ;
411+ expect ( screen . getByText ( childFragment ) ) . toBeInTheDocument ( ) ;
412+ } ) ;
413+
414+ it ( 'does not render tearsheet initially when enablePresence is true and open is false' , ( ) => {
415+ render (
416+ < Tearsheet
417+ open = { false }
418+ enablePresence
419+ title = "Test Tearsheet"
420+ closeIconDescription = "Close"
421+ >
422+ { children }
423+ </ Tearsheet >
424+ ) ;
425+ expect ( screen . queryByText ( childFragment ) ) . not . toBeInTheDocument ( ) ;
426+ } ) ;
427+
428+ it ( 'removes tearsheet from DOM after closing when enablePresence is true' , async ( ) => {
429+ const { rerender } = render (
430+ < Tearsheet
431+ open
432+ enablePresence
433+ title = "Test Tearsheet"
434+ closeIconDescription = "Close"
435+ >
436+ { children }
437+ </ Tearsheet >
438+ ) ;
439+
440+ // Tearsheet should be visible
441+ expect ( screen . getByText ( childFragment ) ) . toBeInTheDocument ( ) ;
442+
443+ // Close the tearsheet
444+ rerender (
445+ < Tearsheet
446+ open = { false }
447+ enablePresence
448+ title = "Test Tearsheet"
449+ closeIconDescription = "Close"
450+ >
451+ { children }
452+ </ Tearsheet >
453+ ) ;
454+
455+ // Wait for transition to complete (using act to handle state updates)
456+ await act ( async ( ) => {
457+ // Simulate transitionend event
458+ const modal = document . querySelector ( `.${ carbon . prefix } --modal` ) ;
459+ if ( modal ) {
460+ const event = new Event ( 'transitionend' , { bubbles : true } ) ;
461+ Object . defineProperty ( event , 'target' , {
462+ value : modal . querySelector ( `.${ blockClass } __container` ) ,
463+ enumerable : true ,
464+ } ) ;
465+ Object . defineProperty ( event , 'propertyName' , {
466+ value : 'transform' ,
467+ enumerable : true ,
468+ } ) ;
469+ modal . dispatchEvent ( event ) ;
470+ }
471+ // Small delay to allow state updates
472+ await new Promise ( ( resolve ) => setTimeout ( resolve , 50 ) ) ;
473+ } ) ;
474+
475+ // Tearsheet should be removed from DOM
476+ expect ( screen . queryByText ( childFragment ) ) . not . toBeInTheDocument ( ) ;
477+ } ) ;
478+
479+ it ( 'keeps tearsheet in DOM when enablePresence is false (default behavior)' , async ( ) => {
480+ const { rerender } = render (
481+ < Tearsheet open title = "Test Tearsheet" closeIconDescription = "Close" >
482+ { children }
483+ </ Tearsheet >
484+ ) ;
485+
486+ // Tearsheet should be visible
487+ expect ( screen . getByText ( childFragment ) ) . toBeInTheDocument ( ) ;
488+
489+ // Close the tearsheet
490+ rerender (
491+ < Tearsheet
492+ open = { false }
493+ title = "Test Tearsheet"
494+ closeIconDescription = "Close"
495+ >
496+ { children }
497+ </ Tearsheet >
498+ ) ;
499+
500+ // Tearsheet should still be in DOM (just hidden)
501+ await act ( async ( ) => {
502+ await new Promise ( ( resolve ) => setTimeout ( resolve , 50 ) ) ;
503+ } ) ;
504+
505+ // With enablePresence=false, the modal stays in DOM
506+ const modal = document . querySelector ( `.${ carbon . prefix } --modal` ) ;
507+ expect ( modal ) . toBeInTheDocument ( ) ;
508+ } ) ;
509+
510+ it ( 'delays opening animation when enablePresence is true' , async ( ) => {
511+ jest . useFakeTimers ( ) ;
512+
513+ render (
514+ < Tearsheet
515+ open
516+ enablePresence
517+ title = "Test Tearsheet"
518+ closeIconDescription = "Close"
519+ >
520+ { children }
521+ </ Tearsheet >
522+ ) ;
523+
524+ // Initially, the modal might not be fully open due to the delay
525+ const modal = document . querySelector ( `.${ carbon . prefix } --modal` ) ;
526+ expect ( modal ) . toBeInTheDocument ( ) ;
527+
528+ // Fast-forward time to trigger the delayed open
529+ act ( ( ) => {
530+ jest . advanceTimersByTime ( 20 ) ;
531+ } ) ;
532+
533+ // Now the modal should be fully open
534+ expect ( screen . getByText ( childFragment ) ) . toBeInTheDocument ( ) ;
535+
536+ jest . useRealTimers ( ) ;
537+ } ) ;
538+ } ) ;
398539} ) ;
399540
400541describe ( componentNameNarrow , ( ) => {
@@ -403,6 +544,71 @@ describe(componentNameNarrow, () => {
403544 } ) ;
404545
405546 commonTests ( TearsheetNarrow , componentNameNarrow , { } , true ) ;
547+
548+ describe ( 'enablePresence' , ( ) => {
549+ it ( 'renders narrow tearsheet when enablePresence is true and open is true' , ( ) => {
550+ render (
551+ < TearsheetNarrow
552+ open
553+ enablePresence
554+ title = "Test Narrow Tearsheet"
555+ closeIconDescription = "Close"
556+ >
557+ { children }
558+ </ TearsheetNarrow >
559+ ) ;
560+ expect ( screen . getByText ( childFragment ) ) . toBeInTheDocument ( ) ;
561+ } ) ;
562+
563+ it ( 'removes narrow tearsheet from DOM after closing when enablePresence is true' , async ( ) => {
564+ const { rerender } = render (
565+ < TearsheetNarrow
566+ open
567+ enablePresence
568+ title = "Test Narrow Tearsheet"
569+ closeIconDescription = "Close"
570+ >
571+ { children }
572+ </ TearsheetNarrow >
573+ ) ;
574+
575+ // Tearsheet should be visible
576+ expect ( screen . getByText ( childFragment ) ) . toBeInTheDocument ( ) ;
577+
578+ // Close the tearsheet
579+ rerender (
580+ < TearsheetNarrow
581+ open = { false }
582+ enablePresence
583+ title = "Test Narrow Tearsheet"
584+ closeIconDescription = "Close"
585+ >
586+ { children }
587+ </ TearsheetNarrow >
588+ ) ;
589+
590+ // Wait for transition to complete
591+ await act ( async ( ) => {
592+ const modal = document . querySelector ( `.${ carbon . prefix } --modal` ) ;
593+ if ( modal ) {
594+ const event = new Event ( 'transitionend' , { bubbles : true } ) ;
595+ Object . defineProperty ( event , 'target' , {
596+ value : modal . querySelector ( `.${ blockClass } __container` ) ,
597+ enumerable : true ,
598+ } ) ;
599+ Object . defineProperty ( event , 'propertyName' , {
600+ value : 'transform' ,
601+ enumerable : true ,
602+ } ) ;
603+ modal . dispatchEvent ( event ) ;
604+ }
605+ await new Promise ( ( resolve ) => setTimeout ( resolve , 50 ) ) ;
606+ } ) ;
607+
608+ // Tearsheet should be removed from DOM
609+ expect ( screen . queryByText ( childFragment ) ) . not . toBeInTheDocument ( ) ;
610+ } ) ;
611+ } ) ;
406612} ) ;
407613
408614describe ( componentNameCreateNarrow , ( ) => {
0 commit comments