diff --git a/src/ux-components/intercept-overlay/intercept-overlay.spec.js b/src/ux-components/intercept-overlay/intercept-overlay.spec.js index f3854a47a..0a282b93d 100644 --- a/src/ux-components/intercept-overlay/intercept-overlay.spec.js +++ b/src/ux-components/intercept-overlay/intercept-overlay.spec.js @@ -14,4 +14,33 @@ describe("intercept-overlay.vue", () => { expect(wrapper.text()).toBe(""); wrapper.unmount(); }); + + describe("keyboard interception", () => { + test("adds a capturing keydown listener on mount and removes it on unmount", () => { + const addSpy = jest.spyOn(document, "addEventListener"); + const removeSpy = jest.spyOn(document, "removeEventListener"); + + const wrapper = shallowMount(interceptOverlay); + expect(addSpy).toHaveBeenCalledWith("keydown", expect.any(Function), true); + + const [, handler] = addSpy.mock.calls.find( + ([type, , capture]) => type === "keydown" && capture === true + ); + + wrapper.unmount(); + expect(removeSpy).toHaveBeenCalledWith("keydown", handler, true); + + addSpy.mockRestore(); + removeSpy.mockRestore(); + }); + + test("blockKey prevents default and stops immediate propagation", () => { + const wrapper = shallowMount(interceptOverlay); + const event = { preventDefault: jest.fn(), stopImmediatePropagation: jest.fn() }; + wrapper.vm.blockKey(event); + expect(event.preventDefault).toHaveBeenCalled(); + expect(event.stopImmediatePropagation).toHaveBeenCalled(); + wrapper.unmount(); + }); + }); }); diff --git a/src/ux-components/intercept-overlay/intercept-overlay.vue b/src/ux-components/intercept-overlay/intercept-overlay.vue index 1a101589a..1269ccb9d 100644 --- a/src/ux-components/intercept-overlay/intercept-overlay.vue +++ b/src/ux-components/intercept-overlay/intercept-overlay.vue @@ -1,10 +1,22 @@