Skip to content

Commit 03f1c2c

Browse files
committed
add Popover tests
1 parent 2c42b9e commit 03f1c2c

File tree

1 file changed

+80
-40
lines changed

1 file changed

+80
-40
lines changed

polaris-react/src/components/Popover/components/PopoverOverlay/tests/PopoverOverlay.test.tsx

Lines changed: 80 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,10 @@ import {PositionedOverlay} from '../../../../PositionedOverlay';
88
import {PopoverOverlay} from '../PopoverOverlay';
99
import {Popover} from '../../../Popover';
1010

11-
interface HandlerMap {
12-
[eventName: string]: (event: any) => void;
13-
}
14-
15-
const listenerMap: HandlerMap = {};
16-
1711
describe('<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

569600
function 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

Comments
 (0)