import type {ComponentProps} from 'react'; import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import DeprecatedDropdownMenu from 'sentry/components/deprecatedDropdownMenu'; describe('dropdownMenuDeprecated', function () { function DeprecatedDropdownImplementation( props: Partial> = {} ) { return ( {({getRootProps, getActorProps, getMenuProps, isOpen}) => ( {isOpen && (
  • Dropdown Menu Item 1
)}
)}
); } it('renders', function () { render(); }); it('can toggle dropdown menu with actor', async function () { render(); await userEvent.click(screen.getByRole('button')); expect(screen.getByRole('listbox')).toBeInTheDocument(); await userEvent.click(screen.getByRole('button')); expect(screen.queryByRole('listbox')).not.toBeInTheDocument(); }); it('closes dropdown when clicking on anything in menu', async function () { render(); await userEvent.click(screen.getByRole('button')); await userEvent.click(screen.getByRole('listitem')); expect(screen.queryByRole('listbox')).not.toBeInTheDocument(); }); it('closes dropdown when clicking outside of menu', async function () { render(
); await userEvent.click(screen.getByRole('button')); await userEvent.click(screen.getByTestId('outside-element')); expect(screen.queryByRole('listbox')).not.toBeInTheDocument(); }); it('closes dropdown when pressing escape', async function () { render(); await userEvent.click(screen.getByRole('button')); await userEvent.keyboard('{Escape}'); expect(screen.queryByRole('listbox')).not.toBeInTheDocument(); }); it('ignores "Escape" key if `closeOnEscape` is false', async function () { render(); await userEvent.click(screen.getByRole('button')); await userEvent.keyboard('{Escape}'); expect(screen.getByRole('listbox')).toBeInTheDocument(); }); it('keeps dropdown open when clicking on anything in menu with `keepMenuOpen` prop', async function () { render(); await userEvent.click(screen.getByRole('button')); await userEvent.click(screen.getByRole('listitem')); expect(screen.getByRole('listbox')).toBeInTheDocument(); }); it('render prop getters all extend props and call original onClick handlers', async function () { const rootClick = jest.fn(); const actorClick = jest.fn(); const menuClick = jest.fn(); render( {({getRootProps, getActorProps, getMenuProps, isOpen}) => ( {isOpen && (
  • Dropdown Menu Item 1
)}
)}
); expect(screen.queryByRole('listbox')).not.toBeInTheDocument(); await userEvent.click(screen.getByTestId('root')); expect(rootClick).toHaveBeenCalled(); await userEvent.click(screen.getByTestId('actor')); expect(actorClick).toHaveBeenCalled(); await userEvent.click(screen.getByTestId('menu')); expect(menuClick).toHaveBeenCalled(); expect(screen.queryByRole('listbox')).toBeInTheDocument(); }); it('always rendered menus should attach document event listeners only when opened', async function () { const addSpy = jest.spyOn(document, 'addEventListener'); const removeSpy = jest.spyOn(document, 'removeEventListener'); render( {({getRootProps, getActorProps, getMenuProps}) => (
  • Dropdown Menu Item 1
)}
); // Make sure this is only called when menu is open expect(addSpy).not.toHaveBeenCalled(); await userEvent.click(screen.getByRole('button')); expect(addSpy).toHaveBeenCalled(); expect(removeSpy).not.toHaveBeenCalled(); await userEvent.click(screen.getByRole('button')); expect(removeSpy).toHaveBeenCalled(); addSpy.mockRestore(); removeSpy.mockRestore(); }); it('does not close nested dropdown on actor clicks', async function () { render( {({getRootProps, getActorProps, getMenuProps}) => (
  • Dropdown Menu Item 1
)}
); await userEvent.hover(screen.getByRole('button')); expect(screen.getByTestId('menu-item')).toBeInTheDocument(); await userEvent.click(screen.getByRole('button')); // Should still be visible. expect(screen.getByTestId('menu-item')).toBeInTheDocument(); }); });