/*******************************************************************************
* 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.ext.java.client.refactoring.move.wizard;
import com.google.common.base.Optional;
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.ide.api.editor.EditorAgent;
import org.eclipse.che.ide.api.editor.texteditor.TextEditor;
import org.eclipse.che.ide.api.event.ng.ClientServerEventService;
import org.eclipse.che.ide.api.notification.NotificationManager;
import org.eclipse.che.ide.api.resources.Container;
import org.eclipse.che.ide.api.resources.File;
import org.eclipse.che.ide.api.resources.Project;
import org.eclipse.che.ide.api.resources.Resource;
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.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.client.resource.SourceFolderMarker;
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.ChangeInfo;
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.resource.Path;
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.DisplayMode.FLOAT_MODE;
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
* @author Vlad Zhukovskyi
*/
@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 PreviewPresenter previewPresenter;
@Mock
private RefactoringServiceClient refactorService;
@Mock
private RefactoringSession session;
@Mock
private JavaNavigationService navigationService;
@Mock
private DtoFactory dtoFactory;
@Mock
private JavaLocalizationConstant locale;
@Mock
private NotificationManager notificationManager;
@Mock
private EditorAgent editorAgent;
//local params
@Mock
private RefactorInfo refactorInfo;
@Mock
private File file;
@Mock
private Container srcFolder;
@Mock
private Project relatedProject;
@Mock
private RefactoringStatus refactoringStatus;
@Mock
private RefactoringResult refactoringResult;
@Mock
private ElementToMove javaElement;
@Mock
private TextEditor activeEditor;
@Mock
private CreateMoveRefactoring moveRefactoring;
@Mock
private ChangeCreationResult changeCreationResult;
@Mock
private MoveSettings moveSettings;
@Mock
private ReorgDestination destination;
@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 Promise<Void> updateAfterRefactoringPromise;
@Mock
private Promise<Void> fileTrackingSuspendEventPromise;
@Mock
private Promise<Void> handleMovingFilesPromise;
@Mock
private PromiseError promiseError;
@Mock
private ClientServerEventService clientServerEventService;
@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;
@Captor
private ArgumentCaptor<Operation<Void>> clientServerSuspendOperation;
@Captor
private ArgumentCaptor<Operation<Void>> updateAfterRefactoringOperation;
private MovePresenter presenter;
@SuppressWarnings("unchecked")
@Before
public void setUp() throws Exception {
when(editorAgent.getActiveEditor()).thenReturn(activeEditor);
when(dtoFactory.createDto(ElementToMove.class)).thenReturn(javaElement);
when(dtoFactory.createDto(CreateMoveRefactoring.class)).thenReturn(moveRefactoring);
when(dtoFactory.createDto(ReorgDestination.class)).thenReturn(destination);
when(refactorService.createMoveRefactoring(moveRefactoring)).thenReturn(sessionPromise);
when(sessionPromise.then(any(Operation.class))).thenReturn(sessionPromise);
when(refactorService.applyRefactoring(session)).thenReturn(refactoringResultPromise);
when(refactorService.setDestination(destination)).thenReturn(refactoringStatusPromise);
when(navigationService.getProjectsAndPackages(true)).thenReturn(projectsPromise);
when(projectsPromise.then(any(Operation.class))).thenReturn(projectsPromise);
when(dtoFactory.createDto(MoveSettings.class)).thenReturn(moveSettings);
when(dtoFactory.createDto(RefactoringSession.class)).thenReturn(session);
when(changeCreationResult.getStatus()).thenReturn(refactoringStatus);
when(clientServerEventService.sendFileTrackingSuspendEvent()).thenReturn(fileTrackingSuspendEventPromise);
List<ChangeInfo> changes = new ArrayList<>();
when(refactoringResult.getChanges()).thenReturn(changes);
when(refactoringUpdater.handleMovingFiles(anyList())).thenReturn(handleMovingFilesPromise);
when(refactoringUpdater.updateAfterRefactoring(anyList())).thenReturn(updateAfterRefactoringPromise);
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,
editorAgent,
previewPresenter,
refactorService,
navigationService,
dtoFactory,
locale,
notificationManager,
clientServerEventService);
}
@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(refactorInfo.getResources()).thenReturn(new Resource[]{file});
when(file.getParentWithMarker(eq(SourceFolderMarker.ID))).thenReturn(Optional.of(srcFolder));
when(file.getLocation()).thenReturn(Path.valueOf("/project/src/a/b/C.java"));
when(file.getName()).thenReturn("C.java");
when(file.getExtension()).thenReturn("java");
when(srcFolder.getLocation()).thenReturn(Path.valueOf("/project/src"));
when(file.getResourceType()).thenReturn(Resource.FILE);
when(file.getRelatedProject()).thenReturn(Optional.of(relatedProject));
when(relatedProject.getLocation()).thenReturn(Path.valueOf("/project"));
presenter.show(refactorInfo);
verify(sessionPromise).then(sessionOperation.capture());
sessionOperation.getValue().apply("sessionId");
verify(projectsPromise).then(projectsOperation.capture());
projectsOperation.getValue().apply(javaProjects);
verify(moveView).setTreeOfDestinations(any(), 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(FLOAT_MODE));
}
@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(FLOAT_MODE));
}
@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);
when(refactorInfo.getResources()).thenReturn(new Resource[]{file});
when(file.getRelatedProject()).thenReturn(Optional.of(relatedProject));
when(relatedProject.getLocation()).thenReturn(Path.valueOf("/project"));
presenter.refactorInfo = refactorInfo;
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(fileTrackingSuspendEventPromise).then(clientServerSuspendOperation.capture());
clientServerSuspendOperation.getValue().apply(any());
verify(refactoringResultPromise).then(refResultOperation.capture());
refResultOperation.getValue().apply(refactoringResult);
verify(moveView).hide();
verify(updateAfterRefactoringPromise).then(updateAfterRefactoringOperation.capture());
updateAfterRefactoringOperation.getValue().apply(null);
verify(refactoringUpdater).handleMovingFiles(anyList());
verify(clientServerEventService).sendFileTrackingResumeEvent();
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);
when(refactorInfo.getResources()).thenReturn(new Resource[]{file});
when(file.getRelatedProject()).thenReturn(Optional.of(relatedProject));
when(relatedProject.getLocation()).thenReturn(Path.valueOf("/project"));
presenter.refactorInfo = refactorInfo;
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(fileTrackingSuspendEventPromise).then(clientServerSuspendOperation.capture());
clientServerSuspendOperation.getValue().apply(any());
verify(refactoringResultPromise).then(refResultOperation.capture());
refResultOperation.getValue().apply(refactoringResult);
verify(moveView, never()).hide();
verify(refactoringUpdater, never()).updateAfterRefactoring(anyList());
verify(moveView).showErrorMessage(refactoringResult);
verify(refactoringUpdater).handleMovingFiles(anyList());
verify(clientServerEventService).sendFileTrackingResumeEvent();
}
@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();
}
}