/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.uberfire.client.workbench.widgets.menu; import org.jboss.errai.security.shared.api.identity.User; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import org.uberfire.client.mvp.ActivityManager; import org.uberfire.client.mvp.PerspectiveActivity; import org.uberfire.client.mvp.PerspectiveManager; import org.uberfire.client.workbench.events.PerspectiveChange; import org.uberfire.client.workbench.events.PlaceMaximizedEvent; import org.uberfire.client.workbench.events.PlaceMinimizedEvent; import org.uberfire.mvp.Command; import org.uberfire.mvp.PlaceRequest; import org.uberfire.mvp.impl.DefaultPlaceRequest; import org.uberfire.security.Resource; import org.uberfire.security.authz.AuthorizationManager; import org.uberfire.workbench.model.ActivityResourceType; import org.uberfire.workbench.model.menu.MenuFactory; import org.uberfire.workbench.model.menu.MenuPosition; import org.uberfire.workbench.model.menu.Menus; import static org.junit.Assert.*; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.isNull; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class WorkbenchMenuBarPresenterTest { @Mock protected AuthorizationManager authzManager; @Mock protected User identity; @Mock private PerspectiveManager perspectiveManager; @Mock private ActivityManager activityManager; @Mock private WorkbenchMenuBarPresenter.View view; @InjectMocks private WorkbenchMenuBarPresenter presenter; @Test public void testAddCurrentPerspective() { final String perspectiveId = "perspectiveId"; final Menus menus = MenuFactory.newSimpleItem("test").perspective(perspectiveId).endMenu().build(); final PlaceRequest placeRequest = new DefaultPlaceRequest(perspectiveId); final PerspectiveActivity perspectiveActivity = mock(PerspectiveActivity.class); when(perspectiveActivity.getPlace()).thenReturn(placeRequest); when(perspectiveManager.getCurrentPerspective()).thenReturn(perspectiveActivity); when(authzManager.authorize(any(Resource.class), eq(identity))).thenReturn(true); presenter.addMenus(menus); verify(view).selectMenuItem(perspectiveId); } @Test public void testAddPerspective() { final String perspectiveId = "perspectiveId"; final Menus menus = MenuFactory.newSimpleItem("test").perspective(perspectiveId).endMenu().build(); final PlaceRequest placeRequest = new DefaultPlaceRequest("anyId"); final PerspectiveActivity perspectiveActivity = mock(PerspectiveActivity.class); when(perspectiveActivity.getPlace()).thenReturn(placeRequest); when(perspectiveManager.getCurrentPerspective()).thenReturn(perspectiveActivity); when(authzManager.authorize(any(Resource.class), eq(identity))).thenReturn(true); presenter.addMenus(menus); verify(view, never()).selectMenuItem(perspectiveId); } @Test public void testPerspectiveChangeEvent() { final String perspectiveId = "perspectiveId"; final Menus menus = MenuFactory.newSimpleItem("test").perspective(perspectiveId).endMenu().build(); final PlaceRequest placeRequest = new DefaultPlaceRequest(perspectiveId); final PerspectiveActivity perspectiveActivity = mock(PerspectiveActivity.class); final PerspectiveChange perspectiveChange = new PerspectiveChange(placeRequest, null, null, perspectiveId); when(perspectiveActivity.getPlace()).thenReturn(placeRequest); when(perspectiveActivity.isType(ActivityResourceType.PERSPECTIVE.name())).thenReturn(true); when(authzManager.authorize(any(Resource.class), eq(identity))).thenReturn(true); presenter.addMenus(menus); presenter.onPerspectiveChange(perspectiveChange); verify(view).selectMenuItem(perspectiveId); } @Test public void testAddMenuWithPermission() { final String perspectiveId = "perspectiveId"; final String label = "perspectiveLabel"; final Menus menus = MenuFactory.newSimpleItem(label).perspective(perspectiveId).endMenu().build(); when(authzManager.authorize(menus.getItems().get(0), identity)).thenReturn(true); presenter.addMenus(menus); verify(authzManager).authorize(menus.getItems().get(0), identity); verify(view).addMenuItem(eq(perspectiveId), eq(label), isNull(String.class), any(Command.class), any(MenuPosition.class)); } @Test public void testAddMenuWithoutPermission() { final String perspectiveId = "perspectiveId"; final String label = "perspectiveLabel"; final Menus menus = MenuFactory.newSimpleItem(label).perspective(perspectiveId).endMenu().build(); when(authzManager.authorize(menus.getItems().get(0), identity)).thenReturn(false); presenter.addMenus(menus); verify(authzManager).authorize(menus.getItems().get(0), identity); verify(view, never()).addMenuItem(eq(perspectiveId), eq(label), isNull(String.class), any(Command.class), any(MenuPosition.class)); } @Test public void testAddContextMenuWithPermission() { final String perspectiveId = "perspectiveId"; final String contextLabel = "contextLabel"; final MenuPosition position = MenuPosition.LEFT; final Menus contextMenus = MenuFactory.newSimpleItem(contextLabel).endMenu().build(); final PerspectiveActivity activity = mock(PerspectiveActivity.class); final PlaceRequest placeRequest = mock(PlaceRequest.class); when(activity.getIdentifier()).thenReturn(perspectiveId); when(activity.getMenus()).thenReturn(contextMenus); when(activity.isType(ActivityResourceType.PERSPECTIVE.name())).thenReturn(true); when(authzManager.authorize(contextMenus.getItems().get(0), identity)).thenReturn(true); when(activityManager.getActivity(placeRequest)).thenReturn(activity); presenter.onPerspectiveChange(new PerspectiveChange(placeRequest, null, contextMenus, perspectiveId)); verify(authzManager).authorize(contextMenus.getItems().get(0), identity); verify(view).clearContextMenu(); verify(view).addContextMenuItem(eq(perspectiveId), anyString(), eq(contextLabel), isNull(String.class), any(Command.class), eq(position)); } @Test public void testAddContextMenuWithoutPermission() { final String perspectiveId = "perspectiveId"; final String contextLabel = "contextLabel"; final Menus contextMenus = MenuFactory.newSimpleItem(contextLabel).endMenu().build(); final PerspectiveActivity activity = mock(PerspectiveActivity.class); final PlaceRequest placeRequest = mock(PlaceRequest.class); when(activity.getIdentifier()).thenReturn(perspectiveId); when(activity.getMenus()).thenReturn(contextMenus); when(activity.isType(ActivityResourceType.PERSPECTIVE.name())).thenReturn(true); when(authzManager.authorize(contextMenus.getItems().get(0), identity)).thenReturn(false); when(activityManager.getActivity(placeRequest)).thenReturn(activity); presenter.onPerspectiveChange(new PerspectiveChange(placeRequest, null, contextMenus, perspectiveId)); verify(authzManager).authorize(contextMenus.getItems().get(0), identity); verify(view).clearContextMenu(); verify(view, never()).addContextMenuItem(anyString(), anyString(), anyString(), anyString(), any(Command.class), any(MenuPosition.class)); } @Test public void testSetupEnableDisableMenuItemCommand() { final String label = "command"; final Command command = mock(Command.class); final Menus menus = MenuFactory.newSimpleItem(label).respondsWith(command).endMenu().build(); when(authzManager.authorize(menus.getItems().get(0), identity)).thenReturn(true); presenter.addMenus(menus); verify(view, times(1)).enableMenuItem(anyString(), eq(true)); menus.getItems().get(0).setEnabled(true); verify(view, times(2)).enableMenuItem(anyString(), eq(true)); menus.getItems().get(0).setEnabled(false); verify(view, times(1)).enableMenuItem(anyString(), eq(false)); } @Test public void testSetupEnableDisableMenuItemPlace() { final String label = "placeLabel"; final PlaceRequest place = mock(PlaceRequest.class); final Menus menus = MenuFactory.newSimpleItem(label).place(place).endMenu().build(); when(authzManager.authorize(menus.getItems().get(0), identity)).thenReturn(true); presenter.addMenus(menus); verify(view, times(1)).enableMenuItem(anyString(), eq(true)); menus.getItems().get(0).setEnabled(true); verify(view, times(2)).enableMenuItem(anyString(), eq(true)); menus.getItems().get(0).setEnabled(false); verify(view, times(1)).enableMenuItem(anyString(), eq(false)); } @Test public void testSetupEnableDisableMenuItemPerspective() { final String label = "perspectiveLabel"; final String perspectiveId = "perspectiveId"; final Menus menus = MenuFactory.newSimpleItem(label).perspective(perspectiveId).endMenu().build(); when(authzManager.authorize(menus.getItems().get(0), identity)).thenReturn(true); presenter.addMenus(menus); verify(view, times(1)).enableMenuItem(anyString(), eq(true)); menus.getItems().get(0).setEnabled(true); verify(view, times(2)).enableMenuItem(anyString(), eq(true)); menus.getItems().get(0).setEnabled(false); verify(view, times(1)).enableMenuItem(anyString(), eq(false)); } @Test public void testSetupEnableDisableContextMenuItem() { final String contextLabel = "contextLabel"; final String perspectiveId = "perspectiveId"; final Menus contextMenus = MenuFactory.newSimpleItem(contextLabel).endMenu().build(); final PerspectiveActivity activity = mock(PerspectiveActivity.class); final PlaceRequest placeRequest = mock(PlaceRequest.class); when(activity.getIdentifier()).thenReturn(perspectiveId); when(activity.getMenus()).thenReturn(contextMenus); when(activity.isType(ActivityResourceType.PERSPECTIVE.name())).thenReturn(true); when(authzManager.authorize(contextMenus.getItems().get(0), identity)).thenReturn(true); when(activityManager.getActivity(placeRequest)).thenReturn(activity); presenter.onPerspectiveChange(new PerspectiveChange(placeRequest, null, contextMenus, perspectiveId)); verify(view, times(1)).enableContextMenuItem(anyString(), eq(true)); contextMenus.getItems().get(0).setEnabled(true); verify(view, times(2)).enableContextMenuItem(anyString(), eq(true)); contextMenus.getItems().get(0).setEnabled(false); verify(view).enableContextMenuItem(anyString(), eq(false)); } @Test public void testMenuInsertionOrder() { final String perspectiveId = "perspectiveId"; final String label = "perspectiveLabel"; final Menus firstMenus = MenuFactory.newSimpleItem(label).perspective(perspectiveId).endMenu().build(); final Menus secondMenus = MenuFactory.newSimpleItem(label).orderAll(1).perspective(perspectiveId).endMenu().build(); final Menus thirdMenus = MenuFactory.newSimpleItem(label).orderAll(2).perspective(perspectiveId).endMenu().build(); when(authzManager.authorize(firstMenus.getItems().get(0), identity)).thenReturn(true); when(authzManager.authorize(secondMenus.getItems().get(0), identity)).thenReturn(true); when(authzManager.authorize(thirdMenus.getItems().get(0), identity)).thenReturn(true); presenter.addMenus(thirdMenus); presenter.addMenus(firstMenus); presenter.addMenus(secondMenus); assertEquals(3, presenter.getAddedMenus().size()); assertSame(firstMenus, presenter.getAddedMenus().get(0)); assertSame(secondMenus, presenter.getAddedMenus().get(1)); assertSame(thirdMenus, presenter.getAddedMenus().get(2)); } @Test public void testView() { assertEquals(view, presenter.getView()); } @Test public void testCollapse() { presenter.collapse(); assertFalse(presenter.isUseExpandedMode()); verify(view).collapse(); } @Test public void testExpand() { presenter.expand(); assertTrue(presenter.isUseExpandedMode()); verify(view).expand(); } @Test public void testAddCollapseHandler() { final Command command = mock(Command.class); presenter.addCollapseHandler(command); verify(view).addCollapseHandler(command); } @Test public void testExpandHandler() { doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { ((Command) invocation.getArguments()[0]).execute(); return null; } }).when(view).addExpandHandler(any(Command.class)); presenter.setup(); assertTrue(presenter.isExpanded()); } @Test public void testCollapseHandler() { doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { ((Command) invocation.getArguments()[0]).execute(); return null; } }).when(view).addCollapseHandler(any(Command.class)); presenter.setup(); assertFalse(presenter.isExpanded()); } @Test public void testAddExpandHandler() { final Command command = mock(Command.class); presenter.addExpandHandler(command); verify(view).addExpandHandler(command); } @Test public void testClear() { presenter.clear(); verify(view).clear(); } @Test public void testOnPlaceMaximized() { presenter.onPlaceMaximized(mock(PlaceMaximizedEvent.class)); verify(view).collapse(); } @Test public void testOnPlaceMinimized() { presenter.onPlaceMinimized(mock(PlaceMinimizedEvent.class)); verify(view).expand(); } @Test public void testOnPlaceMinimizedExpandMode() { presenter.collapse(); presenter.onPlaceMinimized(mock(PlaceMinimizedEvent.class)); verify(view, never()).expand(); } }