@@ -8,29 +8,10 @@ import {PositionedOverlay} from '../../../../PositionedOverlay';
88import { PopoverOverlay } from '../PopoverOverlay' ;
99import { Popover } from '../../../Popover' ;
1010
11- interface HandlerMap {
12- [ eventName : string ] : ( event : any ) => void ;
13- }
14-
15- const listenerMap : HandlerMap = { } ;
16-
1711describe ( '<PopoverOverlay />' , ( ) => {
18- let addEventListener : jest . SpyInstance ;
19- let removeEventListener : jest . SpyInstance ;
20-
2112 let rafSpy : jest . SpyInstance ;
2213
2314 beforeEach ( ( ) => {
24- addEventListener = jest . spyOn ( document , 'addEventListener' ) ;
25- addEventListener . mockImplementation ( ( event , callback ) => {
26- listenerMap [ event ] = callback ;
27- } ) ;
28-
29- removeEventListener = jest . spyOn ( document , 'removeEventListener' ) ;
30- removeEventListener . mockImplementation ( ( event ) => {
31- listenerMap [ event ] = noop ;
32- } ) ;
33-
3415 rafSpy = jest . spyOn ( window , 'requestAnimationFrame' ) ;
3516 rafSpy . mockImplementation ( ( callback ) => callback ( ) ) ;
3617 } ) ;
@@ -40,9 +21,6 @@ describe('<PopoverOverlay />', () => {
4021 ( document . activeElement as HTMLElement ) . blur ( ) ;
4122 }
4223
43- addEventListener . mockRestore ( ) ;
44- removeEventListener . mockRestore ( ) ;
45-
4624 rafSpy . mockRestore ( ) ;
4725 } ) ;
4826
@@ -204,24 +182,6 @@ describe('<PopoverOverlay />', () => {
204182 } ) ;
205183 } ) ;
206184
207- it ( 'calls the onClose callback when the escape key is pressed' , ( ) => {
208- const spy = jest . fn ( ) ;
209-
210- mountWithApp (
211- < PopoverOverlay
212- active
213- id = "PopoverOverlay-1"
214- activator = { activator }
215- onClose = { spy }
216- >
217- { children }
218- </ PopoverOverlay > ,
219- ) ;
220-
221- listenerMap . keyup ( { keyCode : Key . Escape } ) ;
222- expect ( spy ) . toHaveBeenCalledTimes ( 1 ) ;
223- } ) ;
224-
225185 it ( 'does not call the onClose callback when a descendent HTMLElement is clicked' , ( ) => {
226186 const spy = jest . fn ( ) ;
227187
@@ -316,6 +276,77 @@ describe('<PopoverOverlay />', () => {
316276 expect ( spy ) . not . toHaveBeenCalled ( ) ;
317277 } ) ;
318278
279+ describe ( 'when the Escape key is pressed' , ( ) => {
280+ it ( 'calls the onClose callback if event target is descendant' , ( ) => {
281+ const spy = jest . fn ( ) ;
282+
283+ const popoverOverlay = mountWithApp (
284+ < PopoverOverlay
285+ active
286+ id = "PopoverOverlay-1"
287+ activator = { activator }
288+ onClose = { spy }
289+ >
290+ < TextField
291+ label = "Store name"
292+ value = "Click me"
293+ onChange = { ( ) => { } }
294+ autoComplete = "off"
295+ />
296+ </ PopoverOverlay > ,
297+ ) ;
298+
299+ const target = popoverOverlay . find ( TextField ) ! . find ( 'input' ) ! . domNode ! ;
300+ triggerEscape ( target ) ;
301+
302+ expect ( spy ) . toHaveBeenCalledTimes ( 1 ) ;
303+ } ) ;
304+
305+ it ( 'calls the onClose callback if event target is activator descendant' , ( ) => {
306+ const spy = jest . fn ( ) ;
307+
308+ const popoverOverlay = mountWithApp (
309+ < PopoverOverlay
310+ active
311+ id = "PopoverOverlay-1"
312+ activator = { activator }
313+ onClose = { spy }
314+ >
315+ < TextField
316+ label = "Store name"
317+ value = "Click me"
318+ onChange = { ( ) => { } }
319+ autoComplete = "off"
320+ />
321+ </ PopoverOverlay > ,
322+ ) ;
323+
324+ const target = popoverOverlay . find ( TextField ) ! . find ( 'input' ) ! . domNode ! ;
325+ triggerEscape ( target ) ;
326+
327+ expect ( spy ) . toHaveBeenCalledTimes ( 1 ) ;
328+ } ) ;
329+
330+ it ( 'does not call the onClose callback if event target is not descendant or activator descendant' , ( ) => {
331+ const spy = jest . fn ( ) ;
332+
333+ mountWithApp (
334+ < PopoverOverlay
335+ active
336+ id = "PopoverOverlay-1"
337+ activator = { activator }
338+ onClose = { spy }
339+ >
340+ { children }
341+ </ PopoverOverlay > ,
342+ ) ;
343+
344+ triggerEscape ( ) ;
345+
346+ expect ( spy ) . toHaveBeenCalledTimes ( 0 ) ;
347+ } ) ;
348+ } ) ;
349+
319350 describe ( 'deleting descendant elements' , ( ) => {
320351 const DeleteButton = ( ) => {
321352 const [ show , setShow ] = React . useState ( true ) ;
@@ -567,3 +598,12 @@ describe('<PopoverOverlay />', () => {
567598} ) ;
568599
569600function noop ( ) { }
601+
602+ function triggerEscape ( target ?: Element ) {
603+ const keyupEvent = new KeyboardEvent ( 'keyup' , {
604+ keyCode : Key . Escape ,
605+ bubbles : true ,
606+ } ) ;
607+
608+ ( target || document ) . dispatchEvent ( keyupEvent ) ;
609+ }
0 commit comments