/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.part.explorer.project.synchronize; import com.google.common.base.Optional; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwtmockito.GwtMockitoTestRunner; import org.eclipse.che.api.promises.client.Operation; import org.eclipse.che.api.promises.client.Promise; import org.eclipse.che.api.workspace.shared.dto.SourceStorageDto; import org.eclipse.che.ide.CoreLocalizationConstant; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.dialogs.CancelCallback; import org.eclipse.che.ide.api.dialogs.ConfirmCallback; import org.eclipse.che.ide.api.dialogs.ConfirmDialog; import org.eclipse.che.ide.api.dialogs.DialogFactory; import org.eclipse.che.ide.api.notification.NotificationManager; import org.eclipse.che.ide.api.resources.Container; import org.eclipse.che.ide.api.resources.Project; import org.eclipse.che.ide.api.resources.marker.Marker; import org.eclipse.che.ide.part.explorer.project.ProjectExplorerPresenter; import org.eclipse.che.ide.resources.tree.ResourceNode; import org.eclipse.che.ide.ui.smartTree.NodeLoader; import org.eclipse.che.ide.ui.smartTree.Tree; import org.eclipse.che.ide.ui.smartTree.event.BeforeLoadEvent; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Matchers; import org.mockito.Mock; import java.util.HashMap; import java.util.Map; import static org.eclipse.che.ide.api.notification.StatusNotification.DisplayMode.EMERGE_MODE; import static org.eclipse.che.ide.api.notification.StatusNotification.Status.SUCCESS; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(GwtMockitoTestRunner.class) public class ProjectConfigSynchronizedTest { private final static String PROJECT_NAME = "project name"; private final static String PROJECT_LOCATION = "/project/location"; private final static String SYNCH_DIALOG_TITLE = "Synchronize dialog title"; private final static String SYNCH_DIALOG_CONTENT = "Synchronize dialog content"; private final static String IMPORT_BUTTON = "Import"; private final static String REMOVE_BUTTON = "Remove"; @Mock private AppContext appContext; @Mock private ProjectExplorerPresenter projectExplorerPresenter; @Mock private DialogFactory dialogFactory; @Mock private CoreLocalizationConstant locale; @Mock private NotificationManager notificationManager; @Mock private ChangeLocationWidget changeLocationWidget; @Mock private Optional<Marker> problemMarker; @Mock private Project.ProblemProjectMarker problemProjectMarker; @Mock private ConfirmDialog confirmDialog; @Mock private ConfirmDialog changeConfirmDialog; @Mock private Promise<Void> deleteProjectPromise; @Mock private Promise<Project> projectPromise; @Mock private SourceStorageDto sourceStorage; @Mock private BeforeLoadEvent beforeLoadEvent; @Mock private Container wsRoot; @Mock private Project.ProjectRequest projectRequest; @Mock private Tree tree; @Mock private NodeLoader nodeLoader; @Mock private ResourceNode requestedNode; @Mock private Project resource; @Captor private ArgumentCaptor<ConfirmCallback> confirmCallbackArgumentCaptor; @Captor private ArgumentCaptor<CancelCallback> cancelCallbackArgumentCaptor; @Captor private ArgumentCaptor<Operation<Void>> projectDeleted; @Captor private ArgumentCaptor<BeforeLoadEvent.BeforeLoadHandler> beforeLoadHandlerArgumentCaptor; private Map<Integer, String> problems; @Before public void setUp() { when(resource.getMarker(Project.ProblemProjectMarker.PROBLEM_PROJECT)).thenReturn(problemMarker); when(resource.getName()).thenReturn(PROJECT_NAME); when(problemMarker.isPresent()).thenReturn(true); when(problemMarker.get()).thenReturn(problemProjectMarker); when(projectExplorerPresenter.getTree()).thenReturn(tree); when(tree.getNodeLoader()).thenReturn(nodeLoader); when(beforeLoadEvent.getRequestedNode()).thenReturn(requestedNode); when(requestedNode.getData()).thenReturn(resource); when(resource.isProject()).thenReturn(true); problems = new HashMap<>(); problems.put(10, "Error project"); when(problemProjectMarker.getProblems()).thenReturn(problems); when(locale.synchronizeDialogTitle()).thenReturn(SYNCH_DIALOG_TITLE); when(locale.existInWorkspaceDialogContent(PROJECT_NAME)).thenReturn(SYNCH_DIALOG_CONTENT); when(locale.buttonImport()).thenReturn(IMPORT_BUTTON); when(locale.buttonRemove()).thenReturn(REMOVE_BUTTON); when(dialogFactory.createConfirmDialog(anyString(), anyString(), anyString(), anyString(), anyObject(), anyObject())).thenReturn(confirmDialog); when(resource.getSource()).thenReturn(sourceStorage); when(sourceStorage.getLocation()).thenReturn(PROJECT_LOCATION); when(appContext.getWorkspaceRoot()).thenReturn(wsRoot); when(wsRoot.importProject()).thenReturn(projectRequest); when(projectRequest.withBody(anyObject())).thenReturn(projectRequest); when(projectRequest.send()).thenReturn(projectPromise); ProjectConfigSynchronized projectConfigSynchronized = new ProjectConfigSynchronized(appContext, projectExplorerPresenter, dialogFactory, locale, notificationManager, changeLocationWidget); } private void subscribeToOnBeforeLoadNodeEvent() throws Exception { verify(nodeLoader).addBeforeLoadHandler(beforeLoadHandlerArgumentCaptor.capture()); beforeLoadHandlerArgumentCaptor.getValue().onBeforeLoad(beforeLoadEvent); } @Test public void dialogIsNotShownIfProjectHasNotMarkers() throws Exception { when(problemMarker.isPresent()).thenReturn(false); subscribeToOnBeforeLoadNodeEvent(); verify(confirmDialog, never()).show(); } @Test public void dialogIsNotShownIfNoProjectProblem() throws Exception { problems.clear(); subscribeToOnBeforeLoadNodeEvent(); verify(confirmDialog, never()).show(); } @Test public void removeButtonIsClicked() throws Exception { String projectRemoved = "project removed"; when(resource.delete()).thenReturn(deleteProjectPromise); when(deleteProjectPromise.then(Matchers.<Operation<Void>>any())).thenReturn(deleteProjectPromise); when(locale.projectRemoved(PROJECT_NAME)).thenReturn(projectRemoved); subscribeToOnBeforeLoadNodeEvent(); verify(dialogFactory).createConfirmDialog(eq(SYNCH_DIALOG_TITLE), eq(SYNCH_DIALOG_CONTENT), eq(IMPORT_BUTTON), eq(REMOVE_BUTTON), confirmCallbackArgumentCaptor.capture(), cancelCallbackArgumentCaptor.capture()); verify(confirmDialog).show(); cancelCallbackArgumentCaptor.getValue().cancelled(); verify(resource).delete(); verify(deleteProjectPromise).then(projectDeleted.capture()); projectDeleted.getValue().apply(null); verify(notificationManager).notify(projectRemoved, SUCCESS, EMERGE_MODE); } @Test public void importButtonIsClicked() throws Exception { subscribeToOnBeforeLoadNodeEvent(); verify(dialogFactory).createConfirmDialog(eq(SYNCH_DIALOG_TITLE), eq(SYNCH_DIALOG_CONTENT), eq(IMPORT_BUTTON), eq(REMOVE_BUTTON), confirmCallbackArgumentCaptor.capture(), cancelCallbackArgumentCaptor.capture()); verify(confirmDialog).show(); confirmCallbackArgumentCaptor.getValue().accepted(); verify(wsRoot).importProject(); verify(projectRequest).withBody(resource); verify(projectRequest).send(); } @Test public void changeLocationWindowShouldBeShown() throws Exception { String newLocation = "new/location"; when(sourceStorage.getLocation()).thenReturn(null); when(changeLocationWidget.getText()).thenReturn(newLocation); when(dialogFactory.createConfirmDialog(anyString(), Matchers.<IsWidget>any(), anyObject(), anyObject())).thenReturn(changeConfirmDialog); subscribeToOnBeforeLoadNodeEvent(); verify(dialogFactory).createConfirmDialog(eq(SYNCH_DIALOG_TITLE), eq(SYNCH_DIALOG_CONTENT), eq(IMPORT_BUTTON), eq(REMOVE_BUTTON), confirmCallbackArgumentCaptor.capture(), cancelCallbackArgumentCaptor.capture()); verify(confirmDialog).show(); confirmCallbackArgumentCaptor.getValue().accepted(); verify(dialogFactory).createConfirmDialog(eq(SYNCH_DIALOG_TITLE), eq(changeLocationWidget), confirmCallbackArgumentCaptor.capture(), eq(null)); verify(changeConfirmDialog).show(); confirmCallbackArgumentCaptor.getValue().accepted(); verify(sourceStorage).setLocation(newLocation); verify(sourceStorage).setType("github"); verify(wsRoot).importProject(); verify(projectRequest).withBody(resource); verify(projectRequest).send(); } }