11import React , { useState } from 'react' ;
2- import propTypes from 'prop-types' ;
32
43import { render , screen , waitFor } from '@testing-library/react' ;
54import userEvent from '@testing-library/user-event' ;
@@ -26,6 +25,9 @@ const elements = {
2625 drawerThreeToggleVisibilityButton : {
2726 get : ( ) => screen . getByRole ( 'button' , { name : / t o g g l e v i s i b i l i t y d r a w e r T h r e e / } ) ,
2827 } ,
28+ drawerFourToggleVisibilityButton : {
29+ get : ( ) => screen . getByRole ( 'button' , { name : / t o g g l e v i s i b i l i t y d r a w e r F o u r / } ) ,
30+ } ,
2931} ;
3032
3133function SetupDrawerWithChildren ( props ) {
@@ -40,14 +42,23 @@ function SetupDrawerWithChildren(props) {
4042 ) ;
4143}
4244
45+ interface SetupMultipleDrawersProps {
46+ drawerOneVisibleDefault ?: boolean
47+ drawerTwoVisibleDefault ?: boolean ,
48+ drawerThreeVisibleDefault ?: boolean
49+ drawerFourVisibleDefault ?: boolean ,
50+ }
51+
4352function SetupMultipleDrawers ( {
44- drawerOneVisibleDefault,
45- drawerTwoVisibleDefault,
46- drawerThreeVisibleDefault,
47- } ) {
53+ drawerOneVisibleDefault = false ,
54+ drawerTwoVisibleDefault = false ,
55+ drawerThreeVisibleDefault = false ,
56+ drawerFourVisibleDefault = false ,
57+ } : SetupMultipleDrawersProps ) {
4858 const [ isDrawerOneVisible , setIsDrawerOneVisible ] = useState ( drawerOneVisibleDefault ) ;
4959 const [ isDrawerTwoVisible , setIsDrawerTwoVisible ] = useState ( drawerTwoVisibleDefault ) ;
5060 const [ isDrawerThreeVisible , setIsDrawerThreeVisible ] = useState ( drawerThreeVisibleDefault ) ;
61+ const [ isDrawerFourVisible , setIsDrawerFourVisible ] = useState ( drawerFourVisibleDefault ) ;
5162
5263 return (
5364 < div >
@@ -72,6 +83,13 @@ function SetupMultipleDrawers({
7283 toggle visibility drawerThree
7384 </ button >
7485
86+ < button
87+ type = "button"
88+ onClick = { ( ) => setIsDrawerFourVisible ( ( prevState ) => ! prevState ) }
89+ >
90+ toggle visibility drawerFour
91+ </ button >
92+
7593 < Drawer
7694 visible = { isDrawerOneVisible }
7795 onRequestClose = { ( ) => setIsDrawerOneVisible ( false ) }
@@ -90,22 +108,20 @@ function SetupMultipleDrawers({
90108 >
91109 < div > childrenDrawerThree</ div >
92110 </ Drawer >
111+
112+ { /* Testing what happens when drawer unmounts */ }
113+ { isDrawerFourVisible && (
114+ < Drawer
115+ visible = { isDrawerFourVisible }
116+ onRequestClose = { ( ) => setIsDrawerThreeVisible ( false ) }
117+ >
118+ < div > childrenDrawerFour</ div >
119+ </ Drawer >
120+ ) }
93121 </ div >
94122 ) ;
95123}
96124
97- SetupMultipleDrawers . propTypes = {
98- drawerOneVisibleDefault : propTypes . bool ,
99- drawerThreeVisibleDefault : propTypes . bool ,
100- drawerTwoVisibleDefault : propTypes . bool ,
101- } ;
102-
103- SetupMultipleDrawers . defaultProps = {
104- drawerOneVisibleDefault : false ,
105- drawerTwoVisibleDefault : false ,
106- drawerThreeVisibleDefault : false ,
107- } ;
108-
109125describe ( 'Drawer' , ( ) => {
110126 beforeEach ( ( ) => {
111127 // Need to manually clean classList on body since jsdom instance can stay
@@ -270,5 +286,19 @@ describe('Drawer', () => {
270286 } ) ;
271287 } ) ;
272288 } ) ;
289+
290+ describe ( 'when user unmounts the drawer that is open (e.g navigation to a different page)' , ( ) => {
291+ it ( 'body tag does not have Drawer--open' , async ( ) => {
292+ const { container } = render ( < SetupMultipleDrawers drawerFourVisibleDefault /> ) ;
293+
294+ userEvent . click ( elements . drawerFourToggleVisibilityButton . get ( ) ) ;
295+
296+ const body = container . closest ( 'body' ) ;
297+
298+ await waitFor ( ( ) => {
299+ expect ( body ?. classList ) . not . toContain ( 'Drawer--open' ) ;
300+ } ) ;
301+ } ) ;
302+ } ) ;
273303 } ) ;
274304} ) ;
0 commit comments