@@ -18,6 +18,13 @@ const Simulate = TestUtils.Simulate;
18
18
19
19
20
20
describe ( 'Modal' , ( ) => {
21
+ afterEach ( 'check if test cleaned up rendered modals' , ( ) => {
22
+ const overlay = document . querySelectorAll ( '.ReactModal__Overlay' ) ;
23
+ const content = document . querySelectorAll ( '.ReactModal__Content' ) ;
24
+ expect ( overlay . length ) . toBe ( 0 ) ;
25
+ expect ( content . length ) . toBe ( 0 ) ;
26
+ } ) ;
27
+
21
28
it ( 'scopes tab navigation to the modal' ) ;
22
29
it ( 'focuses the last focused element when tabbing in from browser chrome' ) ;
23
30
@@ -115,6 +122,7 @@ describe('Modal', () => {
115
122
const modal = renderModal ( {
116
123
isOpen : true ,
117
124
onRequestClose ( ) {
125
+ unmountModal ( ) ;
118
126
unmountModal ( ) ;
119
127
done ( ) ;
120
128
}
@@ -175,6 +183,7 @@ describe('Modal', () => {
175
183
preventDefault ( ) { tabPrevented = true ; }
176
184
} ) ;
177
185
expect ( tabPrevented ) . toEqual ( true ) ;
186
+ unmountModal ( ) ;
178
187
} ) ;
179
188
180
189
it ( 'supports portalClassName' , ( ) => {
@@ -204,26 +213,31 @@ describe('Modal', () => {
204
213
it ( 'overrides the default styles when a custom overlayClassName is used' , ( ) => {
205
214
const modal = renderModal ( { isOpen : true , overlayClassName : 'myOverlayClass' } ) ;
206
215
expect ( modal . portal . overlay . style . backgroundColor ) . toEqual ( '' ) ;
216
+ unmountModal ( ) ;
207
217
} ) ;
208
218
209
219
it ( 'supports adding style to the modal contents' , ( ) => {
210
220
const modal = renderModal ( { isOpen : true , style : { content : { width : '20px' } } } ) ;
211
221
expect ( modal . portal . content . style . width ) . toEqual ( '20px' ) ;
222
+ unmountModal ( ) ;
212
223
} ) ;
213
224
214
225
it ( 'supports overriding style on the modal contents' , ( ) => {
215
226
const modal = renderModal ( { isOpen : true , style : { content : { position : 'static' } } } ) ;
216
227
expect ( modal . portal . content . style . position ) . toEqual ( 'static' ) ;
228
+ unmountModal ( ) ;
217
229
} ) ;
218
230
219
231
it ( 'supports adding style on the modal overlay' , ( ) => {
220
232
const modal = renderModal ( { isOpen : true , style : { overlay : { width : '75px' } } } ) ;
221
233
expect ( modal . portal . overlay . style . width ) . toEqual ( '75px' ) ;
234
+ unmountModal ( ) ;
222
235
} ) ;
223
236
224
237
it ( 'supports overriding style on the modal overlay' , ( ) => {
225
238
const modal = renderModal ( { isOpen : true , style : { overlay : { position : 'static' } } } ) ;
226
239
expect ( modal . portal . overlay . style . position ) . toEqual ( 'static' ) ;
240
+ unmountModal ( ) ;
227
241
} ) ;
228
242
229
243
it ( 'supports overriding the default styles' , ( ) => {
@@ -234,14 +248,17 @@ describe('Modal', () => {
234
248
const modal = renderModal ( { isOpen : true } ) ;
235
249
expect ( modal . portal . content . style . position ) . toEqual ( newStyle ) ;
236
250
Modal . defaultStyles . content . position = previousStyle ;
251
+ unmountModal ( ) ;
237
252
} ) ;
238
253
239
254
it ( 'adds class to body when open' , ( ) => {
240
255
renderModal ( { isOpen : false } ) ;
241
256
expect ( document . body . className . indexOf ( 'ReactModal__Body--open' ) !== - 1 ) . toEqual ( false ) ;
257
+ unmountModal ( ) ;
242
258
243
259
renderModal ( { isOpen : true } ) ;
244
260
expect ( document . body . className . indexOf ( 'ReactModal__Body--open' ) !== - 1 ) . toEqual ( true ) ;
261
+ unmountModal ( ) ;
245
262
246
263
renderModal ( { isOpen : false } ) ;
247
264
expect ( document . body . className . indexOf ( 'ReactModal__Body--open' ) !== - 1 ) . toEqual ( false ) ;
@@ -323,6 +340,7 @@ describe('Modal', () => {
323
340
expect ( event ) . toBeTruthy ( ) ;
324
341
expect ( event . constructor ) . toBeTruthy ( ) ;
325
342
expect ( event . key ) . toEqual ( 'FakeKeyToTestLater' ) ;
343
+ unmountModal ( ) ;
326
344
} ) ;
327
345
328
346
describe ( 'should close on overlay click' , ( ) => {
@@ -455,26 +473,50 @@ describe('Modal', () => {
455
473
} ) ;
456
474
} ) ;
457
475
458
- // it('adds --before-close for animations', function() {
459
- // var node = document.createElement('div');
460
-
461
- // var component = ReactDOM.render(React.createElement(Modal, {
462
- // isOpen: true,
463
- // ariaHideApp: false,
464
- // closeTimeoutMS: 50,
465
- // }), node);
466
-
467
- // component = ReactDOM.render(React.createElement(Modal, {
468
- // isOpen: false,
469
- // ariaHideApp: false,
470
- // closeTimeoutMS: 50,
471
- // }), node);
472
-
473
- // It can't find these nodes, I didn't spend much time on this
474
- // var overlay = document.querySelector('.ReactModal__Overlay');
475
- // var content = document.querySelector('.ReactModal__Content');
476
- // ok(overlay.className.match(/ReactModal__Overlay--before-close/));
477
- // ok(content.className.match(/ReactModal__Content--before-close/));
478
- // unmountModal();
479
- // });
476
+ it ( 'adds --before-close for animations' , ( ) => {
477
+ const closeTimeoutMS = 50 ;
478
+ const modal = renderModal ( {
479
+ isOpen : true ,
480
+ closeTimeoutMS
481
+ } ) ;
482
+
483
+ modal . portal . closeWithTimeout ( ) ;
484
+
485
+ const overlay = TestUtils . findRenderedDOMComponentWithClass ( modal . portal , 'ReactModal__Overlay' ) ;
486
+ const content = TestUtils . findRenderedDOMComponentWithClass ( modal . portal , 'ReactModal__Content' ) ;
487
+
488
+ expect ( / R e a c t M o d a l _ _ O v e r l a y - - b e f o r e - c l o s e / . test ( overlay . className ) ) . toBe ( true ) ;
489
+ expect ( / R e a c t M o d a l _ _ C o n t e n t - - b e f o r e - c l o s e / . test ( content . className ) ) . toBe ( true ) ;
490
+
491
+ modal . portal . closeWithoutTimeout ( ) ;
492
+ unmountModal ( ) ;
493
+ } ) ;
494
+
495
+ it ( 'keeps the modal in the DOM until closeTimeoutMS elapses' , ( done ) => {
496
+ const closeTimeoutMS = 50 ;
497
+
498
+ renderModal ( {
499
+ isOpen : true ,
500
+ closeTimeoutMS
501
+ } ) ;
502
+
503
+ unmountModal ( ) ;
504
+
505
+ const checkDOM = ( expectMounted ) => {
506
+ const overlay = document . querySelectorAll ( '.ReactModal__Overlay' ) ;
507
+ const content = document . querySelectorAll ( '.ReactModal__Content' ) ;
508
+ const numNodes = expectMounted ? 1 : 0 ;
509
+ expect ( overlay . length ) . toBe ( numNodes ) ;
510
+ expect ( content . length ) . toBe ( numNodes ) ;
511
+ } ;
512
+
513
+ // content is still mounted after modal is gone
514
+ checkDOM ( true ) ;
515
+
516
+ setTimeout ( ( ) => {
517
+ // content is unmounted after specified timeout
518
+ checkDOM ( false ) ;
519
+ done ( ) ;
520
+ } , closeTimeoutMS ) ;
521
+ } ) ;
480
522
} ) ;
0 commit comments