import UI from '@/ui'; import { HELP_MENUS } from '@/consts'; describe('UI', () => { let ui, options; beforeEach(() => { options = { loadImage: { path: 'mockImagePath', name: '' }, menu: ['resize', 'crop', 'flip', 'rotate', 'draw', 'shape', 'icon', 'text', 'mask', 'filter'], initMenu: 'shape', menuBarPosition: 'bottom', }; ui = new UI(document.createElement('div'), options, {}); }); describe('Destroy()', () => { it('should be executed for all menu instances', () => { const spies = []; options.menu.forEach((menu) => { spies.push(jest.spyOn(ui[menu], 'destroy')); }); ui._destroyAllMenu(); spies.forEach((spy) => { expect(spy).toHaveBeenCalled(); }); }); it('should execute "removeEventListener" for all menus', () => { const allUiButtonElementName = [...options.menu, ...HELP_MENUS]; allUiButtonElementName.forEach((element) => { jest.spyOn(ui._buttonElements[element], 'removeEventListener'); }); ui._removeUiEvent(); allUiButtonElementName.forEach((element) => { expect(ui._buttonElements[element].removeEventListener).toHaveBeenCalled(); }); }); }); describe('_changeMenu()', () => { it('should execute when the menu changes', () => { ui.submenu = 'shape'; jest.spyOn(ui, 'resizeEditor'); ui.shape.changeStandbyMode = jest.fn(); jest.spyOn(ui.filter, 'changeStartMode'); ui._actions.main = { changeSelectableAll: jest.fn() }; ui.resizeEditor = jest.fn(); ui._changeMenu('filter', false, false); expect(ui.shape.changeStandbyMode).toHaveBeenCalled(); expect(ui.filter.changeStartMode).toHaveBeenCalled(); }); }); describe('_makeSubMenu()', () => { it('should execute for the number of menus specified in the option.', () => { const makeMenuElementSpy = jest.spyOn(ui, '_makeMenuElement'); ui._makeSubMenu(); expect(makeMenuElementSpy).toHaveBeenCalledTimes(options.menu.length); }); it('should create instance of the menu specified in the option', () => { jest.spyOn(ui, '_makeMenuElement'); const getConstructorName = (constructor) => constructor.toString().match(/^class (.+?) /)[1]; ui._makeSubMenu(); options.menu.forEach((menu) => { const constructorNameOfInstance = getConstructorName(ui[menu].constructor); const expected = menu.replace(/^[a-z]/, ($0) => $0.toUpperCase()); expect(constructorNameOfInstance).toBe(expected); }); }); }); describe('initCanvas()', () => { beforeEach(() => { ui._editorElement = { querySelector: jest.fn(() => document.createElement('div')), }; ui._actions.main = { initLoadImage: jest.fn(() => Promise.resolve()), }; }); it('should be run as required when initCanvas is executed', async () => { ui.activeMenuEvent = jest.fn(); const addLoadEventSpy = jest.spyOn(ui, '_addLoadEvent'); await ui.initCanvas(); expect(addLoadEventSpy).toHaveBeenCalled(); }); it('should not be run when has not image path', () => { jest.spyOn(ui, '_getLoadImage').mockReturnValue({ path: '' }); ui.initCanvas(); expect(ui._actions.main.initLoadImage).not.toHaveBeenCalled(); }); it('should be executed even if there is no image path', () => { jest.spyOn(ui, '_getLoadImage').mockReturnValue({ path: '' }); jest.spyOn(ui, '_addLoadEvent'); ui.initCanvas(); expect(ui._addLoadEvent).toHaveBeenCalled(); }); }); describe('_setEditorPosition()', () => { beforeEach(() => { ui._editorElement = document.createElement('div'); jest.spyOn(ui, '_getCanvasMaxDimension').mockReturnValue({ width: 300, height: 300 }); }); it('should be reflected in the bottom of the editor position', () => { ui.submenu = true; ui._setEditorPosition('bottom'); expect(ui._editorElement.style).toMatchObject({ top: '150px', left: '0px' }); }); it('should be reflected in the top of the editor position', () => { ui.submenu = true; ui._setEditorPosition('top'); expect(ui._editorElement.style).toMatchObject({ top: '-150px', left: '0px' }); }); it('should be reflected in the left, right of the editor position', () => { ui.submenu = true; ui._setEditorPosition('left'); expect(ui._editorElement.style).toMatchObject({ top: '0px', left: '-150px' }); }); it('should be reflected in the right of the editor position', () => { ui.submenu = true; ui._setEditorPosition('right'); expect(ui._editorElement.style).toMatchObject({ top: '0px', left: '150px' }); }); }); });