/******************************************************************************* * 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.git.client.checkout; import org.eclipse.che.api.git.shared.CheckoutRequest; import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto; import org.eclipse.che.api.workspace.shared.dto.ProjectProblemDto; import org.eclipse.che.ide.api.editor.EditorAgent; import org.eclipse.che.ide.api.editor.EditorInput; import org.eclipse.che.ide.api.editor.EditorPartPresenter; import org.eclipse.che.ide.api.event.FileContentUpdateEvent; import org.eclipse.che.ide.api.event.project.OpenProjectEvent; import org.eclipse.che.ide.api.project.tree.VirtualFile; import org.eclipse.che.ide.ext.git.client.BaseTest; import org.eclipse.che.ide.rest.AsyncRequestCallback; import org.eclipse.che.test.GwtReflectionUtils; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Matchers; import org.mockito.Mock; import java.util.Collections; import java.util.List; import java.util.NavigableMap; import java.util.TreeMap; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.eclipse.che.ide.ext.git.client.checkout.CheckoutReferencePresenter.CHECKOUT_COMMAND_NAME; /** * Testing {@link CheckoutReferencePresenter} functionality. * * @author Roman Nikitenko */ public class CheckoutReferenceTest extends BaseTest { private static final String CORRECT_REFERENCE = "someTag"; private static final String INCORRECT_REFERENCE = ""; @Captor private ArgumentCaptor<AsyncRequestCallback<String>> asyncCallbackCaptor; @Captor private ArgumentCaptor<AsyncRequestCallback<ProjectConfigDto>> projectDescriptorCaptor; @Mock private CheckoutReferenceView view; @Mock private CheckoutRequest checkoutRequest; @Mock private EditorPartPresenter partPresenter; @Mock private EditorInput editorInput; @Mock private EditorAgent editorAgent; @InjectMocks private CheckoutReferencePresenter presenter; @Override public void disarm() { super.disarm(); } @Test public void testOnReferenceValueChangedWhenValueIsIncorrect() throws Exception { presenter.referenceValueChanged(INCORRECT_REFERENCE); view.setCheckoutButEnableState(eq(false)); } @Test public void testOnReferenceValueChangedWhenValueIsCorrect() throws Exception { presenter.referenceValueChanged(CORRECT_REFERENCE); view.setCheckoutButEnableState(eq(true)); } @Test public void testShowDialog() throws Exception { presenter.showDialog(); verify(view).setCheckoutButEnableState(eq(false)); verify(view).showDialog(); } @Test public void testOnCancelClicked() throws Exception { presenter.onCancelClicked(); verify(view).close(); } @Test public void onEnterClickedWhenValueIsIncorrect() throws Exception { reset(service); when(view.getReference()).thenReturn(INCORRECT_REFERENCE); presenter.onEnterClicked(); verify(view, never()).close(); verify(service, never()).checkout(anyString(), anyObject(), anyObject(), anyObject()); } @Test public void onEnterClickedWhenValueIsCorrect() throws Exception { when(dtoFactory.createDto(CheckoutRequest.class)).thenReturn(checkoutRequest); when(checkoutRequest.withName(anyString())).thenReturn(checkoutRequest); when(checkoutRequest.withCreateNew(anyBoolean())).thenReturn(checkoutRequest); reset(service); when(view.getReference()).thenReturn(CORRECT_REFERENCE); presenter.onEnterClicked(); verify(view).close(); verify(service).checkout(anyString(), anyObject(), anyObject(), anyObject()); verify(checkoutRequest).withName(CORRECT_REFERENCE); verify(checkoutRequest).withCreateNew(false); verifyNoMoreInteractions(checkoutRequest); } @Test public void testOnCheckoutClickedWhenCheckoutIsSuccessful() throws Exception { VirtualFile virtualFile = mock(VirtualFile.class); NavigableMap<String, EditorPartPresenter> partPresenterMap = new TreeMap<>(); partPresenterMap.put("partPresenter", partPresenter); when(editorAgent.getOpenedEditors()).thenReturn(partPresenterMap); when(partPresenter.getEditorInput()).thenReturn(editorInput); when(editorInput.getFile()).thenReturn(virtualFile); when(virtualFile.getPath()).thenReturn("/foo"); when(dtoFactory.createDto(CheckoutRequest.class)).thenReturn(checkoutRequest); when(checkoutRequest.withName(anyString())).thenReturn(checkoutRequest); when(checkoutRequest.withCreateNew(anyBoolean())).thenReturn(checkoutRequest); reset(service); when(view.getReference()).thenReturn(CORRECT_REFERENCE); when(rootProjectConfig.getPath()).thenReturn(PROJECT_PATH); presenter.onEnterClicked(); verify(service).checkout(anyString(), anyObject(), anyObject(), asyncCallbackCaptor.capture()); AsyncRequestCallback<String> callback = asyncCallbackCaptor.getValue(); GwtReflectionUtils.callOnSuccess(callback, ""); verify(checkoutRequest).withName(CORRECT_REFERENCE); verify(checkoutRequest).withCreateNew(false); verifyNoMoreInteractions(checkoutRequest); verify(view).close(); verify(projectServiceClient).getProject(anyString(), eq(PROJECT_PATH), projectDescriptorCaptor.capture()); AsyncRequestCallback<ProjectConfigDto> asyncRequestCallback = projectDescriptorCaptor.getValue(); GwtReflectionUtils.callOnSuccess(asyncRequestCallback, projectConfig); verify(projectConfig).getProblems(); verify(projectExplorer).reloadChildren(); verify(editorAgent).getOpenedEditors(); verify(partPresenter).getEditorInput(); verify(editorInput).getFile(); verify(eventBus).fireEvent(Matchers.<FileContentUpdateEvent>anyObject()); } @Test public void testOnCheckoutClickedWhenCheckoutIsSuccessfulButProjectIsNotConfigurated() throws Exception { List<ProjectProblemDto> problemList = Collections.singletonList(mock(ProjectProblemDto.class)); when(projectConfig.getProblems()).thenReturn(problemList); when(dtoFactory.createDto(CheckoutRequest.class)).thenReturn(checkoutRequest); when(checkoutRequest.withName(anyString())).thenReturn(checkoutRequest); when(checkoutRequest.withCreateNew(anyBoolean())).thenReturn(checkoutRequest); reset(service); when(view.getReference()).thenReturn(CORRECT_REFERENCE); when(rootProjectConfig.getPath()).thenReturn(PROJECT_PATH); presenter.onEnterClicked(); verify(service).checkout(anyString(), anyObject(), anyObject(), asyncCallbackCaptor.capture()); AsyncRequestCallback<String> callback = asyncCallbackCaptor.getValue(); GwtReflectionUtils.callOnSuccess(callback, ""); verify(checkoutRequest).withName(CORRECT_REFERENCE); verify(checkoutRequest).withCreateNew(false); verifyNoMoreInteractions(checkoutRequest); verify(view).close(); verify(projectServiceClient).getProject(anyString(), eq(PROJECT_PATH), projectDescriptorCaptor.capture()); AsyncRequestCallback<ProjectConfigDto> asyncRequestCallback = projectDescriptorCaptor.getValue(); GwtReflectionUtils.callOnSuccess(asyncRequestCallback, projectConfig); verify(projectConfig).getProblems(); verify(eventBus).fireEvent(Matchers.<OpenProjectEvent>anyObject()); } @Test public void testOnCheckoutClickedWhenCheckoutIsFailed() throws Exception { when(dtoFactory.createDto(CheckoutRequest.class)).thenReturn(checkoutRequest); when(checkoutRequest.withName(anyString())).thenReturn(checkoutRequest); when(checkoutRequest.withCreateNew(anyBoolean())).thenReturn(checkoutRequest); reset(service); when(view.getReference()).thenReturn(CORRECT_REFERENCE); when(rootProjectConfig.getPath()).thenReturn(PROJECT_PATH); presenter.onEnterClicked(); verify(service).checkout(anyString(), anyObject(), anyObject(), asyncCallbackCaptor.capture()); AsyncRequestCallback<String> callback = asyncCallbackCaptor.getValue(); GwtReflectionUtils.callOnFailure(callback, mock(Throwable.class)); verify(checkoutRequest).withName(CORRECT_REFERENCE); verify(checkoutRequest).withCreateNew(false); verifyNoMoreInteractions(checkoutRequest); verify(view).close(); verify(eventBus, never()).fireEvent(Matchers.<OpenProjectEvent>anyObject()); verify(gitOutputConsoleFactory).create(CHECKOUT_COMMAND_NAME); verify(console).printError(anyString()); verify(consolesPanelPresenter).addCommandOutput(anyString(), eq(console)); verify(notificationManager).notify(anyString(), rootProjectConfig); } }