import * as React from 'react'; import { keyboardKey } from '@fluentui/keyboard-key'; import { SplitButton } from 'src/components/SplitButton/SplitButton'; import { splitButtonToggleClassName } from 'src/components/SplitButton/SplitButtonToggle'; import { isConformant } from 'test/specs/commonTests'; import { ReactWrapper, CommonWrapper } from 'enzyme'; import { mountWithProvider, findIntrinsicElement } from '../../../utils'; import { menuClassName } from 'src/components/Menu/Menu'; import { menuItemClassName } from 'src/components/Menu/MenuItem'; import { menuButtonClassName } from 'src/components/MenuButton/MenuButton'; import { buttonClassName } from 'src/components/Button/Button'; import { implementsPopperProps } from 'test/specs/commonTests/implementsPopperProps'; const mockMenu = { items: ['1', '2', '3'] }; const getToggleButton = (wrapper: ReactWrapper): CommonWrapper => findIntrinsicElement(wrapper, `.${splitButtonToggleClassName}`); const getMainButton = (wrapper: ReactWrapper): CommonWrapper => findIntrinsicElement(wrapper, `.${menuButtonClassName} .${buttonClassName}`); const getMenuItems = (wrapper: ReactWrapper): CommonWrapper => findIntrinsicElement(wrapper, `.${menuItemClassName}`); const getMenu = (wrapper: ReactWrapper): CommonWrapper => findIntrinsicElement(wrapper, `.${menuClassName}`); describe('SplitButton', () => { isConformant(SplitButton, { constructorName: 'SplitButton', autoControlledProps: ['open'] }); implementsPopperProps(SplitButton, { requiredProps: { open: true } }); describe('open', () => { test('is toggled between true and false on toggle button click', () => { const wrapper = mountWithProvider(); const toggleButton = getToggleButton(wrapper); toggleButton.simulate('click'); expect(getMenuItems(wrapper)).toHaveLength(mockMenu.items.length); toggleButton.simulate('click'); expect(getMenuItems(wrapper)).toHaveLength(0); }); test('is false when clicking menu item', () => { const wrapper = mountWithProvider(); getMenuItems(wrapper) .at(0) .simulate('click'); expect(getMenuItems(wrapper)).toHaveLength(0); }); test('is true when Alt+ArrowDown is sent to the main button', () => { const wrapper = mountWithProvider(); getMainButton(wrapper).simulate('keydown', { keyCode: keyboardKey.ArrowDown, altKey: true }); expect(getMenuItems(wrapper)).toHaveLength(mockMenu.items.length); }); test('is false when Alt+ArrowUp is sent to the menu', () => { const wrapper = mountWithProvider(); getMenu(wrapper).simulate('keydown', { keyCode: keyboardKey.ArrowUp, altKey: true }); expect(getMenuItems(wrapper)).toHaveLength(0); expect(document.activeElement).toBe(getMainButton(wrapper).getDOMNode()); }); test('is false when Escape is sent to the menu', () => { const wrapper = mountWithProvider(); getMenu(wrapper).simulate('keydown', { keyCode: keyboardKey.Escape }); expect(getMenuItems(wrapper)).toHaveLength(0); expect(document.activeElement).toBe(getMainButton(wrapper).getDOMNode()); }); test('is false when Tab is sent to the menu', () => { const wrapper = mountWithProvider(); getMenu(wrapper).simulate('keydown', { keyCode: keyboardKey.Tab, shiftKey: false }); expect(getMenuItems(wrapper)).toHaveLength(0); }); test('is false when Enter is sent to the menu', () => { const wrapper = mountWithProvider(); getMenu(wrapper).simulate('keydown', { keyCode: keyboardKey.Enter }); getMenuItems(wrapper) .at(0) .simulate('click'); expect(getMenuItems(wrapper)).toHaveLength(0); }); test('is false when Shift+Tab is sent to the menu', () => { const wrapper = mountWithProvider(); getMenu(wrapper).simulate('keydown', { keyCode: keyboardKey.Tab, shiftKey: true }); expect(getMenuItems(wrapper)).toHaveLength(0); }); }); test('onMenuItemClick', () => { const onMenuItemClick = jest.fn(); const wrapper = mountWithProvider( , ); getMenuItems(wrapper) .at(0) .simulate('click'); expect(onMenuItemClick).toHaveBeenCalledTimes(1); }); test('onMainButtonClick', () => { const onMainButtonClick = jest.fn(); const wrapper = mountWithProvider( , ); getMainButton(wrapper).simulate('click'); expect(onMainButtonClick).toHaveBeenCalledTimes(1); expect(onMainButtonClick).toHaveBeenCalledWith(expect.any(Object), expect.objectContaining({ content: 'test' })); }); });