/*
* Copyright 2017 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.screens.library.client.util;
import javax.enterprise.event.Event;
import org.ext.uberfire.social.activities.model.ExtendedTypes;
import org.ext.uberfire.social.activities.model.SocialFileSelectedEvent;
import org.guvnor.common.services.project.context.ProjectContext;
import org.guvnor.common.services.project.context.ProjectContextChangeEvent;
import org.guvnor.common.services.project.events.DeleteProjectEvent;
import org.guvnor.common.services.project.events.RenameProjectEvent;
import org.guvnor.common.services.project.model.Project;
import org.guvnor.common.services.project.social.ProjectEventType;
import org.guvnor.structure.organizationalunit.OrganizationalUnit;
import org.guvnor.structure.repositories.Repository;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.ioc.client.api.ManagedInstance;
import org.jboss.errai.ui.client.local.spi.TranslationService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.workbench.common.screens.examples.client.wizard.ExamplesWizard;
import org.kie.workbench.common.screens.explorer.model.URIStructureExplorerModel;
import org.kie.workbench.common.screens.explorer.service.ExplorerService;
import org.kie.workbench.common.screens.library.api.LibraryService;
import org.kie.workbench.common.screens.library.api.ProjectInfo;
import org.kie.workbench.common.screens.library.client.events.AssetDetailEvent;
import org.kie.workbench.common.screens.library.client.events.ProjectDetailEvent;
import org.kie.workbench.common.screens.library.client.perspective.LibraryPerspective;
import org.kie.workbench.common.screens.library.client.widgets.LibraryToolbarPresenter;
import org.kie.workbench.common.workbench.client.docks.AuthoringWorkbenchDocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.uberfire.backend.vfs.ObservablePath;
import org.uberfire.backend.vfs.Path;
import org.uberfire.backend.vfs.VFSService;
import org.uberfire.client.mvp.PlaceManager;
import org.uberfire.client.mvp.PlaceStatus;
import org.uberfire.client.workbench.events.PlaceGainFocusEvent;
import org.uberfire.ext.widgets.common.client.breadcrumbs.UberfireBreadcrumbs;
import org.uberfire.mocks.CallerMock;
import org.uberfire.mvp.PlaceRequest;
import org.uberfire.mvp.impl.ConditionalPlaceRequest;
import org.uberfire.mvp.impl.DefaultPlaceRequest;
import org.uberfire.mvp.impl.PathPlaceRequest;
import org.uberfire.workbench.events.NotificationEvent;
import org.uberfire.workbench.model.PanelDefinition;
import org.uberfire.workbench.model.impl.PartDefinitionImpl;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class LibraryPlacesTest {
@Mock
private UberfireBreadcrumbs breadcrumbs;
@Mock
private TranslationService ts;
@Mock
private Event<ProjectDetailEvent> projectDetailEvent;
@Mock
private Event<AssetDetailEvent> assetDetailEvent;
@Mock
private ResourceUtils resourceUtils;
@Mock
private LibraryService libraryService;
private Caller<LibraryService> libraryServiceCaller;
@Mock
private PlaceManager placeManager;
@Mock
private LibraryPerspective libraryPerspective;
@Mock
private ProjectContext projectContext;
@Mock
private LibraryToolbarPresenter libraryToolbar;
@Mock
private AuthoringWorkbenchDocks docks;
@Mock
private Event<ProjectContextChangeEvent> projectContextChangeEvent;
@Mock
private ExamplesUtils examplesUtils;
@Mock
private Event<NotificationEvent> notificationEvent;
@Mock
private ManagedInstance<ExamplesWizard> examplesWizards;
@Mock
private TranslationUtils translationUtils;
@Mock
private VFSService vfsService;
private Caller<VFSService> vfsServiceCaller;
@Mock
private ExplorerService explorerService;
private Caller<ExplorerService> explorerServiceCaller;
private LibraryPlaces libraryPlaces;
private OrganizationalUnit activeOrganizationalUnit;
private Repository activeRepository;
private String activeBranch;
private Project activeProject;
private boolean isProjectExplorerExpanded = false;
@Before
public void setup() {
libraryServiceCaller = new CallerMock<>(libraryService);
vfsServiceCaller = new CallerMock<>(vfsService);
explorerServiceCaller = new CallerMock<>(explorerService);
libraryPlaces = spy(new LibraryPlaces(breadcrumbs,
ts,
projectDetailEvent,
assetDetailEvent,
resourceUtils,
libraryServiceCaller,
placeManager,
libraryPerspective,
projectContext,
libraryToolbar,
docks,
projectContextChangeEvent,
examplesUtils,
notificationEvent,
examplesWizards,
translationUtils,
vfsServiceCaller,
explorerServiceCaller));
activeOrganizationalUnit = mock(OrganizationalUnit.class);
activeRepository = mock(Repository.class);
activeBranch = "master";
activeProject = mock(Project.class);
doReturn(activeOrganizationalUnit).when(projectContext).getActiveOrganizationalUnit();
doReturn(activeRepository).when(projectContext).getActiveRepository();
doReturn(activeBranch).when(projectContext).getActiveBranch();
doReturn(activeProject).when(projectContext).getActiveProject();
final URIStructureExplorerModel model = mock(URIStructureExplorerModel.class);
doReturn(mock(Repository.class)).when(model).getRepository();
doReturn(mock(Project.class)).when(model).getProject();
doReturn(model).when(explorerService).getURIStructureExplorerModel(any());
doReturn(mock(Path.class)).when(vfsService).get(any());
doNothing().when(libraryPlaces).setupToolBar();
doNothing().when(libraryPlaces).setupLibraryBreadCrumbs();
doNothing().when(libraryPlaces).setupLibraryBreadCrumbsForNewProject();
doNothing().when(libraryPlaces).setupLibraryBreadCrumbsForProject(any(ProjectInfo.class));
doNothing().when(libraryPlaces).setupLibraryBreadCrumbsForAsset(any(ProjectInfo.class),
any(Path.class));
final PathPlaceRequest pathPlaceRequest = mock(PathPlaceRequest.class);
doReturn(mock(ObservablePath.class)).when(pathPlaceRequest).getPath();
doReturn(pathPlaceRequest).when(libraryPlaces).createPathPlaceRequest(any());
doReturn(true).when(placeManager).closeAllPlacesOrNothing();
}
@Test
public void onSelectPlaceOutsideLibraryTest() {
doReturn(PlaceStatus.CLOSE).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
doReturn(PlaceStatus.CLOSE).when(placeManager).getStatus(any(PlaceRequest.class));
final PlaceGainFocusEvent placeGainFocusEvent = mock(PlaceGainFocusEvent.class);
libraryPlaces.onSelectPlaceEvent(placeGainFocusEvent);
verify(placeGainFocusEvent,
never()).getPlace();
}
@Test
public void onSelectAssetTest() {
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
final ObservablePath path = mock(ObservablePath.class);
final PathPlaceRequest pathPlaceRequest = mock(PathPlaceRequest.class);
doReturn(path).when(pathPlaceRequest).getPath();
final PlaceGainFocusEvent placeGainFocusEvent = mock(PlaceGainFocusEvent.class);
doReturn(pathPlaceRequest).when(placeGainFocusEvent).getPlace();
libraryPlaces.onSelectPlaceEvent(placeGainFocusEvent);
verify(libraryPlaces).setupLibraryBreadCrumbsForAsset(libraryPlaces.getProjectInfo(),
path);
verify(libraryPlaces).showDocks();
}
@Test
public void onSelectProjectSettingsTest() {
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
final DefaultPlaceRequest projectSettingsPlaceRequest = new DefaultPlaceRequest(LibraryPlaces.PROJECT_SETTINGS);
final PlaceGainFocusEvent placeGainFocusEvent = mock(PlaceGainFocusEvent.class);
doReturn(projectSettingsPlaceRequest).when(placeGainFocusEvent).getPlace();
libraryPlaces.onSelectPlaceEvent(placeGainFocusEvent);
verify(libraryPlaces).hideDocks();
verify(libraryPlaces).setupLibraryBreadCrumbsForAsset(libraryPlaces.getProjectInfo(),
null);
}
@Test
public void onSelectProjectTest() {
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
final DefaultPlaceRequest projectSettingsPlaceRequest = new DefaultPlaceRequest(LibraryPlaces.PROJECT_SCREEN);
final PlaceGainFocusEvent placeGainFocusEvent = mock(PlaceGainFocusEvent.class);
doReturn(projectSettingsPlaceRequest).when(placeGainFocusEvent).getPlace();
libraryPlaces.onSelectPlaceEvent(placeGainFocusEvent);
verify(libraryPlaces).hideDocks();
verify(libraryPlaces).setupLibraryBreadCrumbsForProject(libraryPlaces.getProjectInfo());
}
@Test
public void onSelectLibraryTest() {
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
final DefaultPlaceRequest projectSettingsPlaceRequest = new DefaultPlaceRequest(LibraryPlaces.LIBRARY_SCREEN);
final PlaceGainFocusEvent placeGainFocusEvent = mock(PlaceGainFocusEvent.class);
doReturn(projectSettingsPlaceRequest).when(placeGainFocusEvent).getPlace();
libraryPlaces.onSelectPlaceEvent(placeGainFocusEvent);
verify(libraryPlaces).hideDocks();
verify(libraryPlaces).setupLibraryBreadCrumbs();
}
@Test
public void hideDocksTest() {
libraryPlaces.showDocks();
reset(docks);
libraryPlaces.hideDocks();
libraryPlaces.hideDocks();
verify(docks,
times(1)).hide();
verify(docks,
never()).setup(anyString(),
any(PlaceRequest.class));
verify(docks,
never()).show();
verify(docks,
never()).expandProjectExplorer();
}
@Test
public void showDocksTest() {
libraryPlaces.showDocks();
libraryPlaces.showDocks();
verify(docks,
times(1)).setup(LibraryPlaces.LIBRARY_PERSPECTIVE,
new DefaultPlaceRequest(LibraryPlaces.PROJECT_EXPLORER));
verify(docks,
times(1)).show();
verify(docks,
never()).hide();
}
@Test
public void projectContextUnchanged() {
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
doReturn(activeRepository).when(libraryToolbar).getSelectedRepository();
doReturn(activeBranch).when(libraryToolbar).getSelectedBranch();
doReturn(activeProject).when(projectContext).getActiveProject();
libraryPlaces.goToProject(new ProjectInfo(activeOrganizationalUnit,
activeRepository,
activeBranch,
activeProject),
false);
Mockito.reset(libraryPlaces);
libraryPlaces.projectContextChange();
verify(libraryToolbar,
never()).setSelectedInfo(any(),
any(),
any());
verify(libraryPlaces,
never()).goToProject(any(),
anyBoolean());
}
@Test
public void projectContextChanged_OrganizationalUnit() {
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
doReturn(activeRepository).when(libraryToolbar).getSelectedRepository();
doReturn(activeBranch).when(libraryToolbar).getSelectedBranch();
final OrganizationalUnit newOrganizationalUnit = mock(OrganizationalUnit.class);
doReturn(newOrganizationalUnit).when(projectContext).getActiveOrganizationalUnit();
doReturn(null).when(projectContext).getActiveRepository();
doReturn(null).when(projectContext).getActiveProject();
libraryPlaces.projectContextChange();
verify(libraryToolbar,
never()).setSelectedInfo(any(),
any(),
any());
verify(libraryPlaces,
never()).goToProject(any(),
anyBoolean());
}
@Test
public void projectContextChanged_Project() {
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
doReturn(activeRepository).when(libraryToolbar).getSelectedRepository();
doReturn(activeBranch).when(libraryToolbar).getSelectedBranch();
final Project newProject = mock(Project.class);
doReturn(newProject).when(projectContext).getActiveProject();
libraryPlaces.goToProject(new ProjectInfo(activeOrganizationalUnit,
activeRepository,
activeBranch,
activeProject),
false);
Mockito.reset(libraryPlaces);
libraryPlaces.projectContextChange();
verify(libraryToolbar,
never()).setSelectedInfo(any(),
any(),
any());
verify(libraryPlaces).goToProject(new ProjectInfo(activeOrganizationalUnit,
activeRepository,
activeBranch,
newProject),
false);
}
@Test
public void goToOrganizationalUnitsTest() {
final PlaceRequest placeRequest = new DefaultPlaceRequest(LibraryPlaces.ORGANIZATIONAL_UNITS_SCREEN);
final PartDefinitionImpl part = new PartDefinitionImpl(placeRequest);
part.setSelectable(false);
libraryPlaces.goToOrganizationalUnits();
verify(placeManager).closeAllPlacesOrNothing();
verify(placeManager).goTo(eq(part),
any(PanelDefinition.class));
verify(libraryPlaces).setupLibraryBreadCrumbsForOrganizationUnits();
verify(projectContextChangeEvent).fire(any(ProjectContextChangeEvent.class));
}
@Test
public void goToAssetTest() {
final ObservablePath path = mock(ObservablePath.class);
final PathPlaceRequest pathPlaceRequest = mock(PathPlaceRequest.class);
doReturn(path).when(pathPlaceRequest).getPath();
doReturn(pathPlaceRequest).when(libraryPlaces).createPathPlaceRequest(any(Path.class));
libraryPlaces.goToAsset(libraryPlaces.getProjectInfo(),
path);
verify(placeManager).goTo(pathPlaceRequest);
}
@Test
public void goToProjectSettingsTest() {
final DefaultPlaceRequest placeRequest = new DefaultPlaceRequest(LibraryPlaces.PROJECT_SETTINGS);
libraryPlaces.goToAsset(libraryPlaces.getProjectInfo(),
null);
verify(placeManager).goTo(placeRequest);
}
@Test
public void goToLibraryTest() {
final PlaceRequest placeRequest = new ConditionalPlaceRequest(LibraryPlaces.LIBRARY_SCREEN)
.when(p -> false)
.orElse(new DefaultPlaceRequest(LibraryPlaces.EMPTY_LIBRARY_SCREEN));
final PartDefinitionImpl part = new PartDefinitionImpl(placeRequest);
part.setSelectable(false);
libraryPlaces.goToLibrary();
verify(libraryPlaces).closeLibraryPlaces();
verify(placeManager).goTo(eq(part),
any(PanelDefinition.class));
verify(libraryPlaces).setupLibraryBreadCrumbs();
verify(projectContextChangeEvent).fire(any(ProjectContextChangeEvent.class));
}
@Test
public void goToNewProjectTest() {
final DefaultPlaceRequest placeRequest = new DefaultPlaceRequest(LibraryPlaces.NEW_PROJECT_SCREEN);
final PartDefinitionImpl part = new PartDefinitionImpl(placeRequest);
part.setSelectable(false);
libraryPlaces.goToNewProject();
verify(libraryPlaces).closeLibraryPlaces();
verify(placeManager).goTo(eq(part),
any(PanelDefinition.class));
verify(libraryPlaces).setupLibraryBreadCrumbsForNewProject();
}
@Test
public void goToProjectTest() {
final PlaceRequest projectScreen = new ConditionalPlaceRequest(LibraryPlaces.PROJECT_SCREEN)
.when(p -> false)
.orElse(new DefaultPlaceRequest(LibraryPlaces.EMPTY_PROJECT_SCREEN));
final PartDefinitionImpl part = new PartDefinitionImpl(projectScreen);
part.setSelectable(false);
final ProjectInfo projectInfo = new ProjectInfo(activeOrganizationalUnit,
activeRepository,
activeBranch,
activeProject);
libraryPlaces.goToProject(projectInfo);
verify(placeManager).goTo(eq(part),
any(PanelDefinition.class));
verify(projectDetailEvent).fire(any(ProjectDetailEvent.class));
verify(projectContextChangeEvent).fire(any(ProjectContextChangeEvent.class));
verify(libraryPlaces).setupLibraryBreadCrumbsForProject(projectInfo);
verify(placeManager).closeAllPlacesOrNothing();
}
@Test
public void goToSameProjectTest() {
final ProjectInfo projectInfo = new ProjectInfo(activeOrganizationalUnit,
activeRepository,
activeBranch,
activeProject);
libraryPlaces.goToProject(projectInfo);
libraryPlaces.goToProject(projectInfo);
verify(placeManager,
times(1)).closeAllPlacesOrNothing();
}
@Test
public void goToImportProjectWizardTest() {
final ExamplesWizard examplesWizard = mock(ExamplesWizard.class);
doReturn(examplesWizard).when(examplesWizards).get();
libraryPlaces.goToImportProjectWizard();
verify(examplesWizard).start();
verify(examplesWizard).setDefaultTargetOrganizationalUnit(anyString());
verify(examplesWizard).setDefaultTargetRepository(anyString());
}
@Test
public void goToMessages() {
libraryPlaces.goToMessages();
verify(placeManager).goTo(LibraryPlaces.MESSAGES);
}
@Test
public void projectDeletedRedirectsToLibraryWhenItIsOpenedTest() {
final Project activeProject = mock(Project.class);
final DeleteProjectEvent deleteProjectEvent = mock(DeleteProjectEvent.class);
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
doReturn(activeProject).when(deleteProjectEvent).getProject();
libraryPlaces.goToProject(new ProjectInfo(projectContext.getActiveOrganizationalUnit(),
projectContext.getActiveRepository(),
projectContext.getActiveBranch(),
activeProject));
libraryPlaces.projectDeleted(deleteProjectEvent);
verify(libraryPlaces).goToLibrary();
verify(notificationEvent).fire(any());
}
@Test
public void projectDeletedDoesNotRedirectToLibraryWhenItIsNotOpenedTest() {
final Project activeProject = mock(Project.class);
final Project deletedProject = mock(Project.class);
final DeleteProjectEvent deleteProjectEvent = mock(DeleteProjectEvent.class);
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
doReturn(activeProject).when(projectContext).getActiveProject();
doReturn(deletedProject).when(deleteProjectEvent).getProject();
libraryPlaces.projectDeleted(deleteProjectEvent);
verify(libraryPlaces,
never()).goToLibrary();
verify(notificationEvent,
never()).fire(any());
}
@Test
public void breadcrumbIsUpdatedWhenActiveProjectIsRenamedTest() {
final Project activeProject = mock(Project.class);
final Project renamedProject = mock(Project.class);
final RenameProjectEvent renameProjectEvent = mock(RenameProjectEvent.class);
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
doReturn(activeProject).when(projectContext).getActiveProject();
doReturn(activeProject).when(renameProjectEvent).getOldProject();
doReturn(renamedProject).when(renameProjectEvent).getNewProject();
libraryPlaces.projectRenamed(renameProjectEvent);
verify(libraryPlaces).setupLibraryBreadCrumbsForAsset(new ProjectInfo(projectContext.getActiveOrganizationalUnit(),
projectContext.getActiveRepository(),
projectContext.getActiveBranch(),
renameProjectEvent.getNewProject()),
null);
}
@Test
public void breadcrumbIsNotUpdatedWhenInactiveProjectIsRenamedTest() {
final Project activeProject = mock(Project.class);
final Project renamedProject = mock(Project.class);
final Project otherProject = mock(Project.class);
final RenameProjectEvent renameProjectEvent = mock(RenameProjectEvent.class);
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
doReturn(activeProject).when(projectContext).getActiveProject();
doReturn(otherProject).when(renameProjectEvent).getOldProject();
doReturn(renamedProject).when(renameProjectEvent).getNewProject();
libraryPlaces.projectRenamed(renameProjectEvent);
verify(libraryPlaces,
never()).setupLibraryBreadCrumbsForAsset(any(),
any());
}
@Test
public void testOnSocialFileSelected_Repository() {
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
final SocialFileSelectedEvent event = new SocialFileSelectedEvent(ExtendedTypes.NEW_REPOSITORY_EVENT.name(),
null);
libraryPlaces.onSocialFileSelected(event);
verify(placeManager).goTo(LibraryPlaces.REPOSITORY_STRUCTURE_SCREEN);
}
@Test
public void testOnSocialFileSelected_Project() {
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
final PlaceRequest libraryPerspective = libraryPlaces.getLibraryPlaceRequestWithoutRefresh();
final SocialFileSelectedEvent event = new SocialFileSelectedEvent(ProjectEventType.NEW_PROJECT.name(),
null);
libraryPlaces.onSocialFileSelected(event);
verify(placeManager).goTo(libraryPerspective);
verify(libraryPlaces).goToProject(any(ProjectInfo.class));
}
@Test
public void testOnSocialFileSelected_Asset() {
doReturn(PlaceStatus.OPEN).when(placeManager).getStatus(LibraryPlaces.LIBRARY_PERSPECTIVE);
final PlaceRequest libraryPerspective = libraryPlaces.getLibraryPlaceRequestWithoutRefresh();
final SocialFileSelectedEvent event = new SocialFileSelectedEvent("any",
"uri");
libraryPlaces.onSocialFileSelected(event);
verify(placeManager).goTo(libraryPerspective);
verify(libraryPlaces).goToAsset(any(ProjectInfo.class), any(Path.class));
}
}