/******************************************************************************* * 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.extension.maven.server.projecttype.handler; import com.google.inject.Provider; import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.core.rest.HttpJsonRequest; import org.eclipse.che.api.core.rest.HttpJsonRequestFactory; import org.eclipse.che.api.core.rest.shared.dto.Link; import org.eclipse.che.api.project.server.AttributeFilter; import org.eclipse.che.api.project.server.DefaultProjectManager; import org.eclipse.che.api.project.server.Project; import org.eclipse.che.api.project.server.VirtualFileEntry; import org.eclipse.che.api.project.server.handlers.ProjectHandler; import org.eclipse.che.api.project.server.handlers.ProjectHandlerRegistry; import org.eclipse.che.api.project.server.type.ProjectTypeDef; import org.eclipse.che.api.project.server.type.ProjectTypeRegistry; import org.eclipse.che.api.vfs.server.ContentStream; import org.eclipse.che.api.vfs.server.SystemPathsFilter; import org.eclipse.che.api.vfs.server.VirtualFileSystemRegistry; import org.eclipse.che.api.vfs.server.VirtualFileSystemUser; import org.eclipse.che.api.vfs.server.VirtualFileSystemUserContext; import org.eclipse.che.api.vfs.server.impl.memory.MemoryFileSystemProvider; import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto; import org.eclipse.che.commons.lang.IoUtil; import org.eclipse.che.commons.lang.NameGenerator; import org.eclipse.che.commons.test.SelfReturningAnswer; import org.eclipse.che.dto.server.DtoFactory; import org.eclipse.che.ide.extension.maven.shared.MavenAttributes; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import java.io.InputStream; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * @author Roman Nikitenko */ @RunWith(MockitoJUnitRunner.class) public class RemoveMavenModuleHandlerTest { private static final String WORKSPACE = "my_ws"; private static final String API_ENDPOINT = "http://localhost:8080/che/api"; private static final String POM_XML_TEMPL = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<project>\n" + " <modelVersion>4.0.0</modelVersion>\n" + " <artifactId>artifact-id</artifactId>\n" + " <groupId>group-id</groupId>\n" + " <version>x.x.x</version>\n" + " <modules>\n" + " <module>firstModule</module>\n" + " <module>secondModule</module>\n" + " </modules>\n" + "</project>"; private static final String FIRST_MODULE = "firstModule"; private static final String SECOND_MODULE = "secondModule"; private RemoveMavenModuleHandler removeMavenModuleHandler; private DefaultProjectManager projectManager; @Mock private Provider<AttributeFilter> filterProvider; @Mock private AttributeFilter filter; @Mock private HttpJsonRequestFactory httpJsonRequestFactory; @Before public void setUp() throws Exception { when(filterProvider.get()).thenReturn(filter); removeMavenModuleHandler = new RemoveMavenModuleHandler(); ProjectTypeDef mavenProjectType = Mockito.mock(ProjectTypeDef.class); Mockito.when(mavenProjectType.getId()).thenReturn(MavenAttributes.MAVEN_ID); Mockito.when(mavenProjectType.getDisplayName()).thenReturn(MavenAttributes.MAVEN_ID); Mockito.when(mavenProjectType.isPrimaryable()).thenReturn(true); final String vfsUser = "dev"; final Set<String> vfsUserGroups = new LinkedHashSet<>(Collections.singletonList("WORKSPACE/developer")); final EventService eventService = new EventService(); VirtualFileSystemRegistry vfsRegistry = new VirtualFileSystemRegistry(); final MemoryFileSystemProvider memoryFileSystemProvider = new MemoryFileSystemProvider(WORKSPACE, eventService, new VirtualFileSystemUserContext() { @Override public VirtualFileSystemUser getVirtualFileSystemUser() { return new VirtualFileSystemUser(vfsUser, vfsUserGroups); } }, vfsRegistry, SystemPathsFilter.ANY); vfsRegistry.registerProvider(WORKSPACE, memoryFileSystemProvider); Set<ProjectTypeDef> projTypes = new HashSet<>(); projTypes.add(mavenProjectType); ProjectTypeRegistry projectTypeRegistry = new ProjectTypeRegistry(projTypes); Set<ProjectHandler> handlers = new HashSet<>(); ProjectHandlerRegistry handlerRegistry = new ProjectHandlerRegistry(handlers); projectManager = new DefaultProjectManager(vfsRegistry, eventService, projectTypeRegistry, handlerRegistry, filterProvider, API_ENDPOINT, httpJsonRequestFactory); HttpJsonRequest httpJsonRequest = mock(HttpJsonRequest.class, new SelfReturningAnswer()); when(httpJsonRequestFactory.fromLink(eq(DtoFactory.newDto(Link.class) .withMethod("PUT") .withHref(API_ENDPOINT + "/workspace/" + WORKSPACE + "/project")))) .thenReturn(httpJsonRequest); } @Test public void methodShouldReturnedTheControlWhenPomNotFound() throws Exception { String parent = NameGenerator.generate("parent", 5); Project project = projectManager.createProject(WORKSPACE, parent, DtoFactory.getInstance() .createDto(ProjectConfigDto.class) .withType(MavenAttributes.MAVEN_ID), null); removeMavenModuleHandler .onRemoveModule(project.getBaseFolder(), DtoFactory.getInstance().createDto(ProjectConfigDto.class).withType("maven")); VirtualFileEntry pom = project.getBaseFolder().getChild("pom.xml"); Assert.assertNull(pom); } @Test(expected = IllegalArgumentException.class) public void shouldThrowExceptionWhenModuleIsNotMavenModule() throws Exception { String parent = NameGenerator.generate("parent", 5); Project project = projectManager.createProject(WORKSPACE, parent, DtoFactory.getInstance().createDto(ProjectConfigDto.class) .withType(MavenAttributes.MAVEN_ID), null); project.getBaseFolder().createFile("pom.xml", POM_XML_TEMPL.getBytes()); removeMavenModuleHandler .onRemoveModule(project.getBaseFolder(), DtoFactory.getInstance().createDto(ProjectConfigDto.class).withType("notmaven")); } @Test public void shouldRemoveModule() throws Exception { String parent = NameGenerator.generate("parent", 5); Project project = projectManager.createProject(WORKSPACE, parent, DtoFactory.getInstance().createDto(ProjectConfigDto.class) .withType(MavenAttributes.MAVEN_ID), null); project.getBaseFolder().createFile("pom.xml", POM_XML_TEMPL.getBytes()); removeMavenModuleHandler.onRemoveModule(project.getBaseFolder(), DtoFactory.getInstance() .createDto(ProjectConfigDto.class) .withName(FIRST_MODULE) .withType(MavenAttributes.MAVEN_ID)); VirtualFileEntry pom = project.getBaseFolder().getChild("pom.xml"); Assert.assertNotNull(pom); ContentStream content = pom.getVirtualFile().getContent(); Assert.assertNotNull(content); InputStream stream = content.getStream(); String pomContent = IoUtil.readStream(stream); Assert.assertNotNull(pomContent); Assert.assertFalse(pomContent.isEmpty()); String firstMavenModule = String.format("<module>%s</module>", FIRST_MODULE); String secondMavenModule = String.format("<module>%s</module>", SECOND_MODULE); Assert.assertFalse(pomContent.contains(firstMavenModule)); Assert.assertTrue(pomContent.contains(secondMavenModule)); } @Test public void shouldNotRemoveModuleWhenPomNotContainsModule() throws Exception { String parent = NameGenerator.generate("parent", 5); Project project = projectManager.createProject(WORKSPACE, parent, DtoFactory.getInstance().createDto(ProjectConfigDto.class) .withType(MavenAttributes.MAVEN_ID), null); project.getBaseFolder().createFile("pom.xml", POM_XML_TEMPL.getBytes()); removeMavenModuleHandler.onRemoveModule(project.getBaseFolder(), DtoFactory.getInstance() .createDto(ProjectConfigDto.class) .withType(MavenAttributes.MAVEN_ID)); VirtualFileEntry pom = project.getBaseFolder().getChild("pom.xml"); Assert.assertNotNull(pom); ContentStream content = pom.getVirtualFile().getContent(); Assert.assertNotNull(content); InputStream stream = content.getStream(); String pomContent = IoUtil.readStream(stream); Assert.assertNotNull(pomContent); Assert.assertFalse(pomContent.isEmpty()); String firstMavenModule = String.format("<module>%s</module>", FIRST_MODULE); String secondMavenModule = String.format("<module>%s</module>", SECOND_MODULE); Assert.assertTrue(pomContent.contains(firstMavenModule)); Assert.assertTrue(pomContent.contains(secondMavenModule)); } }