/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.workbench.common.screens.examples.backend.server; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.enterprise.event.Event; import org.guvnor.common.services.project.context.ProjectContextChangeEvent; import org.guvnor.common.services.project.events.NewProjectEvent; import org.guvnor.common.services.project.model.POM; import org.guvnor.common.services.project.model.Project; import org.guvnor.common.services.shared.metadata.MetadataService; import org.guvnor.structure.organizationalunit.OrganizationalUnit; import org.guvnor.structure.organizationalunit.OrganizationalUnitService; import org.guvnor.structure.organizationalunit.impl.OrganizationalUnitImpl; import org.guvnor.structure.repositories.Repository; import org.guvnor.structure.repositories.RepositoryEnvironmentConfigurations; import org.guvnor.structure.repositories.RepositoryService; import org.guvnor.structure.repositories.impl.git.GitRepository; import org.guvnor.structure.server.config.ConfigGroup; import org.guvnor.structure.server.config.ConfigType; import org.guvnor.structure.server.config.ConfigurationFactory; import org.guvnor.structure.server.repositories.RepositoryFactory; import org.jboss.errai.security.shared.api.identity.User; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.screens.examples.model.ExampleOrganizationalUnit; import org.kie.workbench.common.screens.examples.model.ExampleProject; import org.kie.workbench.common.screens.examples.model.ExampleRepository; import org.kie.workbench.common.screens.examples.model.ExampleTargetRepository; import org.kie.workbench.common.screens.examples.model.ExamplesMetaData; import org.kie.workbench.common.services.shared.project.KieProject; import org.kie.workbench.common.services.shared.project.KieProjectService; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import org.uberfire.backend.vfs.Path; import org.uberfire.io.IOService; import org.uberfire.java.nio.file.FileSystem; import org.uberfire.mocks.EventSourceMock; import org.uberfire.rpc.SessionInfo; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class ExamplesServiceImplTest { @Mock private IOService ioService; @Mock private ConfigurationFactory configurationFactory; @Mock private RepositoryFactory repositoryFactory; @Mock private KieProjectService projectService; @Mock private RepositoryService repositoryService; @Mock private OrganizationalUnitService ouService; @Mock private MetadataService metadataService; @Spy private Event<NewProjectEvent> newProjectEvent = new EventSourceMock<NewProjectEvent>() { @Override public void fire(final NewProjectEvent event) { //Do nothing. Default implementation throws an exception. } }; @Mock private SessionInfo sessionInfo; @Mock private User user; private ExamplesServiceImpl service; @Before public void setup() { service = spy(new ExamplesServiceImpl(ioService, configurationFactory, repositoryFactory, projectService, repositoryService, ouService, metadataService, newProjectEvent, sessionInfo)); when(ouService.getOrganizationalUnits()).thenReturn(new HashSet<OrganizationalUnit>() {{ add(new OrganizationalUnitImpl("ou1Name", "ou1Owner", "ou1GroupId")); add(new OrganizationalUnitImpl("ou2Name", "ou2Owner", "ou2GroupId")); }}); when(projectService.resolveProject(any(Path.class))).thenAnswer(new Answer<KieProject>() { @Override public KieProject answer(final InvocationOnMock invocationOnMock) throws Throwable { final Path path = (Path) invocationOnMock.getArguments()[0]; final KieProject project = new KieProject(path, path, path, path, path, path, ""); return project; } }); when(sessionInfo.getId()).thenReturn("sessionId"); when(sessionInfo.getIdentity()).thenReturn(user); when(user.getIdentifier()).thenReturn("user"); when(configurationFactory.newConfigGroup(any(ConfigType.class), anyString(), anyString())).thenReturn(mock(ConfigGroup.class)); } @Test public void initPlaygroundRepository() { //Emulate @PostConstruct mechanism service.initPlaygroundRepository(); final ExampleRepository exampleRepository = service.getPlaygroundRepository(); assertNotNull(exampleRepository); } @Test public void testGetMetaData() { //Emulate @PostConstruct mechanism service.initPlaygroundRepository(); final ExamplesMetaData metaData = service.getMetaData(); assertNotNull(metaData); assertNotNull(metaData.getRepository()); assertNotNull(metaData.getOrganizationalUnits()); assertEquals(2, metaData.getOrganizationalUnits().size()); assertNotNull(metaData.getRepository().getUrl()); final Set<ExampleOrganizationalUnit> exampleOrganizationalUnits = metaData.getOrganizationalUnits(); assertTrue(exampleOrganizationalUnits.contains(new ExampleOrganizationalUnit("ou1Name"))); assertTrue(exampleOrganizationalUnits.contains(new ExampleOrganizationalUnit("ou2Name"))); } @Test public void testGetProjects_NullRepository() { final Set<ExampleProject> projects = service.getProjects(null); assertNotNull(projects); assertEquals(0, projects.size()); } @Test public void testGetProjects_NullRepositoryUrl() { final Set<ExampleProject> projects = service.getProjects(new ExampleRepository(null)); assertNotNull(projects); assertEquals(0, projects.size()); } @Test public void testGetProjects_EmptyRepositoryUrl() { final Set<ExampleProject> projects = service.getProjects(new ExampleRepository("")); assertNotNull(projects); assertEquals(0, projects.size()); } @Test public void testGetProjects_WhiteSpaceRepositoryUrl() { final Set<ExampleProject> projects = service.getProjects(new ExampleRepository(" ")); assertNotNull(projects); assertEquals(0, projects.size()); } @Test public void testGetProjects_DefaultDescription() { final Path projectRoot = mock(Path.class); final KieProject project = mock(KieProject.class); when(project.getRootPath()).thenReturn(projectRoot); when(project.getProjectName()).thenReturn("project1"); when(projectRoot.toURI()).thenReturn("default:///project1"); when(metadataService.getTags(any(Path.class))).thenReturn(Arrays.asList("tag1", "tag2")); final GitRepository repository = new GitRepository("guvnorng-playground"); when(repositoryFactory.newRepository(any(ConfigGroup.class))).thenReturn(repository); when(projectService.getProjects(eq(repository), any(String.class))).thenReturn(new HashSet<Project>() {{ add(project); }}); service.setPlaygroundRepository(mock(ExampleRepository.class)); final Set<ExampleProject> projects = service.getProjects(new ExampleRepository("https://github.com/guvnorngtestuser1/guvnorng-playground.git")); assertNotNull(projects); assertEquals(1, projects.size()); assertTrue(projects.contains(new ExampleProject(projectRoot, "project1", "Example 'project1' project", Arrays.asList("tag1", "tag2")))); } @Test public void testGetProjects_CustomDescription() { final Path projectRoot = mock(Path.class); final KieProject project = mock(KieProject.class); when(project.getRootPath()).thenReturn(projectRoot); when(project.getProjectName()).thenReturn("project1"); when(projectRoot.toURI()).thenReturn("default:///project1"); when(ioService.exists(any(org.uberfire.java.nio.file.Path.class))).thenReturn(true); when(ioService.readAllString(any(org.uberfire.java.nio.file.Path.class))).thenReturn("custom description"); when(metadataService.getTags(any(Path.class))).thenReturn(Arrays.asList("tag1", "tag2")); final GitRepository repository = new GitRepository("guvnorng-playground"); when(repositoryFactory.newRepository(any(ConfigGroup.class))).thenReturn(repository); when(projectService.getProjects(eq(repository), any(String.class))).thenReturn(new HashSet<Project>() {{ add(project); }}); final Set<ExampleProject> projects = service.getProjects(new ExampleRepository("https://github.com/guvnorngtestuser1/guvnorng-playground.git")); assertNotNull(projects); assertEquals(1, projects.size()); assertTrue(projects.contains(new ExampleProject(projectRoot, "project1", "custom description", Arrays.asList("tag1", "tag2")))); } @Test public void testGetProjects_PomDescription() { final Path projectRoot = mock(Path.class); final POM pom = mock(POM.class); final KieProject project = mock(KieProject.class); when(pom.getDescription()).thenReturn("pom description"); when(project.getRootPath()).thenReturn(projectRoot); when(project.getProjectName()).thenReturn("project1"); when(project.getPom()).thenReturn(pom); when(projectRoot.toURI()).thenReturn("default:///project1"); when(metadataService.getTags(any(Path.class))).thenReturn(Arrays.asList("tag1", "tag2")); final GitRepository repository = new GitRepository("guvnorng-playground"); when(repositoryFactory.newRepository(any(ConfigGroup.class))).thenReturn(repository); when(projectService.getProjects(eq(repository), any(String.class))).thenReturn(new HashSet<Project>() {{ add(project); }}); final Set<ExampleProject> projects = service.getProjects(new ExampleRepository("https://github.com/guvnorngtestuser1/guvnorng-playground.git")); assertNotNull(projects); assertEquals(1, projects.size()); assertTrue(projects.contains(new ExampleProject(projectRoot, "project1", "pom description", Arrays.asList("tag1", "tag2")))); } @Test public void testValidateRepositoryName() { final String name = "name"; service.validateRepositoryName(name); verify(repositoryService, times(1)).validateRepositoryName(eq(name)); } @Test(expected = IllegalArgumentException.class) public void testSetupExamples_NullOrganizationalUnit() { service.setupExamples(null, mock(ExampleTargetRepository.class), "master", mock(List.class)); } @Test(expected = IllegalArgumentException.class) public void testSetupExamples_NullRepository() { service.setupExamples(mock(ExampleOrganizationalUnit.class), null, "master", mock(List.class)); } @Test(expected = IllegalArgumentException.class) public void testSetupExamples_NullBranch() { service.setupExamples(mock(ExampleOrganizationalUnit.class), mock(ExampleTargetRepository.class), null, mock(List.class)); } @Test(expected = IllegalArgumentException.class) public void testSetupExamples_NullProject() { service.setupExamples(mock(ExampleOrganizationalUnit.class), mock(ExampleTargetRepository.class), "master", null); } @Test(expected = IllegalStateException.class) public void testSetupExamples_ZeroProjects() { service.setupExamples(mock(ExampleOrganizationalUnit.class), mock(ExampleTargetRepository.class), "master", Collections.<ExampleProject>emptyList()); } @Test public void testSetupExamples_NewOrganizationalUnitNewRepository() { final ExampleOrganizationalUnit exOU = mock(ExampleOrganizationalUnit.class); final ExampleTargetRepository exRepository = mock(ExampleTargetRepository.class); final ExampleProject exProject = mock(ExampleProject.class); final List<ExampleProject> exProjects = new ArrayList<ExampleProject>() {{ add(exProject); }}; final OrganizationalUnit ou = mock(OrganizationalUnit.class); final GitRepository repository = mock(GitRepository.class); final Path repositoryRoot = mock(Path.class); final Path projectRoot = mock(Path.class); when(exOU.getName()).thenReturn("ou"); when(exRepository.getAlias()).thenReturn("repository"); when(exProject.getName()).thenReturn("project"); when(exProject.getRoot()).thenReturn(projectRoot); when(repository.getBranchRoot("master")).thenReturn(repositoryRoot); when(repositoryRoot.toURI()).thenReturn("default:///"); when(projectRoot.toURI()).thenReturn("default:///project"); when(ouService.getOrganizationalUnit(eq("ou"))).thenReturn(null); when(ouService.createOrganizationalUnit(eq("ou"), eq(""), eq(""))).thenReturn(ou); when(repositoryService.getRepository(eq("repository"))).thenReturn(null); when(repositoryService.createRepository(eq(ou), eq(GitRepository.SCHEME), eq("repository"), any(RepositoryEnvironmentConfigurations.class))).thenReturn(repository); final ProjectContextChangeEvent event = service.setupExamples(exOU, exRepository, "master", exProjects); assertEquals(ou, event.getOrganizationalUnit()); assertEquals(repository, event.getRepository()); assertEquals(repository.getDefaultBranch(), event.getBranch()); assertEquals(exProject.getRoot().toURI(), event.getProject().getRootPath().toURI()); verify(ouService, times(1)).createOrganizationalUnit(eq("ou"), eq(""), eq("")); verify(repositoryService, times(1)).createRepository(eq(ou), eq(GitRepository.SCHEME), eq("repository"), any(RepositoryEnvironmentConfigurations.class)); verify(newProjectEvent, times(1)).fire(any(NewProjectEvent.class)); } @Test public void testSetupExamples_ExistingOrganizationalUnitExistingRepository() { final ExampleOrganizationalUnit exOU = mock(ExampleOrganizationalUnit.class); final ExampleTargetRepository exRepository = mock(ExampleTargetRepository.class); final ExampleProject exProject = mock(ExampleProject.class); final List<ExampleProject> exProjects = new ArrayList<ExampleProject>() {{ add(exProject); }}; final OrganizationalUnit ou = mock(OrganizationalUnit.class); final GitRepository repository = mock(GitRepository.class); final Path repositoryRoot = mock(Path.class); final Path projectRoot = mock(Path.class); when(exOU.getName()).thenReturn("ou"); when(exRepository.getAlias()).thenReturn("repository"); when(exProject.getName()).thenReturn("project"); when(exProject.getRoot()).thenReturn(projectRoot); when(repository.getBranchRoot("master")).thenReturn(repositoryRoot); when(repositoryRoot.toURI()).thenReturn("default:///"); when(projectRoot.toURI()).thenReturn("default:///project"); when(ouService.getOrganizationalUnit(eq("ou"))).thenReturn(ou); when(repositoryService.getRepository(eq("repository"))).thenReturn(repository); final ProjectContextChangeEvent event = service.setupExamples(exOU, exRepository, "master", exProjects); assertEquals(ou, event.getOrganizationalUnit()); assertEquals(repository, event.getRepository()); assertEquals(repository.getDefaultBranch(), event.getBranch()); assertEquals(exProject.getRoot().toURI(), event.getProject().getRootPath().toURI()); verify(ouService, never()).createOrganizationalUnit(eq("ou"), eq(""), eq("")); verify(repositoryService, never()).createRepository(any(OrganizationalUnit.class), any(String.class), any(String.class), any(RepositoryEnvironmentConfigurations.class)); verify(newProjectEvent, times(1)).fire(any(NewProjectEvent.class)); } @Test public void testSetupExamples_ProjectCopy() { final ExampleOrganizationalUnit exOU = mock(ExampleOrganizationalUnit.class); final ExampleTargetRepository exRepository = mock(ExampleTargetRepository.class); final ExampleProject exProject1 = mock(ExampleProject.class); final ExampleProject exProject2 = mock(ExampleProject.class); final List<ExampleProject> exProjects = new ArrayList<ExampleProject>() {{ add(exProject1); add(exProject2); }}; final OrganizationalUnit ou = mock(OrganizationalUnit.class); final GitRepository repository = mock(GitRepository.class); final Path repositoryRoot = mock(Path.class); final Path project1Root = mock(Path.class); final Path project2Root = mock(Path.class); when(exOU.getName()).thenReturn("ou"); when(exRepository.getAlias()).thenReturn("repository"); when(exProject1.getName()).thenReturn("project1"); when(exProject1.getRoot()).thenReturn(project1Root); when(exProject2.getName()).thenReturn("project2"); when(exProject2.getRoot()).thenReturn(project2Root); when(repository.getBranchRoot("dev_branch")).thenReturn(repositoryRoot); when(repository.getDefaultBranch()).thenReturn("master"); when(repositoryRoot.toURI()).thenReturn("default:///"); when(project1Root.toURI()).thenReturn("default:///project1"); when(project2Root.toURI()).thenReturn("default:///project2"); when(ouService.getOrganizationalUnit(eq("ou"))).thenReturn(ou); when(repositoryService.getRepository(eq("repository"))).thenReturn(repository); final ProjectContextChangeEvent event = service.setupExamples(exOU, exRepository, "dev_branch", exProjects); assertEquals(ou, event.getOrganizationalUnit()); assertEquals(repository, event.getRepository()); assertEquals(repository.getDefaultBranch(), event.getBranch()); assertEquals(exProject1.getRoot().toURI(), event.getProject().getRootPath().toURI()); verify(ouService, never()).createOrganizationalUnit(eq("ou"), eq(""), eq("")); verify(repositoryService, never()).createRepository(any(OrganizationalUnit.class), any(String.class), any(String.class), any(RepositoryEnvironmentConfigurations.class)); verify(ioService, times(1)).startBatch(any(FileSystem.class)); verify(ioService, times(1)).endBatch(); verify(newProjectEvent, times(2)).fire(any(NewProjectEvent.class)); } @Test public void resolveRepositoryUrlOnWindows() { doReturn("\\").when(service).getFileSeparator(); final String playgroundDirectoryPath = "C:\\folder\\.kie-wb-playground"; final String repositoryUrl = service.resolveRepositoryUrl(playgroundDirectoryPath); assertEquals("file:///C:/folder/.kie-wb-playground", repositoryUrl); } @Test public void resolveRepositoryUrlOnUnix() { doReturn("/").when(service).getFileSeparator(); final String playgroundDirectoryPath = "/home/user/folder/.kie-wb-playground"; final String repositoryUrl = service.resolveRepositoryUrl(playgroundDirectoryPath); assertEquals("file:///home/user/folder/.kie-wb-playground", repositoryUrl); } @Test public void resolveGitRepositoryNotClonedBefore() { ExampleRepository playgroundRepository = new ExampleRepository("file:///home/user/folder/.kie-wb-playground"); service.setPlaygroundRepository(playgroundRepository); ConfigGroup configGroup = mock(ConfigGroup.class); when(configurationFactory.newConfigGroup(any(ConfigType.class), anyString(), anyString())).thenReturn(configGroup); Repository repository = mock(Repository.class); when(repositoryFactory.newRepository(configGroup)).thenReturn(repository); Repository result = service.resolveGitRepository(playgroundRepository); assertEquals(repository, result); verify(repositoryFactory, times(1)).newRepository(configGroup); } @Test public void resolveGitRepositoryClonedBefore() { ExampleRepository playgroundRepository = new ExampleRepository("file:///home/user/folder/.kie-wb-playground"); service.setPlaygroundRepository(playgroundRepository); GitRepository repository = mock(GitRepository.class); Map<String, Object> repositoryEnvironment = new HashMap<>(); repositoryEnvironment.put("origin", playgroundRepository.getUrl()); when(repository.getEnvironment()).thenReturn(repositoryEnvironment); service.getClonedRepositories().add(repository); Repository result = service.resolveGitRepository(playgroundRepository); assertEquals(repository, result); verify(repositoryFactory, never()).newRepository(any(ConfigGroup.class)); } }