/******************************************************************************* * Copyright (c) 2012-2015 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.projecttype.wizard; import org.eclipse.che.api.core.rest.shared.dto.ServiceError; import org.eclipse.che.api.project.gwt.client.ProjectServiceClient; import org.eclipse.che.api.project.shared.dto.ImportProject; import org.eclipse.che.api.project.shared.dto.ImportResponse; import org.eclipse.che.api.project.shared.dto.NewProject; import org.eclipse.che.api.project.shared.dto.ProjectDescriptor; import org.eclipse.che.api.project.shared.dto.ProjectUpdate; import org.eclipse.che.ide.CoreLocalizationConstant; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.project.type.wizard.ProjectWizardMode; import org.eclipse.che.ide.api.wizard.Wizard; import org.eclipse.che.ide.dto.DtoFactory; import org.eclipse.che.ide.rest.AsyncRequestCallback; import org.eclipse.che.ide.rest.DtoUnmarshallerFactory; import org.eclipse.che.ide.projecttype.wizard.ProjectWizard; import org.eclipse.che.ide.ui.dialogs.DialogFactory; import org.eclipse.che.test.GwtReflectionUtils; import com.google.web.bindery.event.shared.Event; import com.google.web.bindery.event.shared.EventBus; 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.runners.MockitoJUnitRunner; import static org.eclipse.che.ide.api.project.type.wizard.ProjectWizardMode.CREATE; import static org.eclipse.che.ide.api.project.type.wizard.ProjectWizardMode.IMPORT; import static org.eclipse.che.ide.api.project.type.wizard.ProjectWizardMode.UPDATE; import static org.mockito.Matchers.any; 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.verify; import static org.mockito.Mockito.when; /** * Testing {@link ProjectWizard}. * * @author Artem Zatsarynnyy */ @RunWith(MockitoJUnitRunner.class) public class ProjectWizardTest { private static final String PROJECT_NAME = "project1"; @Captor private ArgumentCaptor<AsyncRequestCallback<ProjectDescriptor>> callbackCaptor; @Captor private ArgumentCaptor<AsyncRequestCallback<ImportResponse>> importCallbackCaptor; @Captor private ArgumentCaptor<AsyncRequestCallback<Void>> callbackCaptorForVoid; @Mock private CoreLocalizationConstant coreLocalizationConstant; @Mock private ProjectServiceClient projectServiceClient; @Mock private DtoUnmarshallerFactory dtoUnmarshallerFactory; @Mock private DtoFactory dtoFactory; @Mock private DialogFactory dialogFactory; @Mock private EventBus eventBus; @Mock private AppContext appContext; @Mock private ImportProject importProject; @Mock private NewProject newProject; @Mock private Wizard.CompleteCallback completeCallback; private ProjectWizard wizard; @Before public void setUp() { when(newProject.getName()).thenReturn(PROJECT_NAME); when(importProject.getProject()).thenReturn(newProject); } @Test public void shouldCreateProject() throws Exception { prepareWizard(CREATE); wizard.complete(completeCallback); verify(projectServiceClient).createProject(eq(PROJECT_NAME), eq(newProject), callbackCaptor.capture()); AsyncRequestCallback<ProjectDescriptor> callback = callbackCaptor.getValue(); GwtReflectionUtils.callOnSuccess(callback, mock(ProjectDescriptor.class)); verify(eventBus).fireEvent(Matchers.<Event<Object>>anyObject()); verify(completeCallback).onCompleted(); } @Test public void shouldInvokeCallbackWhenCreatingFailure() throws Exception { prepareWizard(CREATE); when(dtoFactory.createDtoFromJson(anyString(), any(Class.class))).thenReturn(mock(ServiceError.class)); wizard.complete(completeCallback); verify(projectServiceClient).createProject(eq(PROJECT_NAME), eq(newProject), callbackCaptor.capture()); AsyncRequestCallback<ProjectDescriptor> callback = callbackCaptor.getValue(); GwtReflectionUtils.callOnFailure(callback, mock(Throwable.class)); verify(completeCallback).onFailure(Matchers.<Throwable>anyObject()); } @Test public void shouldCreateProjectFromTemplate() throws Exception { prepareWizard(IMPORT); wizard.complete(completeCallback); verify(projectServiceClient).importProject(eq(PROJECT_NAME), eq(true), eq(importProject), importCallbackCaptor.capture()); ImportResponse importResponse = mock(ImportResponse.class); when(importResponse.getProjectDescriptor()).thenReturn(mock(ProjectDescriptor.class)); AsyncRequestCallback<ImportResponse> callback = importCallbackCaptor.getValue(); GwtReflectionUtils.callOnSuccess(callback, importResponse); verify(eventBus).fireEvent(Matchers.<Event<Object>>anyObject()); verify(completeCallback).onCompleted(); } @Test public void shouldInvokeCallbackWhenCreatingProjectFromTemplateFailure() throws Exception { prepareWizard(IMPORT); when(dtoFactory.createDtoFromJson(anyString(), any(Class.class))).thenReturn(mock(ServiceError.class)); wizard.complete(completeCallback); verify(projectServiceClient).importProject(eq(PROJECT_NAME), eq(true), eq(importProject), importCallbackCaptor.capture()); AsyncRequestCallback<ImportResponse> callback = importCallbackCaptor.getValue(); GwtReflectionUtils.callOnFailure(callback, mock(Throwable.class)); verify(completeCallback).onFailure(Matchers.<Throwable>anyObject()); } @Test public void shouldUpdateProject() throws Exception { prepareWizard(UPDATE); wizard.complete(completeCallback); verify(projectServiceClient).updateProject(eq(PROJECT_NAME), eq(newProject), callbackCaptor.capture()); AsyncRequestCallback<ProjectDescriptor> callback = callbackCaptor.getValue(); GwtReflectionUtils.callOnSuccess(callback, mock(ProjectDescriptor.class)); verify(eventBus).fireEvent(Matchers.<Event<Object>>anyObject()); verify(completeCallback).onCompleted(); } @Test public void shouldInvokeCallbackWhenUpdatingFailure() throws Exception { prepareWizard(UPDATE); when(dtoFactory.createDtoFromJson(anyString(), any(Class.class))).thenReturn(mock(ServiceError.class)); wizard.complete(completeCallback); verify(projectServiceClient).updateProject(eq(PROJECT_NAME), eq(newProject), callbackCaptor.capture()); AsyncRequestCallback<ProjectDescriptor> callback = callbackCaptor.getValue(); GwtReflectionUtils.callOnFailure(callback, mock(Throwable.class)); verify(completeCallback).onFailure(Matchers.<Throwable>anyObject()); } @Test public void shouldRenameProjectBeforeUpdating() throws Exception { prepareWizard(UPDATE); String changedName = PROJECT_NAME + "1"; when(newProject.getName()).thenReturn(changedName); wizard.complete(completeCallback); // should rename verify(projectServiceClient).rename(eq(PROJECT_NAME), eq(changedName), anyString(), callbackCaptorForVoid.capture()); AsyncRequestCallback<Void> voidCallback = callbackCaptorForVoid.getValue(); GwtReflectionUtils.callOnSuccess(voidCallback,(Void)null); // should update verify(projectServiceClient).updateProject(eq(changedName), eq(newProject), callbackCaptor.capture()); AsyncRequestCallback<ProjectDescriptor> callback = callbackCaptor.getValue(); GwtReflectionUtils.callOnSuccess(callback, mock(ProjectDescriptor.class)); verify(eventBus).fireEvent(Matchers.<Event<Object>>anyObject()); verify(completeCallback).onCompleted(); } @Test public void shouldNotUpdateProjectWhenRenameFailed() throws Exception { prepareWizard(UPDATE); String changedName = PROJECT_NAME + "1"; when(newProject.getName()).thenReturn(changedName); when(dtoFactory.createDtoFromJson(anyString(), any(Class.class))).thenReturn(mock(ServiceError.class)); wizard.complete(completeCallback); verify(projectServiceClient).rename(eq(PROJECT_NAME), eq(changedName), anyString(), callbackCaptorForVoid.capture()); AsyncRequestCallback<Void> callback = callbackCaptorForVoid.getValue(); GwtReflectionUtils.callOnFailure(callback, mock(Throwable.class)); verify(projectServiceClient, never()).updateProject(anyString(), Matchers.<ProjectUpdate>anyObject(), Matchers.<AsyncRequestCallback<ProjectDescriptor>>anyObject()); verify(completeCallback).onFailure(Matchers.<Throwable>anyObject()); } private void prepareWizard(ProjectWizardMode mode) { wizard = new ProjectWizard(importProject, mode, PROJECT_NAME, coreLocalizationConstant, projectServiceClient, dtoUnmarshallerFactory, dtoFactory, dialogFactory, eventBus, appContext); } }