import { mount, shallow } from 'enzyme'; import * as React from 'react'; import { ScreenShotAnnotation } from '../src/common/ipcEvent'; import MenuButton from '../src/renderer/components/menu-button'; afterEach(() => { jest.clearAllMocks(); }); describe('Menu Button', () => { //#region Logic const waitForPromisesToResolve = () => new Promise((resolve) => setTimeout(resolve)); //#endregion //#region Mock const copyToClipboardFn = jest.fn(); const saveAsFn = jest.fn(); copyToClipboardFn.mockImplementation((event) => { return event; }); saveAsFn.mockImplementation((event) => { return event; }); const menuItem = [ { name: 'Copy to clipboard', event: ScreenShotAnnotation.COPY_TO_CLIPBOARD, onClick: copyToClipboardFn, dataTestId: 'COPY_TO_CLIPBOARD', }, { name: 'Save as', event: ScreenShotAnnotation.SAVE_AS, onClick: saveAsFn, dataTestId: 'SAVE_AS', }, ]; //#endregion it('should show all elements', () => { const wrapper = shallow(React.createElement(MenuButton)); expect(wrapper).toMatchSnapshot(); }); it('should call event on click copy to clipboard', async () => { const wrapper = mount( , ); wrapper.find('[data-testid="snipping-tool_MENU_BUTTON"]').simulate('click'); wrapper.update(); await waitForPromisesToResolve(); wrapper .find('[data-testid="snipping-tool_COPY_TO_CLIPBOARD"]') .simulate('click'); wrapper.update(); await waitForPromisesToResolve(); expect(copyToClipboardFn).toBeCalledWith( ScreenShotAnnotation.COPY_TO_CLIPBOARD, ); }); it('should call event on click save as', async () => { const wrapper = mount( , ); wrapper.find('[data-testid="snipping-tool_MENU_BUTTON"]').simulate('click'); wrapper.update(); await waitForPromisesToResolve(); wrapper.find('[data-testid="snipping-tool_SAVE_AS"]').simulate('click'); wrapper.update(); await waitForPromisesToResolve(); expect(saveAsFn).toBeCalledWith(ScreenShotAnnotation.SAVE_AS); }); it('should disappear on click to other element', async () => { const wrapper = mount( , ); wrapper.find('[data-testid="snipping-tool_MENU_BUTTON"]').simulate('click'); wrapper.update(); await waitForPromisesToResolve(); wrapper.find('[data-testid="snipping-tool_MENU_BUTTON"]').simulate('click'); wrapper.update(); await waitForPromisesToResolve(); expect(wrapper.find('.menu').exists()).toBeFalsy(); }); it('should focus menu list on up', async () => { const wrapper = mount( , ); wrapper.find('[data-testid="snipping-tool_MENU_BUTTON"]').simulate('click'); wrapper.update(); wrapper .find('[data-testid="snipping-tool_MENU_BUTTON"]') .simulate('keyup', { key: 'ArrowUp' }); wrapper.update(); expect( (wrapper.find('[data-testid="snipping-tool_SAVE_AS"]').instance() as any) .dataset.isfocused, ).toBe('true'); }); it('should focus menu list on down', async () => { const wrapper = mount( , ); wrapper.find('[data-testid="snipping-tool_MENU_BUTTON"]').simulate('click'); wrapper.update(); wrapper .find('[data-testid="snipping-tool_MENU_BUTTON"]') .simulate('keyup', { key: 'ArrowDown' }); wrapper.update(); expect( ( wrapper .find('[data-testid="snipping-tool_COPY_TO_CLIPBOARD"]') .instance() as any ).dataset.isfocused, ).toBe('true'); }); it('should go down on press down', async () => { const wrapper = mount( , ); wrapper.find('[data-testid="snipping-tool_MENU_BUTTON"]').simulate('click'); wrapper.update(); wrapper .find('[data-testid="snipping-tool_MENU_BUTTON"]') .simulate('keyup', { key: 'ArrowDown' }); wrapper.update(); wrapper .find('[data-testid="snipping-tool_LIST"]') .simulate('keyup', { key: 'ArrowDown' }); wrapper.update(); expect( (wrapper.find('[data-testid="snipping-tool_SAVE_AS"]').instance() as any) .dataset.isfocused, ).toBe('true'); }); it('should go up on press up', async () => { const wrapper = mount( , ); wrapper.find('[data-testid="snipping-tool_MENU_BUTTON"]').simulate('click'); wrapper.update(); wrapper .find('[data-testid="snipping-tool_MENU_BUTTON"]') .simulate('keyup', { key: 'ArrowUp' }); wrapper .find('[data-testid="snipping-tool_LIST"]') .simulate('keyup', { key: 'ArrowUp' }); wrapper.update(); expect( ( wrapper .find('[data-testid="snipping-tool_COPY_TO_CLIPBOARD"]') .instance() as any ).dataset.isfocused, ).toBe('true'); }); });