import {mountWithTheme} from 'sentry-test/enzyme'; import DeprecatedDropdownMenu from 'sentry/components/deprecatedDropdownMenu'; jest.useFakeTimers(); describe('dropdownMenuDeprecated', function () { let wrapper; beforeEach(function () { wrapper = mountWithTheme( {({getRootProps, getActorProps, getMenuProps, isOpen}) => ( {isOpen && ( )} )} ); }); it('renders', function () { expect(wrapper).toSnapshot(); }); it('can toggle dropdown menu with actor', function () { wrapper.find('button').simulate('click'); expect(wrapper.state('isOpen')).toBe(true); expect(wrapper.find('ul')).toHaveLength(1); wrapper.find('button').simulate('click'); expect(wrapper.state('isOpen')).toBe(false); expect(wrapper.find('ul')).toHaveLength(0); }); it('closes dropdown when clicking on anything in menu', function () { wrapper.find('button').simulate('click'); wrapper.find('li').simulate('click'); expect(wrapper.state('isOpen')).toBe(false); expect(wrapper.find('ul')).toHaveLength(0); }); it('closes dropdown when clicking outside of menu', async function () { wrapper.find('button').simulate('click'); // Simulate click on document const event = document.createEvent('HTMLEvents'); event.initEvent('click', false, true); document.body.dispatchEvent(event); jest.runAllTimers(); await Promise.resolve(); wrapper.update(); expect(wrapper.find('ul')).toHaveLength(0); }); it('closes dropdown when pressing escape', function () { wrapper.find('button').simulate('click'); expect(wrapper.state('isOpen')).toBe(true); wrapper.simulate('keyDown', {key: 'Escape'}); wrapper.find('button').simulate('keyDown', {key: 'Escape'}); expect(wrapper.state('isOpen')).toBe(false); expect(wrapper.find('ul')).toHaveLength(0); }); it('ignores "Escape" key if `closeOnEscape` is false', function () { wrapper = mountWithTheme( {({getRootProps, getActorProps, getMenuProps, isOpen}) => ( {isOpen && ( )} )} ); wrapper.find('button').simulate('click'); expect(wrapper.state('isOpen')).toBe(true); wrapper.find('button').simulate('keyDown', {key: 'Escape'}); expect(wrapper.find('ul')).toHaveLength(1); expect(wrapper.state('isOpen')).toBe(true); }); it('keeps dropdown open when clicking on anything in menu with `keepMenuOpen` prop', function () { wrapper = mountWithTheme( {({getRootProps, getActorProps, getMenuProps, isOpen}) => ( {isOpen && ( )} )} ); wrapper.find('button').simulate('click'); wrapper.find('li').simulate('click'); expect(wrapper.state('isOpen')).toBe(true); expect(wrapper.find('ul')).toHaveLength(1); }); it('render prop getters all extend props and call original onClick handlers', function () { const rootClick = jest.fn(); const actorClick = jest.fn(); const menuClick = jest.fn(); const addSpy = jest.spyOn(document, 'addEventListener'); const removeSpy = jest.spyOn(document, 'removeEventListener'); wrapper = mountWithTheme( {({getRootProps, getActorProps, getMenuProps, isOpen}) => ( {isOpen && ( )} )} ); expect(wrapper.find('ul')).toHaveLength(0); wrapper.find('span').simulate('click'); expect(rootClick).toHaveBeenCalled(); wrapper.find('button').simulate('click'); expect(actorClick).toHaveBeenCalled(); wrapper.find('li').simulate('click'); expect(menuClick).toHaveBeenCalled(); // breaks in jest22 // expect(wrapper).toSnapshot(); expect(wrapper.find('ul')).toHaveLength(1); expect(document.addEventListener).toHaveBeenCalled(); wrapper.unmount(); expect(document.removeEventListener).toHaveBeenCalled(); addSpy.mockRestore(); removeSpy.mockRestore(); }); it('always rendered menus should attach document event listeners only when opened', function () { const addSpy = jest.spyOn(document, 'addEventListener'); const removeSpy = jest.spyOn(document, 'removeEventListener'); wrapper = mountWithTheme( {({getRootProps, getActorProps, getMenuProps}) => ( )} ); // Make sure this is only called when menu is open expect(document.addEventListener).not.toHaveBeenCalled(); wrapper.find('button').simulate('click'); expect(wrapper.state('isOpen')).toBe(true); expect(document.addEventListener).toHaveBeenCalled(); expect(document.removeEventListener).not.toHaveBeenCalled(); wrapper.find('button').simulate('click'); expect(wrapper.state('isOpen')).toBe(false); expect(document.removeEventListener).toHaveBeenCalled(); addSpy.mockRestore(); removeSpy.mockRestore(); }); it('does not close nested dropdown on actor clicks', function () { wrapper = mountWithTheme( {({getRootProps, getActorProps, getMenuProps}) => ( { } )} ); wrapper.find('button').simulate('mouseEnter'); expect(wrapper.find('[data-test-id="menu-item"]')).toHaveLength(1); wrapper.find('button').simulate('click'); // Should still be visible. expect(wrapper.find('[data-test-id="menu-item"]')).toHaveLength(1); }); });