/******************************************************************************* * 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.rename; import com.google.gwtmockito.GwtMockitoTestRunner; import com.google.web.bindery.event.shared.EventBus; 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.editor.EditorInput; import org.eclipse.che.ide.api.editor.EditorWithAutoSave; import org.eclipse.che.ide.api.notification.NotificationManager; import org.eclipse.che.ide.api.project.node.HasProjectConfig; import org.eclipse.che.ide.api.project.tree.VirtualFile; import org.eclipse.che.ide.dto.DtoFactory; import org.eclipse.che.ide.ext.java.client.JavaLocalizationConstant; 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.rename.wizard.RenamePresenter; import org.eclipse.che.ide.ext.java.client.refactoring.service.RefactoringServiceClient; import org.eclipse.che.ide.ext.java.shared.dto.LinkedModeModel; import org.eclipse.che.ide.ext.java.shared.dto.refactoring.ChangeInfo; import org.eclipse.che.ide.ext.java.shared.dto.refactoring.CreateRenameRefactoring; import org.eclipse.che.ide.ext.java.shared.dto.refactoring.LinkedRenameRefactoringApply; import org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringResult; import org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringStatusEntry; import org.eclipse.che.ide.ext.java.shared.dto.refactoring.RenameRefactoringSession; import org.eclipse.che.ide.jseditor.client.document.Document; import org.eclipse.che.ide.jseditor.client.link.HasLinkedMode; import org.eclipse.che.ide.jseditor.client.link.LinkedMode; import org.eclipse.che.ide.jseditor.client.link.LinkedModel; import org.eclipse.che.ide.jseditor.client.texteditor.TextEditor; import org.eclipse.che.ide.rest.DtoUnmarshallerFactory; import org.eclipse.che.ide.ui.dialogs.CancelCallback; import org.eclipse.che.ide.ui.dialogs.DialogFactory; import org.eclipse.che.ide.ui.dialogs.InputCallback; import org.eclipse.che.ide.ui.dialogs.input.InputDialog; import org.eclipse.che.ide.ui.dialogs.message.MessageDialog; import org.eclipse.che.ide.ui.loaders.request.LoaderFactory; import org.eclipse.che.ide.ui.loaders.request.MessageLoader; 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.Collections; import java.util.List; import static org.eclipse.che.ide.ext.java.shared.dto.refactoring.CreateRenameRefactoring.RenameType.JAVA_ELEMENT; 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.anyInt; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.isNull; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** * @author Alexander Andrinko */ @RunWith(GwtMockitoTestRunner.class) public class JavaRefactoringRenameTest { private static final String TEXT = "some text for test"; private static final String PATH = "to/be/or/not/to/be"; private static final String JAVA_CLASS__NAME = "JavaTest"; private static final String JAVA_CLASS_FULL_NAME = JAVA_CLASS__NAME + ".java"; private static final String NEW_JAVA_CLASS_NAME = "NewJavaTest.java"; private static final String SESSION_ID = "some session id"; private static final int CURSOR_OFFSET = 10; //variables for constructor @Mock private RenamePresenter renamePresenter; @Mock private JavaLocalizationConstant locale; @Mock private DialogFactory dialogFactory; @Mock private RefactoringServiceClient refactoringServiceClient; @Mock private DtoFactory dtoFactory; @Mock private RefactoringUpdater refactoringUpdater; @Mock private EventBus eventBus; @Mock private DtoUnmarshallerFactory unmarshallerFactory; @Mock private NotificationManager notificationManager; @Mock private CreateRenameRefactoring createRenameRefactoringDto; @Mock private LinkedRenameRefactoringApply linkedRenameRefactoringApplyDto; @Mock(extraInterfaces = {HasLinkedMode.class, EditorWithAutoSave.class}) private TextEditor textEditor; @Mock private EditorInput editorInput; @Mock private VirtualFile virtualFile; @Mock private ProjectConfigDto projectConfig; @Mock private HasProjectConfig hasProjectConfig; @Mock private Promise<RenameRefactoringSession> createRenamePromise; @Mock private RenameRefactoringSession session; @Mock private LinkedModeModel linkedModel; @Mock private InputDialog dialog; @Mock private Promise<RefactoringResult> applyModelPromise; @Mock private RefactoringResult result; @Mock private RefactoringStatusEntry entry; @Mock private LoaderFactory loaderFactory; @Captor private ArgumentCaptor<Operation<RenameRefactoringSession>> renameRefCaptor; @Captor private ArgumentCaptor<LinkedMode.LinkedModeListener> inputArgumentCaptor; @Captor private ArgumentCaptor<Operation<RefactoringResult>> refactoringStatusCaptor; @Captor private ArgumentCaptor<Operation<PromiseError>> refactoringErrorCaptor; @Mock private LinkedMode linkedMode; @Mock private LinkedModel editorLinkedModel; @Mock private Document document; @Mock private MessageLoader loader; private JavaRefactoringRename refactoringRename; @Before public void setUp() { when(loaderFactory.newLoader()).thenReturn(loader); refactoringRename = new JavaRefactoringRename(renamePresenter, refactoringUpdater, locale, refactoringServiceClient, dtoFactory, dialogFactory, notificationManager, loaderFactory); when(dtoFactory.createDto(CreateRenameRefactoring.class)).thenReturn(createRenameRefactoringDto); when(dtoFactory.createDto(LinkedRenameRefactoringApply.class)).thenReturn(linkedRenameRefactoringApplyDto); when(textEditor.getEditorInput()).thenReturn(editorInput); when(editorInput.getFile()).thenReturn(virtualFile); when(projectConfig.getPath()).thenReturn(TEXT); when(virtualFile.getName()).thenReturn(JAVA_CLASS_FULL_NAME); when(refactoringServiceClient.createRenameRefactoring(createRenameRefactoringDto)).thenReturn(createRenamePromise); when(createRenamePromise.then((Operation<RenameRefactoringSession>)any())).thenReturn(createRenamePromise); when(applyModelPromise.then((Operation<RefactoringResult>)any())).thenReturn(applyModelPromise); when(session.getLinkedModeModel()).thenReturn(linkedModel); when(session.getSessionId()).thenReturn(SESSION_ID); when(locale.renameDialogTitle()).thenReturn(TEXT); when(locale.renameDialogLabel()).thenReturn(TEXT); when(dialogFactory.createInputDialog(eq(TEXT), eq(TEXT), any(InputCallback.class), isNull(CancelCallback.class))) .thenReturn(dialog); when(refactoringServiceClient.applyLinkedModeRename(linkedRenameRefactoringApplyDto)).thenReturn(applyModelPromise); when(virtualFile.getPath()).thenReturn(PATH); when(virtualFile.getProject()).thenReturn(hasProjectConfig); when(hasProjectConfig.getProjectConfig()).thenReturn(projectConfig); when(textEditor.getCursorOffset()).thenReturn(CURSOR_OFFSET); when(textEditor.getDocument()).thenReturn(document); when(document.getContentRange(anyInt(), anyInt())).thenReturn(NEW_JAVA_CLASS_NAME); when(((HasLinkedMode)textEditor).getLinkedMode()).thenReturn(linkedMode); when(((HasLinkedMode)textEditor).createLinkedModel()).thenReturn(editorLinkedModel); when(textEditor.getDocument()).thenReturn(document); when(document.getFile()).thenReturn(virtualFile); when(result.getEntries()).thenReturn(Collections.singletonList(entry)); } @Test public void renameRefactoringShouldBeAppliedSuccess() throws OperationException { when(result.getSeverity()).thenReturn(OK); List<ChangeInfo> changes = new ArrayList<>(); when(result.getChanges()).thenReturn(changes); refactoringRename.refactor(textEditor); mainCheckRenameRefactoring(); verify(refactoringUpdater).updateAfterRefactoring(Matchers.<RefactorInfo>any(), Matchers.<List<ChangeInfo>>any()); } @Test public void renameRefactoringShouldBeAppliedSuccessAndShowWizard() throws OperationException { when(result.getSeverity()).thenReturn(OK); when(session.isMastShowWizard()).thenReturn(true); refactoringRename.refactor(textEditor); verify(refactoringServiceClient).createRenameRefactoring(createRenameRefactoringDto); verify(createRenamePromise).then(renameRefCaptor.capture()); renameRefCaptor.getValue().apply(session); verify(session).isMastShowWizard(); verify(renamePresenter).show(session); } @Test public void renameRefactoringShouldBeShowErrorWindow() throws OperationException { PromiseError arg = Mockito.mock(PromiseError.class); MessageDialog dialog = Mockito.mock(MessageDialog.class); when(result.getSeverity()).thenReturn(OK); when(session.isMastShowWizard()).thenReturn(true); when(locale.renameRename()).thenReturn("renameTitle"); when(locale.renameOperationUnavailable()).thenReturn("renameBody"); when(dialogFactory.createMessageDialog(anyString(), anyString(), anyObject())).thenReturn(dialog); refactoringRename.refactor(textEditor); verify(createRenamePromise).then(renameRefCaptor.capture()); renameRefCaptor.getValue().apply(session); verify(createRenamePromise).catchError(refactoringErrorCaptor.capture()); refactoringErrorCaptor.getValue().apply(arg); verify(dialogFactory).createMessageDialog("renameTitle", "renameBody", null); verify(dialog).show(); } @Test public void renameRefactoringShouldBeFailedByFatalError() throws OperationException { when(result.getSeverity()).thenReturn(FATAL); refactoringRename.refactor(textEditor); mainCheckRenameRefactoring(); } @Test public void renameRefactoringShouldBeFailedByError() throws OperationException { when(result.getSeverity()).thenReturn(ERROR); refactoringRename.refactor(textEditor); mainCheckRenameRefactoring(); } @Test public void renameRefactoringShouldBeWithWarning() throws OperationException { when(result.getSeverity()).thenReturn(WARNING); refactoringRename.refactor(textEditor); mainCheckRenameRefactoring(); } @Test public void renameRefactoringShouldBeWithINFO() throws OperationException { when(result.getSeverity()).thenReturn(INFO); refactoringRename.refactor(textEditor); mainCheckRenameRefactoring(); } private void mainCheckRenameRefactoring() throws OperationException { verify(dtoFactory).createDto(CreateRenameRefactoring.class); verify(textEditor).getCursorOffset(); verify(createRenameRefactoringDto).setOffset(CURSOR_OFFSET); verify(createRenameRefactoringDto).setRefactorLightweight(true); verify(textEditor).getEditorInput(); verify(editorInput).getFile(); verify(createRenameRefactoringDto).setPath(JAVA_CLASS__NAME); verify(createRenameRefactoringDto).setProjectPath(TEXT); verify(projectConfig).getPath(); verify(createRenameRefactoringDto).setProjectPath(TEXT); verify(createRenameRefactoringDto).setType(JAVA_ELEMENT); verify(refactoringServiceClient).createRenameRefactoring(createRenameRefactoringDto); verify(createRenamePromise).then(renameRefCaptor.capture()); renameRefCaptor.getValue().apply(session); verify(session).isMastShowWizard(); verify(session, times(2)).getLinkedModeModel(); verify(linkedMode).addListener(inputArgumentCaptor.capture()); inputArgumentCaptor.getValue().onLinkedModeExited(true, 0, 1); verify(dtoFactory).createDto(LinkedRenameRefactoringApply.class); linkedRenameRefactoringApplyDto.setNewName(NEW_JAVA_CLASS_NAME); linkedRenameRefactoringApplyDto.setSessionId(SESSION_ID); verify(refactoringServiceClient).applyLinkedModeRename(linkedRenameRefactoringApplyDto); verify(applyModelPromise).then(refactoringStatusCaptor.capture()); refactoringStatusCaptor.getValue().apply(result); verify(result).getSeverity(); } }