From a54aff588b56751703731db6dde5fb0b558aae4e Mon Sep 17 00:00:00 2001 From: Pranay Kothapalli Date: Wed, 24 Jun 2026 12:20:12 +0530 Subject: [PATCH 1/2] test(DropdownMenu): cover mixed pointer and keyboard selection paths --- .../DropdownMenu.hybridInteraction.test.tsx | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/components/ui/DropdownMenu/tests/DropdownMenu.hybridInteraction.test.tsx diff --git a/src/components/ui/DropdownMenu/tests/DropdownMenu.hybridInteraction.test.tsx b/src/components/ui/DropdownMenu/tests/DropdownMenu.hybridInteraction.test.tsx new file mode 100644 index 000000000..0a7f791ac --- /dev/null +++ b/src/components/ui/DropdownMenu/tests/DropdownMenu.hybridInteraction.test.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import DropdownMenu from '../DropdownMenu'; + +describe('DropdownMenu hybrid interaction', () => { + const menu = () => ( + + Open + + + One + Two + Three + + + + ); + + test('pointer open then keyboard navigation selects item', async() => { + const user = userEvent.setup(); + render(menu()); + + await user.click(screen.getByText('Open')); + await user.keyboard('{ArrowDown}{ArrowDown}{Enter}'); + + await waitFor(() => expect(screen.queryByText('One')).not.toBeInTheDocument()); + expect(screen.getByText('Open')).toHaveFocus(); + }); + + test('keyboard open then pointer click selects item', async() => { + const user = userEvent.setup(); + render(menu()); + + const trigger = screen.getByText('Open'); + trigger.focus(); + await user.keyboard('{ArrowDown}'); + + await waitFor(() => expect(screen.getByText('One')).toBeInTheDocument()); + + await user.click(screen.getByText('Three')); + await waitFor(() => expect(screen.queryByText('Three')).not.toBeInTheDocument()); + expect(trigger).toHaveFocus(); + }); +}); From d01f1bc6f5bc39329633afb7eb8bbbdb27a77641 Mon Sep 17 00:00:00 2001 From: Pranay Kothapalli Date: Wed, 24 Jun 2026 16:22:28 +0530 Subject: [PATCH 2/2] test(DropdownMenu): wait for focus in hybrid interaction tests --- .../tests/DropdownMenu.hybridInteraction.test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ui/DropdownMenu/tests/DropdownMenu.hybridInteraction.test.tsx b/src/components/ui/DropdownMenu/tests/DropdownMenu.hybridInteraction.test.tsx index 0a7f791ac..1d9701ac1 100644 --- a/src/components/ui/DropdownMenu/tests/DropdownMenu.hybridInteraction.test.tsx +++ b/src/components/ui/DropdownMenu/tests/DropdownMenu.hybridInteraction.test.tsx @@ -25,7 +25,7 @@ describe('DropdownMenu hybrid interaction', () => { await user.keyboard('{ArrowDown}{ArrowDown}{Enter}'); await waitFor(() => expect(screen.queryByText('One')).not.toBeInTheDocument()); - expect(screen.getByText('Open')).toHaveFocus(); + await waitFor(() => expect(screen.getByText('Open')).toHaveFocus()); }); test('keyboard open then pointer click selects item', async() => { @@ -40,6 +40,6 @@ describe('DropdownMenu hybrid interaction', () => { await user.click(screen.getByText('Three')); await waitFor(() => expect(screen.queryByText('Three')).not.toBeInTheDocument()); - expect(trigger).toHaveFocus(); + await waitFor(() => expect(trigger).toHaveFocus()); }); });