From 18afd2131247de2c62308588c8999770eff41bdc Mon Sep 17 00:00:00 2001 From: Pranay Kothapalli Date: Wed, 24 Jun 2026 12:20:01 +0530 Subject: [PATCH 1/2] test(Popover): cover mixed pointer and keyboard interaction paths --- .../tests/Popover.hybridInteraction.test.tsx | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/components/ui/Popover/tests/Popover.hybridInteraction.test.tsx diff --git a/src/components/ui/Popover/tests/Popover.hybridInteraction.test.tsx b/src/components/ui/Popover/tests/Popover.hybridInteraction.test.tsx new file mode 100644 index 000000000..6d66a4427 --- /dev/null +++ b/src/components/ui/Popover/tests/Popover.hybridInteraction.test.tsx @@ -0,0 +1,71 @@ +import React from 'react'; +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import Popover from '../Popover'; +import Theme from '~/components/ui/Theme/Theme'; + +const mockMatchMedia = () => { + if ('matchMedia' in window && typeof window.matchMedia === 'function') return; + Object.defineProperty(window, 'matchMedia', { + writable: true, + value: jest.fn().mockImplementation(() => ({ + matches: false, + addEventListener: jest.fn(), + removeEventListener: jest.fn() + })) + }); +}; + +describe('Popover hybrid interaction', () => { + beforeEach(() => mockMatchMedia()); + + test('pointer open then escape closes popover', async() => { + const user = userEvent.setup(); + render( + + + Open + + + + + + + + ); + + const trigger = screen.getByText('Open'); + await user.click(trigger); + expect(screen.getByRole('dialog')).toBeInTheDocument(); + + await user.keyboard('{Escape}'); + await waitFor(() => expect(screen.queryByRole('dialog')).toBeNull()); + expect(trigger).toHaveFocus(); + }); + + test('keyboard open via Space then pointer click on close dismisses', async() => { + const user = userEvent.setup(); + render( + + + Open + + + Body + Close + + + + + ); + + const trigger = screen.getByText('Open'); + trigger.focus(); + await user.keyboard(' '); + + await waitFor(() => expect(screen.getByRole('dialog')).toBeInTheDocument()); + + await user.click(screen.getByText('Close')); + await waitFor(() => expect(screen.queryByRole('dialog')).toBeNull()); + }); +}); From 0d103142c1d98be4bc76f07b0cd0446bf224daa7 Mon Sep 17 00:00:00 2001 From: Pranay Kothapalli Date: Wed, 24 Jun 2026 16:22:20 +0530 Subject: [PATCH 2/2] test(Popover): wait for focus after escape in hybrid test --- .../ui/Popover/tests/Popover.hybridInteraction.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ui/Popover/tests/Popover.hybridInteraction.test.tsx b/src/components/ui/Popover/tests/Popover.hybridInteraction.test.tsx index 6d66a4427..38c0696cd 100644 --- a/src/components/ui/Popover/tests/Popover.hybridInteraction.test.tsx +++ b/src/components/ui/Popover/tests/Popover.hybridInteraction.test.tsx @@ -40,7 +40,7 @@ describe('Popover hybrid interaction', () => { await user.keyboard('{Escape}'); await waitFor(() => expect(screen.queryByRole('dialog')).toBeNull()); - expect(trigger).toHaveFocus(); + await waitFor(() => expect(trigger).toHaveFocus()); }); test('keyboard open via Space then pointer click on close dismisses', async() => {