import * as React from 'react';
import { MenuButton } from 'src/components/MenuButton/MenuButton';
import { isConformant, handlesAccessibility } from 'test/specs/commonTests';
import { mountWithProvider } from '../../../utils';
const mockMenu = { items: ['1', '2', '3'] };
describe('MenuButton', () => {
isConformant(MenuButton, { constructorName: 'MenuButton', autoControlledProps: ['open'] });
describe('accessibility', () => {
handlesAccessibility(MenuButton);
describe('onOpenChange', () => {
test('is called on click', () => {
const onOpenChange = jest.fn();
mountWithProvider(} menu={mockMenu} onOpenChange={onOpenChange} />)
.find('button')
.simulate('click');
expect(onOpenChange).toHaveBeenCalledTimes(1);
expect(onOpenChange.mock.calls[0][1]).toMatchObject({ open: true });
});
test('is called on click when controlled', () => {
const onOpenChange = jest.fn();
mountWithProvider(} menu={mockMenu} onOpenChange={onOpenChange} />)
.find('button')
.simulate('click');
expect(onOpenChange).toHaveBeenCalledTimes(1);
expect(onOpenChange.mock.calls[0][1]).toMatchObject({ open: true });
});
});
describe('ID handling', () => {
test('trigger id is used', () => {
const menuButton = mountWithProvider(} menu={mockMenu} />);
const button = menuButton.find('button');
button.simulate('click');
const menu = menuButton.find('ul');
const triggerId = button.prop('id');
expect(triggerId).toEqual('test-id');
expect(menu.prop('aria-labelledby')).toEqual(triggerId);
});
test('trigger id is generated if not provided', () => {
const menuButton = mountWithProvider(} menu={mockMenu} />);
const button = menuButton.find('button');
button.simulate('click');
const menu = menuButton.find('ul');
const triggerId = button.prop('id');
expect(triggerId).toMatch(/menubutton-trigger-\d+/);
expect(menu.prop('aria-labelledby')).toEqual(triggerId);
});
test('menu id is used', () => {
const menuId = 'test-id';
const menuButton = mountWithProvider(} menu={{ ...mockMenu, id: menuId }} />);
menuButton.find('button').simulate('click');
expect(menuButton.find('ul').prop('id')).toEqual(menuId);
expect(menuButton.find('button').prop('aria-controls')).toEqual(menuId);
});
test('menu id is generated if not provided', () => {
const menuButton = mountWithProvider(} menu={mockMenu} />);
menuButton.find('button').simulate('click');
const menuId = menuButton.find('ul').prop('id');
expect(menuId).toMatch(/menubutton-menu-\d+/);
expect(menuButton.find('button').prop('aria-controls')).toEqual(menuId);
});
});
});
});