import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
import DropdownMenuControl from './dropdownMenuControl';
describe('DropdownMenu', function () {
it('renders a basic menu', function () {
const onAction = jest.fn();
render(
);
// Open the mneu
userEvent.click(screen.getByRole('button', {name: 'This is a Menu'}));
// The mneu is open
expect(screen.getByRole('menu')).toBeInTheDocument();
// There are two menu items
//
// TODO(epurkhiser): These should really be menuitem roles NOT
// menuitemradio's. But react-aria is setting this for us (probably because
// the menu has submenus, so we need to be able to "select" them). We
// should figure out how to tell it that this menu does not allow
expect(screen.getAllByRole('menuitemradio')).toHaveLength(2);
expect(
screen.getByRole('menuitemradio', {name: 'Item One'})
).toHaveAccessibleDescription('This is the first item');
expect(
screen.getByRole('menuitemradio', {name: 'Item Two'})
).toHaveAccessibleDescription('Another description here');
userEvent.click(screen.getByRole('menuitemradio', {name: 'Item One'}));
expect(onAction).toHaveBeenCalled();
});
it('renders disabled items', function () {
const onAction = jest.fn();
render(
);
userEvent.click(screen.getByRole('button', {name: 'Menu'}));
const menuItem = screen.getByRole('menuitemradio', {name: 'Item One'});
// RTL doesn't support toBeDisabled for aria-disabled
//
// See: https://github.com/testing-library/jest-dom/issues/144#issuecomment-577235097
expect(menuItem).toHaveAttribute('aria-disabled', 'true');
userEvent.click(menuItem);
expect(onAction).not.toHaveBeenCalled();
});
it('renders submenues', function () {
const onAction = jest.fn();
render(
);
userEvent.click(screen.getByRole('button', {name: 'Menu'}));
// Sub item won't be visible until we hover over it's parent
expect(
screen.queryByRole('menuitemradio', {name: 'Sub Item'})
).not.toBeInTheDocument();
const parentItem = screen.getByRole('menuitemradio', {name: 'Item'});
expect(parentItem).toHaveAttribute('aria-haspopup', 'true');
expect(parentItem).toHaveAttribute('aria-expanded', 'false');
userEvent.hover(parentItem);
// The sub item is now visibile
const subItem = screen.getByRole('menuitemradio', {name: 'Sub Item'});
expect(subItem).toBeInTheDocument();
// Menu does not close when hovering over it
userEvent.unhover(parentItem);
userEvent.hover(subItem);
expect(subItem).toBeInTheDocument();
// Menu is closed when hovering the other menu item
userEvent.unhover(subItem);
userEvent.hover(screen.getByRole('menuitemradio', {name: 'Item Two'}));
expect(subItem).not.toBeInTheDocument();
// Click the menu item
userEvent.hover(parentItem);
userEvent.click(screen.getByRole('menuitemradio', {name: 'Sub Item'}));
expect(onAction).toHaveBeenCalled();
});
});