/* * Copyright 2016 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.kie.workbench.common.workbench.client.docks; import java.util.HashSet; import java.util.Set; import com.google.gwtmockito.GwtMockitoTestRunner; import org.jboss.errai.security.shared.api.Role; import org.jboss.errai.security.shared.api.identity.User; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.screens.datamodeller.client.DataModelerContext; import org.kie.workbench.common.screens.datamodeller.client.context.DataModelerWorkbenchContext; import org.kie.workbench.common.screens.datamodeller.client.context.DataModelerWorkbenchContextChangeEvent; import org.kie.workbench.common.screens.datamodeller.client.context.DataModelerWorkbenchFocusEvent; import org.kie.workbench.common.screens.library.api.preferences.LibraryInternalPreferences; import org.kie.workbench.common.workbench.client.authz.WorkbenchFeatures; import org.kie.workbench.common.workbench.client.resources.images.WorkbenchImageResources; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.uberfire.client.workbench.docks.UberfireDock; import org.uberfire.client.workbench.docks.UberfireDockPosition; import org.uberfire.client.workbench.docks.UberfireDockReadyEvent; import org.uberfire.client.workbench.docks.UberfireDocks; import org.uberfire.client.workbench.docks.UberfireDocksInteractionEvent; import org.uberfire.mvp.PlaceRequest; import org.uberfire.mvp.impl.DefaultPlaceRequest; import org.uberfire.rpc.SessionInfo; import org.uberfire.security.authz.AuthorizationManager; import static org.mockito.Mockito.*; @RunWith(GwtMockitoTestRunner.class) public class AuthoringWorkbenchDocksTest { @Mock private UberfireDocks uberfireDocks; @Mock private DataModelerWorkbenchContext dataModelerWBContext; @Mock private SessionInfo sessionInfo; @Mock private PlaceRequest placeRequest; @Mock private AuthorizationManager authorizationManager; @Mock private User user; @Mock private LibraryInternalPreferences libraryInternalPreferences; private UberfireDock plannerDock; @Spy @InjectMocks private AuthoringWorkbenchDocks authoringDocks; @Before public void initTest() { authoringDocks.setup("authoring", placeRequest); plannerDock = new UberfireDock(UberfireDockPosition.EAST, WorkbenchImageResources.INSTANCE.optaPlannerDisabledIcon(), WorkbenchImageResources.INSTANCE.optaPlannerEnabledIcon(), new DefaultPlaceRequest("PlannerDomainScreen"), "authoring").withSize(450).withLabel(authoringDocks.constants.DocksOptaPlannerTitle()); } @Test public void plannerRoleGrantedTest() { when(sessionInfo.getId()).thenReturn("logged_user"); when(sessionInfo.getIdentity()).thenReturn(user); when(authorizationManager.authorize(WorkbenchFeatures.PLANNER_AVAILABLE, user)).thenReturn(true); UberfireDockReadyEvent event = new UberfireDockReadyEvent("authoring"); authoringDocks.perspectiveChangeEvent(event); verify(uberfireDocks, times(1)).add(plannerDock); } @Test public void plannerRoleNotGrantedNeverVisitedTest() { testPlannerNotGranted(false); } @Test public void plannerRoleNotGrantedVisitedTest() { testPlannerNotGranted(true); } private void testPlannerNotGranted(boolean visited) { if (visited) { //make that a user with the grants visits the authoring perspective plannerRoleGrantedTest(); } //user hasn't the planner role in this case Set<Role> userRoles = new HashSet<Role>(); when(sessionInfo.getId()).thenReturn("logged_user"); when(sessionInfo.getIdentity()).thenReturn(user); when(user.getRoles()).thenReturn(userRoles); UberfireDockReadyEvent event = new UberfireDockReadyEvent("authoring"); authoringDocks.perspectiveChangeEvent(event); if (visited) { //if the authoring was visited at least once by a user with the planner role //ensure the dock is removed verify(uberfireDocks, times(1)).remove(plannerDock); } //if not, do nothing } @Test public void setup() { when(sessionInfo.getIdentity()).thenReturn(user); when(authorizationManager.authorize(WorkbenchFeatures.PLANNER_AVAILABLE, user)).thenReturn(true); authoringDocks.setup("authoring", placeRequest); verify(uberfireDocks, times(1)).add(plannerDock); } /** * This test checks that docks operations resulting from the event processing only occurs on the docks belonging * to the given active perspective. */ @Test public void avoidDocksManipulationInNonActivePerspective() { //authoringDocks docks was previously configured to manage the "authoring" perspective docks. //emulates current perspective has now changed. authoringDocks.perspectiveChangeEvent(new UberfireDockReadyEvent("some_other_authoring")); //emulate the different events that can modify the docks DataModelerContext context1 = mock(DataModelerContext.class); when(context1.getEditionMode()).thenReturn(DataModelerContext.EditionMode.GRAPHICAL_MODE); DataModelerContext context2 = mock(DataModelerContext.class); when(context2.getEditionMode()).thenReturn(DataModelerContext.EditionMode.GRAPHICAL_MODE); when(dataModelerWBContext.getActiveContext()).thenReturn(context1); authoringDocks.onDataModelerWorkbenchFocusEvent(new DataModelerWorkbenchFocusEvent()); authoringDocks.onContextChange(new DataModelerWorkbenchContextChangeEvent()); when(dataModelerWBContext.getActiveContext()).thenReturn(context2); authoringDocks.onDataModelerWorkbenchFocusEvent(new DataModelerWorkbenchFocusEvent().lostFocus()); authoringDocks.onContextChange(new DataModelerWorkbenchContextChangeEvent()); //disable operation should have been invoked only one time as part of the setup process, but never again. verify(uberfireDocks, times(1)).disable(any(UberfireDockPosition.class), anyString()); //no other docks operations should have been invoked. verify(uberfireDocks, times(0)).enable(any(UberfireDockPosition.class), anyString()); } /** * This test checks that unnecessary operations on the docks are performed. e.g. if the docks are already enabled * then subsequent enabling operation will be skipped, and the same for disabling operations. */ @Test public void avoidDuplicatedStateChangeOnDocksStatusTest() { //authoringDocks docks was previously configured to manage the "authoring" perspective docks. //at this point the docks were disabled as part of the initialization procedure. verify(uberfireDocks, times(1)).disable(UberfireDockPosition.EAST, "authoring"); //emulates that "authoring" perspective was selected. authoringDocks.perspectiveChangeEvent(new UberfireDockReadyEvent("authoring")); //emulates the different events that typically may cause the docks to be set on "enabled" DataModelerContext context1 = mock(DataModelerContext.class); when(context1.getEditionMode()).thenReturn(DataModelerContext.EditionMode.GRAPHICAL_MODE); DataModelerContext context2 = mock(DataModelerContext.class); when(context2.getEditionMode()).thenReturn(DataModelerContext.EditionMode.GRAPHICAL_MODE); when(dataModelerWBContext.getActiveContext()).thenReturn(context1); authoringDocks.onDataModelerWorkbenchFocusEvent(new DataModelerWorkbenchFocusEvent()); authoringDocks.onContextChange(new DataModelerWorkbenchContextChangeEvent()); when(dataModelerWBContext.getActiveContext()).thenReturn(context2); authoringDocks.onDataModelerWorkbenchFocusEvent(new DataModelerWorkbenchFocusEvent()); authoringDocks.onContextChange(new DataModelerWorkbenchContextChangeEvent()); //the docks should have been enabled only one time. verify(uberfireDocks, times(1)).enable(UberfireDockPosition.EAST, "authoring"); //now let's the dock to be disabled multiple times when(dataModelerWBContext.getActiveContext()).thenReturn(context1); authoringDocks.onDataModelerWorkbenchFocusEvent(new DataModelerWorkbenchFocusEvent().lostFocus()); authoringDocks.onContextChange(new DataModelerWorkbenchContextChangeEvent()); when(dataModelerWBContext.getActiveContext()).thenReturn(context2); authoringDocks.onDataModelerWorkbenchFocusEvent(new DataModelerWorkbenchFocusEvent().lostFocus()); authoringDocks.onContextChange(new DataModelerWorkbenchContextChangeEvent()); //the docks should have been disabled only one two times (the initial disabling that was part of the setup // procedure) + only one additional that derives from the multiple context changes. verify(uberfireDocks, times(2)).disable(UberfireDockPosition.EAST, "authoring"); } @Test public void hideTest() { authoringDocks.hide(); verify(uberfireDocks).disable(UberfireDockPosition.WEST, "authoring"); verify(uberfireDocks).disable(UberfireDockPosition.EAST, "authoring"); } @Test public void showWithDataModelerActiveTest() { final DataModelerContext dataModelerContext = mock(DataModelerContext.class); doReturn(DataModelerContext.EditionMode.GRAPHICAL_MODE).when(dataModelerContext).getEditionMode(); doReturn(dataModelerContext).when(dataModelerWBContext).getActiveContext(); authoringDocks.show(); verify(uberfireDocks).enable(UberfireDockPosition.WEST, "authoring"); verify(uberfireDocks).enable(UberfireDockPosition.EAST, "authoring"); } @Test public void showWithDataModelerInactiveTest() { authoringDocks.show(); verify(uberfireDocks).enable(UberfireDockPosition.WEST, "authoring"); verify(uberfireDocks, never()).enable(UberfireDockPosition.EAST, "authoring"); } @Test public void perspectiveChangedExpandProjectExplorerWhenEnabledTest() { UberfireDockReadyEvent event = new UberfireDockReadyEvent("authoring"); authoringDocks.perspectiveChangeEvent(event); verify(authoringDocks, times(1)).expandProjectExplorer(); } @Test public void perspectiveChangedDoesNotExpandProjectExplorerWhenDisabledTest() { authoringDocks.hide(); UberfireDockReadyEvent event = new UberfireDockReadyEvent("authoring"); authoringDocks.perspectiveChangeEvent(event); verify(authoringDocks, never()).expandProjectExplorer(); } @Test public void projectExplorerExpandedEvent_NotProjectExplorerDock() { final UberfireDocksInteractionEvent uberfireDocksInteractionEvent = createUberfireDocksInteractionEvent(mock(UberfireDock.class), UberfireDocksInteractionEvent.InteractionType.SELECTED); authoringDocks.projectExplorerExpandedEvent(uberfireDocksInteractionEvent); verify(authoringDocks, never()).setProjectExplorerExpandedPreference(anyBoolean()); } @Test public void projectExplorerExpandedEvent_SelectedInteraction() { final UberfireDocksInteractionEvent uberfireDocksInteractionEvent = createUberfireDocksInteractionEvent(authoringDocks.projectExplorerDock, UberfireDocksInteractionEvent.InteractionType.SELECTED); authoringDocks.projectExplorerExpandedEvent(uberfireDocksInteractionEvent); verify(authoringDocks).setProjectExplorerExpandedPreference(true); } @Test public void projectExplorerExpandedEvent_DeselectedInteraction() { final UberfireDocksInteractionEvent uberfireDocksInteractionEvent = createUberfireDocksInteractionEvent(authoringDocks.projectExplorerDock, UberfireDocksInteractionEvent.InteractionType.DESELECTED); authoringDocks.projectExplorerExpandedEvent(uberfireDocksInteractionEvent); verify(authoringDocks).setProjectExplorerExpandedPreference(false); } @Test public void projectExplorerExpandedEvent_ResizeInteraction() { final UberfireDocksInteractionEvent uberfireDocksInteractionEvent = createUberfireDocksInteractionEvent(authoringDocks.projectExplorerDock, UberfireDocksInteractionEvent.InteractionType.RESIZED); authoringDocks.projectExplorerExpandedEvent(uberfireDocksInteractionEvent); verify(authoringDocks, never()).setProjectExplorerExpandedPreference(anyBoolean()); } @Test public void projectExplorerExpandedEvent_WithNullTargetDock() { final UberfireDocksInteractionEvent uberfireDocksInteractionEvent = createUberfireDocksInteractionEvent(UberfireDockPosition.WEST, UberfireDocksInteractionEvent.InteractionType.RESIZED); authoringDocks.projectExplorerExpandedEvent(uberfireDocksInteractionEvent); verify(authoringDocks, never()).setProjectExplorerExpandedPreference(anyBoolean()); } private UberfireDocksInteractionEvent createUberfireDocksInteractionEvent(final UberfireDock uberfireDock, final UberfireDocksInteractionEvent.InteractionType interactionType) { return new UberfireDocksInteractionEvent(uberfireDock, interactionType); } private UberfireDocksInteractionEvent createUberfireDocksInteractionEvent(final UberfireDockPosition position, final UberfireDocksInteractionEvent.InteractionType interactionType) { return new UberfireDocksInteractionEvent(position, interactionType); } }