/*******************************************************************************
* Copyright (c) 2012-2016 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.ext.java.client.refactoring.move.wizard;
import com.google.gwtmockito.GwtMockitoTestRunner;
import org.eclipse.che.api.promises.client.Function;
import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.OperationException;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.promises.client.PromiseError;
import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.app.CurrentProject;
import org.eclipse.che.ide.api.editor.EditorAgent;
import org.eclipse.che.ide.api.notification.NotificationManager;
import org.eclipse.che.ide.dto.DtoFactory;
import org.eclipse.che.ide.ext.java.client.JavaLocalizationConstant;
import org.eclipse.che.ide.ext.java.client.navigation.service.JavaNavigationService;
import org.eclipse.che.ide.ext.java.client.project.node.JavaFileNode;
import org.eclipse.che.ide.ext.java.client.project.node.PackageNode;
import org.eclipse.che.ide.ext.java.client.refactoring.RefactorInfo;
import org.eclipse.che.ide.ext.java.client.refactoring.RefactoringUpdater;
import org.eclipse.che.ide.ext.java.client.refactoring.preview.PreviewPresenter;
import org.eclipse.che.ide.ext.java.client.refactoring.service.RefactoringServiceClient;
import org.eclipse.che.ide.ext.java.shared.dto.model.JavaProject;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.ChangeCreationResult;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.CreateMoveRefactoring;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.ElementToMove;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.MoveSettings;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringResult;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringSession;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringStatus;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.ReorgDestination;
import org.eclipse.che.ide.jseditor.client.texteditor.TextEditor;
import org.eclipse.che.ide.part.explorer.project.ProjectExplorerPresenter;
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 org.mockito.Mockito;
import java.util.ArrayList;
import java.util.List;
import static org.eclipse.che.ide.api.notification.StatusNotification.Status.FAIL;
import static org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringStatus.ERROR;
import static org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringStatus.FATAL;
import static org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringStatus.INFO;
import static org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringStatus.OK;
import static org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringStatus.WARNING;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyList;
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;
/**
* @author Valeriy Svydenko
*/
@RunWith(GwtMockitoTestRunner.class)
public class MovePresenterTest {
public static final String DESTINATION = "destaination";
public static final String PROJECT_PATH = "projectPAth";
// constructor params
@Mock
private MoveView moveView;
@Mock
private RefactoringUpdater refactoringUpdater;
@Mock
private AppContext appContext;
@Mock
private PreviewPresenter previewPresenter;
@Mock
private RefactoringServiceClient refactorService;
@Mock
private ProjectExplorerPresenter projectExplorer;
@Mock
private RefactoringSession session;
@Mock
private JavaNavigationService navigationService;
@Mock
private DtoFactory dtoFactory;
@Mock
private JavaLocalizationConstant locale;
@Mock
private NotificationManager notificationManager;
//local params
@Mock
private RefactorInfo refactorInfo;
@Mock
private RefactoringStatus refactoringStatus;
@Mock
private RefactoringResult refactoringResult;
@Mock
private ElementToMove javaElement;
@Mock
private TextEditor activeEditor;
@Mock
private CreateMoveRefactoring moveRefactoring;
@Mock
private CurrentProject currentProject;
@Mock
private PackageNode packageNode;
@Mock
private EditorAgent editorAgent;
@Mock
private ChangeCreationResult changeCreationResult;
@Mock
private MoveSettings moveSettings;
@Mock
private ReorgDestination destination;
@Mock
private JavaFileNode sourceFileNode;
@Mock
private ProjectConfigDto projectConfig;
@Mock
private Promise<String> sessionPromise;
@Mock
private Promise<Void> moveSettingsPromise;
@Mock
private Promise<ChangeCreationResult> changeCreationResultPromise;
@Mock
private Promise<List<JavaProject>> projectsPromise;
@Mock
private Promise<RefactoringStatus> refactoringStatusPromise;
@Mock
private Promise<RefactoringResult> refactoringResultPromise;
@Mock
private PromiseError promiseError;
@Captor
private ArgumentCaptor<Operation<String>> sessionOperation;
@Captor
private ArgumentCaptor<Operation<List<JavaProject>>> projectsOperation;
@Captor
private ArgumentCaptor<Operation<ChangeCreationResult>> changeResultOperation;
@Captor
private ArgumentCaptor<Function<Void, Promise<ChangeCreationResult>>> changeCreationFunction;
@Captor
private ArgumentCaptor<Operation<RefactoringStatus>> refactoringStatusOperation;
@Captor
private ArgumentCaptor<Operation<RefactoringResult>> refResultOperation;
@Captor
private ArgumentCaptor<Operation<PromiseError>> promiseErrorCaptor;
private MovePresenter presenter;
@SuppressWarnings("unchecked")
@Before
public void setUp() throws Exception {
List selectedItems = new ArrayList<>();
selectedItems.add(packageNode);
selectedItems.add(sourceFileNode);
when(editorAgent.getActiveEditor()).thenReturn(activeEditor);
when(refactorInfo.getSelectedItems()).thenReturn(selectedItems);
when(dtoFactory.createDto(ElementToMove.class)).thenReturn(javaElement);
when(dtoFactory.createDto(CreateMoveRefactoring.class)).thenReturn(moveRefactoring);
when(dtoFactory.createDto(ReorgDestination.class)).thenReturn(destination);
when(appContext.getCurrentProject()).thenReturn(currentProject);
when(currentProject.getProjectConfig()).thenReturn(projectConfig);
when(projectConfig.getPath()).thenReturn(PROJECT_PATH);
when(refactorService.createMoveRefactoring(moveRefactoring)).thenReturn(sessionPromise);
when(refactorService.applyRefactoring(session)).thenReturn(refactoringResultPromise);
when(refactorService.setDestination(destination)).thenReturn(refactoringStatusPromise);
when(navigationService.getProjectsAndPackages(true)).thenReturn(projectsPromise);
when(projectsPromise.then(Matchers.<Operation<List<JavaProject>>>anyObject())).thenReturn(projectsPromise);
when(dtoFactory.createDto(MoveSettings.class)).thenReturn(moveSettings);
when(dtoFactory.createDto(RefactoringSession.class)).thenReturn(session);
when(changeCreationResult.getStatus()).thenReturn(refactoringStatus);
when(refactorService.setMoveSettings(moveSettings)).thenReturn(moveSettingsPromise);
when(moveSettingsPromise.thenPromise(Matchers.<Function<Void, Promise<ChangeCreationResult>>>anyObject()))
.thenReturn(changeCreationResultPromise);
when(changeCreationResultPromise.then(Matchers.<Operation<ChangeCreationResult>>anyObject()))
.thenReturn(changeCreationResultPromise);
presenter = new MovePresenter(moveView,
refactoringUpdater,
appContext,
editorAgent,
previewPresenter,
refactorService,
navigationService,
dtoFactory,
locale,
notificationManager);
}
@Test
public void constructorShouldBePerformed() throws Exception {
verify(moveView).setDelegate(presenter);
}
@Test
public void moveWizardShouldBeShowed() throws Exception {
List<JavaProject> javaProjects = new ArrayList<>();
JavaProject javaProject = Mockito.mock(JavaProject.class);
javaProjects.add(javaProject);
when(sessionPromise.then(Matchers.<Operation<String>>anyObject())).thenReturn(sessionPromise);
when(sourceFileNode.getName()).thenReturn("file.name");
when(javaProject.getPath()).thenReturn(PROJECT_PATH);
presenter.show(refactorInfo);
verify(moveView).setEnablePreviewButton(false);
verify(moveView).setEnableAcceptButton(false);
verify(moveView).clearErrorLabel();
verify(moveRefactoring).setProjectPath(PROJECT_PATH);
verify(refactorService).createMoveRefactoring(moveRefactoring);
verify(packageNode).getStorablePath();
verify(sessionPromise).then(sessionOperation.capture());
sessionOperation.getValue().apply("sessionId");
verify(projectsPromise).then(projectsOperation.capture());
projectsOperation.getValue().apply(javaProjects);
verify(moveView).setTreeOfDestinations(any());
verify(moveView).show(refactorInfo);
}
@Test
public void showPreviewWindowWhenPreviewButtonClicked() throws Exception {
when(moveSettings.isUpdateQualifiedNames()).thenReturn(true);
when(changeCreationResult.isCanShowPreviewPage()).thenReturn(true);
presenter.onPreviewButtonClicked();
verify(moveSettings).setSessionId(anyString());
verify(moveSettings).setUpdateReferences(anyBoolean());
verify(moveSettings).setUpdateQualifiedNames(anyBoolean());
verify(moveSettings).setFilePatterns(anyString());
verify(session).setSessionId(anyString());
verify(moveSettingsPromise).thenPromise(changeCreationFunction.capture());
changeCreationFunction.getValue().apply(any());
verify(refactorService).createChange(session);
verify(changeCreationResultPromise).then(changeResultOperation.capture());
changeResultOperation.getValue().apply(changeCreationResult);
verify(previewPresenter).show(anyString(), any());
verify(moveView).hide();
}
@Test
public void errorMessageShouldBeShownDuringShowingPreviewDialog() throws OperationException {
presenter.onPreviewButtonClicked();
verify(changeCreationResultPromise).catchError(promiseErrorCaptor.capture());
promiseErrorCaptor.getValue().apply(promiseError);
verify(locale).showPreviewError();
verify(promiseError).getMessage();
verify(notificationManager).notify(anyString(), anyString(), eq(FAIL), eq(true));
}
@Test
public void showErrorMessageIfCanNotShowPreviewWindow() throws Exception {
when(moveSettings.isUpdateQualifiedNames()).thenReturn(true);
when(changeCreationResult.isCanShowPreviewPage()).thenReturn(false);
presenter.onPreviewButtonClicked();
verify(moveSettings).setSessionId(anyString());
verify(moveSettings).setUpdateReferences(anyBoolean());
verify(moveSettings).setUpdateQualifiedNames(anyBoolean());
verify(moveSettings).setFilePatterns(anyString());
verify(session).setSessionId(anyString());
verify(moveSettingsPromise).thenPromise(changeCreationFunction.capture());
changeCreationFunction.getValue().apply(any());
verify(refactorService).createChange(session);
verify(changeCreationResultPromise).then(changeResultOperation.capture());
changeResultOperation.getValue().apply(changeCreationResult);
verify(previewPresenter, never()).show(anyString(), any());
verify(moveView, never()).hide();
verify(moveView).showStatusMessage(refactoringStatus);
}
@Test
public void acceptButtonActionShouldShowAnErrorMessage() throws Exception {
when(moveSettings.isUpdateQualifiedNames()).thenReturn(true);
when(changeCreationResult.isCanShowPreviewPage()).thenReturn(false);
when(changeCreationResult.getStatus()).thenReturn(refactoringStatus);
presenter.onAcceptButtonClicked();
verify(moveSettings).setSessionId(anyString());
verify(moveSettings).setUpdateReferences(anyBoolean());
verify(moveSettings).setUpdateQualifiedNames(anyBoolean());
verify(moveSettings).setFilePatterns(anyString());
verify(session).setSessionId(anyString());
verify(moveSettingsPromise).thenPromise(changeCreationFunction.capture());
changeCreationFunction.getValue().apply(any());
verify(refactorService).createChange(session);
verify(changeCreationResultPromise).then(changeResultOperation.capture());
changeResultOperation.getValue().apply(changeCreationResult);
verify(moveView).showErrorMessage(refactoringStatus);
}
@Test
public void notificationShouldBeShownWhenSomeErrorOccursDuringAcceptMoving() throws OperationException {
presenter.onAcceptButtonClicked();
verify(changeCreationResultPromise).catchError(promiseErrorCaptor.capture());
promiseErrorCaptor.getValue().apply(promiseError);
verify(locale).applyMoveError();
verify(promiseError).getMessage();
verify(notificationManager).notify(anyString(), anyString(), eq(FAIL), eq(true));
}
@Test
public void acceptButtonActionShouldBePerformed() throws Exception {
when(moveSettings.isUpdateQualifiedNames()).thenReturn(true);
when(changeCreationResult.isCanShowPreviewPage()).thenReturn(true);
when(changeCreationResult.getStatus()).thenReturn(refactoringResult);
when(refactoringResult.getSeverity()).thenReturn(OK);
presenter.onAcceptButtonClicked();
verify(moveSettings).setSessionId(anyString());
verify(moveSettings).setUpdateReferences(anyBoolean());
verify(moveSettings).setUpdateQualifiedNames(anyBoolean());
verify(moveSettings).setFilePatterns(anyString());
verify(session).setSessionId(anyString());
verify(moveSettingsPromise).thenPromise(changeCreationFunction.capture());
changeCreationFunction.getValue().apply(any());
verify(refactorService).createChange(session);
verify(changeCreationResultPromise).then(changeResultOperation.capture());
changeResultOperation.getValue().apply(changeCreationResult);
verify(refactoringResultPromise).then(refResultOperation.capture());
refResultOperation.getValue().apply(refactoringResult);
verify(moveView).hide();
verify(refactoringUpdater).updateAfterRefactoring(Matchers.<RefactorInfo>any(), anyList());
verify(moveView, never()).showErrorMessage(refactoringResult);
}
@Test
public void errorLabelShouldBeShowedIfRefactoringStatusIsNotOK() throws Exception {
when(moveSettings.isUpdateQualifiedNames()).thenReturn(true);
when(changeCreationResult.isCanShowPreviewPage()).thenReturn(true);
when(changeCreationResult.getStatus()).thenReturn(refactoringResult);
when(refactoringResult.getSeverity()).thenReturn(2);
presenter.onAcceptButtonClicked();
verify(moveSettings).setSessionId(anyString());
verify(moveSettings).setUpdateReferences(anyBoolean());
verify(moveSettings).setUpdateQualifiedNames(anyBoolean());
verify(moveSettings).setFilePatterns(anyString());
verify(session).setSessionId(anyString());
verify(moveSettingsPromise).thenPromise(changeCreationFunction.capture());
changeCreationFunction.getValue().apply(any());
verify(refactorService).createChange(session);
verify(changeCreationResultPromise).then(changeResultOperation.capture());
changeResultOperation.getValue().apply(changeCreationResult);
verify(refactoringResultPromise).then(refResultOperation.capture());
refResultOperation.getValue().apply(refactoringResult);
verify(moveView, never()).hide();
verify(refactoringUpdater, never()).updateAfterRefactoring(Matchers.<RefactorInfo>any(), anyList());
verify(moveView).showErrorMessage(refactoringResult);
}
@Test
public void moveDestinationPathChangedWithOKStatus() throws Exception {
when(refactoringStatus.getSeverity()).thenReturn(OK);
presenter.setMoveDestinationPath(DESTINATION, PROJECT_PATH);
verify(destination).setType(ReorgDestination.DestinationType.PACKAGE);
verify(destination).setSessionId(anyString());
verify(destination).setProjectPath(PROJECT_PATH);
verify(destination).setDestination(DESTINATION);
verify(refactoringStatusPromise).then(refactoringStatusOperation.capture());
refactoringStatusOperation.getValue().apply(refactoringStatus);
verify(moveView).setEnableAcceptButton(true);
verify(moveView).setEnablePreviewButton(true);
verify(moveView).clearStatusMessage();
}
@Test
public void moveDestinationPathChangedWithINFOStatus() throws Exception {
when(refactoringStatus.getSeverity()).thenReturn(INFO);
presenter.setMoveDestinationPath(DESTINATION, PROJECT_PATH);
verify(destination).setType(ReorgDestination.DestinationType.PACKAGE);
verify(destination).setSessionId(anyString());
verify(destination).setProjectPath(PROJECT_PATH);
verify(destination).setDestination(DESTINATION);
verify(refactoringStatusPromise).then(refactoringStatusOperation.capture());
refactoringStatusOperation.getValue().apply(refactoringStatus);
verify(moveView).setEnableAcceptButton(true);
verify(moveView).setEnablePreviewButton(true);
verify(moveView).showStatusMessage(refactoringStatus);
}
@Test
public void moveDestinationPathChangedWithWARNINGStatus() throws Exception {
when(refactoringStatus.getSeverity()).thenReturn(WARNING);
presenter.setMoveDestinationPath(DESTINATION, PROJECT_PATH);
verify(destination).setType(ReorgDestination.DestinationType.PACKAGE);
verify(destination).setSessionId(anyString());
verify(destination).setProjectPath(PROJECT_PATH);
verify(destination).setDestination(DESTINATION);
verify(refactoringStatusPromise).then(refactoringStatusOperation.capture());
refactoringStatusOperation.getValue().apply(refactoringStatus);
verify(moveView).setEnableAcceptButton(true);
verify(moveView).setEnablePreviewButton(true);
verify(moveView).showStatusMessage(refactoringStatus);
}
@Test
public void moveDestinationPathChangedWithERRORStatus() throws Exception {
when(refactoringStatus.getSeverity()).thenReturn(ERROR);
presenter.setMoveDestinationPath(DESTINATION, PROJECT_PATH);
verify(destination).setType(ReorgDestination.DestinationType.PACKAGE);
verify(destination).setSessionId(anyString());
verify(destination).setProjectPath(PROJECT_PATH);
verify(destination).setDestination(DESTINATION);
verify(refactoringStatusPromise).then(refactoringStatusOperation.capture());
refactoringStatusOperation.getValue().apply(refactoringStatus);
verify(moveView).setEnableAcceptButton(true);
verify(moveView).setEnablePreviewButton(true);
verify(moveView).showErrorMessage(refactoringStatus);
verify(moveView).setEnableAcceptButton(false);
verify(moveView).setEnablePreviewButton(false);
}
@Test
public void moveDestinationPathChangedWithFATALStatus() throws Exception {
when(refactoringStatus.getSeverity()).thenReturn(FATAL);
presenter.setMoveDestinationPath(DESTINATION, PROJECT_PATH);
verify(destination).setType(ReorgDestination.DestinationType.PACKAGE);
verify(destination).setSessionId(anyString());
verify(destination).setProjectPath(PROJECT_PATH);
verify(destination).setDestination(DESTINATION);
verify(refactoringStatusPromise).then(refactoringStatusOperation.capture());
refactoringStatusOperation.getValue().apply(refactoringStatus);
verify(moveView).setEnableAcceptButton(true);
verify(moveView).setEnablePreviewButton(true);
verify(moveView).showErrorMessage(refactoringStatus);
verify(moveView).setEnableAcceptButton(false);
verify(moveView).setEnablePreviewButton(false);
}
@Test
public void focusShouldBeSetAfterClosingTheEditor() throws Exception {
presenter.onCancelButtonClicked();
verify(activeEditor).setFocus();
}
}