1
1
import React , { useState } from 'react' ;
2
- import propTypes from 'prop-types' ;
3
2
4
3
import { render , screen , waitFor } from '@testing-library/react' ;
5
4
import userEvent from '@testing-library/user-event' ;
@@ -26,6 +25,9 @@ const elements = {
26
25
drawerThreeToggleVisibilityButton : {
27
26
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 / } ) ,
28
27
} ,
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
+ } ,
29
31
} ;
30
32
31
33
function SetupDrawerWithChildren ( props ) {
@@ -40,14 +42,23 @@ function SetupDrawerWithChildren(props) {
40
42
) ;
41
43
}
42
44
45
+ interface SetupMultipleDrawersProps {
46
+ drawerOneVisibleDefault ?: boolean
47
+ drawerTwoVisibleDefault ?: boolean ,
48
+ drawerThreeVisibleDefault ?: boolean
49
+ drawerFourVisibleDefault ?: boolean ,
50
+ }
51
+
43
52
function SetupMultipleDrawers ( {
44
- drawerOneVisibleDefault,
45
- drawerTwoVisibleDefault,
46
- drawerThreeVisibleDefault,
47
- } ) {
53
+ drawerOneVisibleDefault = false ,
54
+ drawerTwoVisibleDefault = false ,
55
+ drawerThreeVisibleDefault = false ,
56
+ drawerFourVisibleDefault = false ,
57
+ } : SetupMultipleDrawersProps ) {
48
58
const [ isDrawerOneVisible , setIsDrawerOneVisible ] = useState ( drawerOneVisibleDefault ) ;
49
59
const [ isDrawerTwoVisible , setIsDrawerTwoVisible ] = useState ( drawerTwoVisibleDefault ) ;
50
60
const [ isDrawerThreeVisible , setIsDrawerThreeVisible ] = useState ( drawerThreeVisibleDefault ) ;
61
+ const [ isDrawerFourVisible , setIsDrawerFourVisible ] = useState ( drawerFourVisibleDefault ) ;
51
62
52
63
return (
53
64
< div >
@@ -72,6 +83,13 @@ function SetupMultipleDrawers({
72
83
toggle visibility drawerThree
73
84
</ button >
74
85
86
+ < button
87
+ type = "button"
88
+ onClick = { ( ) => setIsDrawerFourVisible ( ( prevState ) => ! prevState ) }
89
+ >
90
+ toggle visibility drawerFour
91
+ </ button >
92
+
75
93
< Drawer
76
94
visible = { isDrawerOneVisible }
77
95
onRequestClose = { ( ) => setIsDrawerOneVisible ( false ) }
@@ -90,22 +108,20 @@ function SetupMultipleDrawers({
90
108
>
91
109
< div > childrenDrawerThree</ div >
92
110
</ 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
+ ) }
93
121
</ div >
94
122
) ;
95
123
}
96
124
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
-
109
125
describe ( 'Drawer' , ( ) => {
110
126
beforeEach ( ( ) => {
111
127
// Need to manually clean classList on body since jsdom instance can stay
@@ -270,5 +286,19 @@ describe('Drawer', () => {
270
286
} ) ;
271
287
} ) ;
272
288
} ) ;
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
+ } ) ;
273
303
} ) ;
274
304
} ) ;
0 commit comments