/******************************************************************************* * 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.projecttype.wizard; import com.google.common.base.Optional; import org.eclipse.che.api.core.model.project.ProjectConfig; import org.eclipse.che.api.machine.shared.dto.CommandDto; import org.eclipse.che.api.promises.client.Function; import org.eclipse.che.api.promises.client.Operation; import org.eclipse.che.api.promises.client.Promise; import org.eclipse.che.api.promises.client.PromiseError; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.command.CommandImpl; import org.eclipse.che.ide.api.command.CommandManager; import org.eclipse.che.ide.api.project.MutableProjectConfig; import org.eclipse.che.ide.api.project.type.wizard.ProjectWizardMode; import org.eclipse.che.ide.api.resources.Container; import org.eclipse.che.ide.api.resources.Folder; import org.eclipse.che.ide.api.resources.Project; import org.eclipse.che.ide.api.resources.Resource; import org.eclipse.che.ide.api.wizard.Wizard; 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.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.util.Collections; 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.eq; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** * Testing {@link ProjectWizard}. * * @author Artem Zatsarynnyi * @author Dmitry Shnurenko */ @RunWith(MockitoJUnitRunner.class) public class ProjectWizardTest { private static final String PROJECT_NAME = "project1"; @Mock private MutableProjectConfig dataObject; @Mock private Wizard.CompleteCallback completeCallback; @Mock private AppContext appContext; @Mock private CommandManager commandManager; @Mock private Container workspaceRoot; @Mock private Project.ProjectRequest createProjectRequest; @Mock private Promise<Project> createProjectPromise; @Mock private Project createdProject; @Mock private CommandDto command; @Mock private Promise<CommandImpl> createCommandPromise; @Mock private CommandImpl createdCommand; @Mock private Promise<Optional<Container>> optionalContainerPromise; @Mock private Project projectToUpdate; @Mock private Folder folderToUpdate; @Mock private PromiseError promiseError; @Mock private Exception exception; @Captor private ArgumentCaptor<Operation<Project>> completeOperationCaptor; @Captor private ArgumentCaptor<Operation<CommandImpl>> completeAddCommandsOperationCaptor; @Captor private ArgumentCaptor<Operation<PromiseError>> failedOperationCaptor; @Captor private ArgumentCaptor<Operation<Optional<Container>>> optionalContainerCaptor; private ProjectWizard wizard; @Before public void setUp() { when(appContext.getWorkspaceRoot()).thenReturn(workspaceRoot); when(appContext.getProjectsRoot()).thenReturn(Path.valueOf("/projects")); when(dataObject.getPath()).thenReturn(Path.valueOf(PROJECT_NAME).toString()); when(createdProject.getPath()).thenReturn(PROJECT_NAME); } @Test public void shouldCreateProject() throws Exception { prepareWizard(CREATE); when(workspaceRoot.newProject()).thenReturn(createProjectRequest); when(createProjectRequest.withBody(any(ProjectConfig.class))).thenReturn(createProjectRequest); when(createProjectRequest.send()).thenReturn(createProjectPromise); when(createProjectPromise.then(any(Operation.class))).thenReturn(createProjectPromise); when(createProjectPromise.catchError(any(Operation.class))).thenReturn(createProjectPromise); wizard.complete(completeCallback); verify(createProjectPromise).then(completeOperationCaptor.capture()); completeOperationCaptor.getValue().apply(createdProject); verify(completeCallback).onCompleted(); } private void prepareWizard(ProjectWizardMode mode) { wizard = new ProjectWizard(dataObject, mode, appContext, commandManager); } @Test public void shouldInvokeCallbackWhenCreatingFailure() throws Exception { prepareWizard(CREATE); when(workspaceRoot.newProject()).thenReturn(createProjectRequest); when(createProjectRequest.withBody(any(ProjectConfig.class))).thenReturn(createProjectRequest); when(createProjectRequest.send()).thenReturn(createProjectPromise); when(createProjectPromise.then(any(Operation.class))).thenReturn(createProjectPromise); when(createProjectPromise.catchError(any(Operation.class))).thenReturn(createProjectPromise); when(promiseError.getCause()).thenReturn(exception); wizard.complete(completeCallback); verify(createProjectPromise).catchError(failedOperationCaptor.capture()); failedOperationCaptor.getValue().apply(promiseError); verify(promiseError).getCause(); verify(completeCallback).onFailure(eq(exception)); } @Test public void shouldImportProjectSuccessfully() throws Exception { prepareWizard(IMPORT); when(workspaceRoot.newProject()).thenReturn(createProjectRequest); when(createProjectRequest.withBody(any(ProjectConfig.class))).thenReturn(createProjectRequest); when(createProjectRequest.send()).thenReturn(createProjectPromise); when(createProjectPromise.then(any(Operation.class))).thenReturn(createProjectPromise); when(createProjectPromise.thenPromise(any(Function.class))).thenReturn(createProjectPromise); when(createProjectPromise.catchError(any(Operation.class))).thenReturn(createProjectPromise); when(promiseError.getCause()).thenReturn(exception); wizard.complete(completeCallback); verify(createProjectPromise).then(completeOperationCaptor.capture()); completeOperationCaptor.getValue().apply(createdProject); verify(completeCallback).onCompleted(); } @Test public void shouldImportProjectWithCommandSuccessfully() throws Exception { prepareWizard(IMPORT); when(workspaceRoot.importProject()).thenReturn(createProjectRequest); when(workspaceRoot.newProject()).thenReturn(createProjectRequest); when(createProjectRequest.withBody(any(ProjectConfig.class))).thenReturn(createProjectRequest); when(createProjectRequest.send()).thenReturn(createProjectPromise); when(createProjectPromise.then(any(Operation.class))).thenReturn(createProjectPromise); when(createProjectPromise.thenPromise(any(Function.class))).thenReturn(createProjectPromise); when(createProjectPromise.catchError(any(Operation.class))).thenReturn(createProjectPromise); when(promiseError.getCause()).thenReturn(exception); when(dataObject.getCommands()).thenReturn(Collections.singletonList(command)); when(command.getCommandLine()).thenReturn("echo 'Hello'"); when(commandManager.createCommand(any(CommandImpl.class))).thenReturn(createCommandPromise); when(createCommandPromise.then(any(Operation.class))).thenReturn(createCommandPromise); when(createCommandPromise.catchError(any(Operation.class))).thenReturn(createCommandPromise); wizard.complete(completeCallback); verify(createProjectPromise).then(completeOperationCaptor.capture()); completeOperationCaptor.getValue().apply(createdProject); verify(createCommandPromise).then(completeAddCommandsOperationCaptor.capture()); completeAddCommandsOperationCaptor.getValue().apply(createdCommand); verify(completeCallback).onCompleted(); } @Test public void shouldFailOnImportProject() throws Exception { prepareWizard(IMPORT); when(workspaceRoot.newProject()).thenReturn(createProjectRequest); when(createProjectRequest.withBody(any(ProjectConfig.class))).thenReturn(createProjectRequest); when(createProjectRequest.send()).thenReturn(createProjectPromise); when(createProjectPromise.then(any(Operation.class))).thenReturn(createProjectPromise); when(createProjectPromise.thenPromise(any(Function.class))).thenReturn(createProjectPromise); when(createProjectPromise.catchError(any(Operation.class))).thenReturn(createProjectPromise); when(promiseError.getCause()).thenReturn(exception); wizard.complete(completeCallback); verify(createProjectPromise).catchError(failedOperationCaptor.capture()); failedOperationCaptor.getValue().apply(promiseError); verify(promiseError).getCause(); verify(completeCallback).onFailure(eq(exception)); } @Test public void shouldUpdateProjectConfig() throws Exception { prepareWizard(UPDATE); when(workspaceRoot.getContainer(any(Path.class))).thenReturn(optionalContainerPromise); when(projectToUpdate.getResourceType()).thenReturn(Resource.PROJECT); when(projectToUpdate.update()).thenReturn(createProjectRequest); when(createProjectRequest.withBody(any(ProjectConfig.class))).thenReturn(createProjectRequest); when(createProjectRequest.send()).thenReturn(createProjectPromise); when(createProjectPromise.then(any(Operation.class))).thenReturn(createProjectPromise); when(createProjectPromise.catchError(any(Operation.class))).thenReturn(createProjectPromise); wizard.complete(completeCallback); verify(optionalContainerPromise).then(optionalContainerCaptor.capture()); optionalContainerCaptor.getValue().apply(Optional.of((Container)projectToUpdate)); verify(createProjectPromise).then(completeOperationCaptor.capture()); completeOperationCaptor.getValue().apply(createdProject); verify(completeCallback).onCompleted(); } @Test public void shouldFailUpdateProjectConfig() throws Exception { prepareWizard(UPDATE); when(workspaceRoot.getContainer(any(Path.class))).thenReturn(optionalContainerPromise); when(projectToUpdate.getResourceType()).thenReturn(Resource.PROJECT); when(projectToUpdate.update()).thenReturn(createProjectRequest); when(createProjectRequest.withBody(any(ProjectConfig.class))).thenReturn(createProjectRequest); when(createProjectRequest.send()).thenReturn(createProjectPromise); when(createProjectPromise.then(any(Operation.class))).thenReturn(createProjectPromise); when(createProjectPromise.catchError(any(Operation.class))).thenReturn(createProjectPromise); when(promiseError.getCause()).thenReturn(exception); wizard.complete(completeCallback); verify(optionalContainerPromise).then(optionalContainerCaptor.capture()); optionalContainerCaptor.getValue().apply(Optional.of((Container)projectToUpdate)); verify(createProjectPromise).catchError(failedOperationCaptor.capture()); failedOperationCaptor.getValue().apply(promiseError); verify(promiseError).getCause(); verify(completeCallback).onFailure(eq(exception)); } @Test public void shouldCreateConfigForFolder() throws Exception { // prepareWizard(UPDATE); // // when(workspaceRoot.getContainer(any(Path.class))).thenReturn(optionalContainerPromise); // when(folderToUpdate.getResourceType()).thenReturn(Resource.FOLDER); // when(folderToUpdate.toProject()).thenReturn(createProjectRequest); // when(createProjectRequest.withBody(any(ProjectConfig.class))).thenReturn(createProjectRequest); // when(createProjectRequest.send()).thenReturn(createProjectPromise); // when(createProjectPromise.then(any(Operation.class))).thenReturn(createProjectPromise); // when(createProjectPromise.catchError(any(Operation.class))).thenReturn(createProjectPromise); // // wizard.complete(completeCallback); // // verify(optionalContainerPromise).then(optionalContainerCaptor.capture()); // optionalContainerCaptor.getValue().apply(Optional.of((Container)folderToUpdate)); // // verify(createProjectPromise).then(completeOperationCaptor.capture()); // completeOperationCaptor.getValue().apply(createdProject); // // verify(completeCallback).onCompleted(); } @Test public void shouldFailCreateConfigForFolder() throws Exception { // prepareWizard(UPDATE); // // when(workspaceRoot.getContainer(any(Path.class))).thenReturn(optionalContainerPromise); // when(folderToUpdate.getResourceType()).thenReturn(Resource.FOLDER); // when(folderToUpdate.toProject()).thenReturn(createProjectRequest); // when(createProjectRequest.withBody(any(ProjectConfig.class))).thenReturn(createProjectRequest); // when(createProjectRequest.send()).thenReturn(createProjectPromise); // when(createProjectPromise.then(any(Operation.class))).thenReturn(createProjectPromise); // when(createProjectPromise.catchError(any(Operation.class))).thenReturn(createProjectPromise); // when(promiseError.getCause()).thenReturn(exception); // // wizard.complete(completeCallback); // // verify(optionalContainerPromise).then(optionalContainerCaptor.capture()); // optionalContainerCaptor.getValue().apply(Optional.of((Container)folderToUpdate)); // // verify(createProjectPromise).catchError(failedOperationCaptor.capture()); // failedOperationCaptor.getValue().apply(promiseError); // // verify(promiseError).getCause(); // verify(completeCallback).onFailure(eq(exception)); } }