/*
* 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.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.guvnor.common.services.project.context.ProjectContextChangeEvent;
import org.guvnor.common.services.project.model.GAV;
import org.guvnor.common.services.project.model.POM;
import org.guvnor.common.services.project.model.Package;
import org.guvnor.common.services.project.model.Project;
import org.guvnor.structure.organizationalunit.OrganizationalUnit;
import org.guvnor.structure.organizationalunit.OrganizationalUnitService;
import org.guvnor.structure.repositories.Repository;
import org.guvnor.structure.repositories.RepositoryEnvironmentConfigurations;
import org.guvnor.structure.repositories.RepositoryService;
import org.jboss.errai.security.shared.api.identity.User;
import org.junit.Before;
import org.junit.Ignore;
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.service.ExamplesService;
import org.kie.workbench.common.screens.explorer.backend.server.ExplorerServiceHelper;
import org.kie.workbench.common.screens.library.api.LibraryInfo;
import org.kie.workbench.common.screens.library.api.OrganizationalUnitRepositoryInfo;
import org.kie.workbench.common.screens.library.api.ProjectAssetsQuery;
import org.kie.workbench.common.screens.library.api.preferences.LibraryInternalPreferences;
import org.kie.workbench.common.screens.library.api.preferences.LibraryOrganizationalUnitPreferences;
import org.kie.workbench.common.screens.library.api.preferences.LibraryPreferences;
import org.kie.workbench.common.screens.library.api.preferences.LibraryProjectPreferences;
import org.kie.workbench.common.screens.library.api.preferences.LibraryRepositoryPreferences;
import org.kie.workbench.common.services.refactoring.backend.server.query.standard.FindAllLibraryAssetsQuery;
import org.kie.workbench.common.services.refactoring.model.index.terms.valueterms.ValueIndexTerm;
import org.kie.workbench.common.services.refactoring.model.query.RefactoringPageRequest;
import org.kie.workbench.common.services.refactoring.model.query.RefactoringPageRow;
import org.kie.workbench.common.services.refactoring.service.RefactoringQueryService;
import org.kie.workbench.common.services.shared.project.KieProjectService;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.uberfire.backend.vfs.Path;
import org.uberfire.io.IOService;
import org.uberfire.paging.PageResponse;
import org.uberfire.rpc.SessionInfo;
import org.uberfire.security.authz.AuthorizationManager;
import static java.util.Collections.singletonList;
import static org.jgroups.util.Util.assertEquals;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class LibraryServiceImplTest {
@Mock
private OrganizationalUnitService ouService;
@Mock
private RepositoryService repositoryService;
@Mock
private KieProjectService kieProjectService;
@Mock
private LibraryPreferences preferences;
@Mock
private LibraryInternalPreferences internalPreferences;
@Mock
private AuthorizationManager authorizationManager;
@Mock
private SessionInfo sessionInfo;
@Mock
private ExplorerServiceHelper explorerServiceHelper;
@Mock
private KieProjectService projectService;
@Mock
private ExamplesService examplesService;
@Mock
private RefactoringQueryService refactoringQueryService;
@Mock
private IOService ioService;
@Mock
private OrganizationalUnit ou1;
@Mock
private OrganizationalUnit ou2;
@Mock
private Repository repo1;
@Mock
private Repository repo2Default;
@Captor
private ArgumentCaptor<RefactoringPageRequest> pageRequestArgumentCaptor;
@Captor
private ArgumentCaptor<POM> pomArgumentCaptor;
private LibraryServiceImpl libraryService;
private List<OrganizationalUnit> ous;
private Set<Project> projectsMock;
@Before
public void setup() {
ous = Arrays.asList(ou1,
ou2);
when(ouService.getOrganizationalUnits()).thenReturn(ous);
when(ou1.getIdentifier()).thenReturn("ou1");
when(ou2.getIdentifier()).thenReturn("ou2");
when(repo1.getAlias()).thenReturn("repo_created_by_user");
when(repo1.getBranches()).thenReturn(Arrays.asList("repo1-branch1",
"repo1-branch2"));
when(repo2Default.getAlias()).thenReturn("ou2-repo-alias");
when(repo2Default.getRoot()).thenReturn(mock(Path.class));
when(repo2Default.getBranches()).thenReturn(Collections.singletonList("repo2-branch1"));
when(ou2.getRepositories()).thenReturn(Arrays.asList(repo1,
repo2Default));
doReturn(true).when(authorizationManager).authorize(any(Repository.class),
any(User.class));
doReturn(false).when(authorizationManager).authorize(eq(repo1),
any(User.class));
projectsMock = new HashSet<>();
projectsMock.add(mock(Project.class));
projectsMock.add(mock(Project.class));
projectsMock.add(mock(Project.class));
when(preferences.getOrganizationalUnitPreferences()).thenReturn(spy(new LibraryOrganizationalUnitPreferences()));
when(preferences.getRepositoryPreferences()).thenReturn(spy(new LibraryRepositoryPreferences()));
when(preferences.getProjectPreferences()).thenReturn(spy(new LibraryProjectPreferences()));
libraryService = spy(new LibraryServiceImpl(ouService,
repositoryService,
kieProjectService,
refactoringQueryService,
preferences,
authorizationManager,
sessionInfo,
explorerServiceHelper,
projectService,
examplesService,
ioService,
internalPreferences
));
}
@Test
public void getDefaultOrganizationalUnitRepositoryInfoTest() {
final OrganizationalUnitRepositoryInfo info = mock(OrganizationalUnitRepositoryInfo.class);
doReturn(info).when(libraryService).getOrganizationalUnitRepositoryInfo(any(OrganizationalUnit.class));
assertEquals(info,
libraryService.getDefaultOrganizationalUnitRepositoryInfo());
}
@Test
public void getOrganizationalUnitRepositoryInfoTest() {
when(preferences.getRepositoryPreferences().getName()).thenReturn("repository1");
doAnswer(invocationOnMock -> getRepository((String) invocationOnMock.getArguments()[2]))
.when(repositoryService).createRepository(any(OrganizationalUnit.class),
anyString(),
anyString(),
any(RepositoryEnvironmentConfigurations.class));
final Repository repository1 = getRepository("repository1");
final Repository repository2 = getRepository("repository2");
final Repository repository3 = getRepository("repository3");
final Repository repository4 = getRepository("organizationalUnit4-repository1");
final OrganizationalUnit organizationalUnit1 = getOrganizationalUnit("organizationalUnit1",
repository1);
final OrganizationalUnit organizationalUnit2 = getOrganizationalUnit("organizationalUnit2",
repository2,
repository3);
final OrganizationalUnit organizationalUnit3 = getOrganizationalUnit("organizationalUnit3");
final OrganizationalUnit organizationalUnit4 = getOrganizationalUnit("organizationalUnit4",
repository4);
final List<OrganizationalUnit> organizationalUnits = new ArrayList<>();
organizationalUnits.add(organizationalUnit1);
organizationalUnits.add(organizationalUnit2);
organizationalUnits.add(organizationalUnit3);
organizationalUnits.add(organizationalUnit4);
doReturn(organizationalUnits).when(ouService).getOrganizationalUnits();
organizationalUnitWithPrimaryRepositoryExistent(organizationalUnit1,
"repository1");
organizationalUnitWithTwoRepositoriesSelectsTheFirst(organizationalUnit2,
"repository2");
organizationalUnitWithNoRepositoriesCreatesThePrimaryRepository(organizationalUnit3,
"repository1");
organizationalUnitWithNoRepositoriesCreatesTheSecondaryRepositorySincePrimaryAlreadyExists(organizationalUnit3,
"organizationalUnit3-repository1",
repository1);
organizationalUnitWithSecondaryRepositoryExistent(organizationalUnit4,
"organizationalUnit4-repository1");
}
@Test
public void getLibraryInfoTest() {
final Repository repository = mock(Repository.class);
final Set<Project> projects = new HashSet<>();
projects.add(mock(Project.class));
doReturn(projects).when(kieProjectService).getProjects(eq(repository),
anyString());
final LibraryInfo libraryInfo = libraryService.getLibraryInfo(repository,
"master");
assertEquals("master",
libraryInfo.getSelectedBranch());
assertEquals(new ArrayList<>(projects),
libraryInfo.getProjects());
}
@Test
public void newProjectTest() {
when(preferences.getOrganizationalUnitPreferences().getName()).thenReturn("ou2");
when(preferences.getRepositoryPreferences().getName()).thenReturn("repo-alias");
when(preferences.getOrganizationalUnitPreferences().getAliasInSingular()).thenReturn("team");
when(preferences.getProjectPreferences().getBranch()).thenReturn("master");
when(preferences.getProjectPreferences().getGroupId()).thenReturn("projectGroupID");
when(preferences.getProjectPreferences().getVersion()).thenReturn("1.0");
final Repository repository = mock(Repository.class);
final Path projectRootPath = mock(Path.class);
when(repository.getRoot()).thenReturn(projectRootPath);
libraryService.createProject("Project Name",
repository,
"baseURL",
"description");
verify(kieProjectService).newProject(eq(projectRootPath),
pomArgumentCaptor.capture(),
eq("baseURL"),
any());
final POM pom = pomArgumentCaptor.getValue();
assertEquals("ProjectName",
pom.getGav().getArtifactId());
assertEquals("description",
pom.getDescription());
}
@Test
public void thereIsNotAProjectInTheWorkbenchTest() {
final Boolean thereIsAProjectInTheWorkbench = libraryService.thereIsAProjectInTheWorkbench();
assertFalse(thereIsAProjectInTheWorkbench);
verify(kieProjectService,
times(1)).getProjects(any(Repository.class),
anyString());
verify(kieProjectService).getProjects(repo2Default,
"repo2-branch1");
}
@Test
public void thereIsAProjectInTheWorkbenchTest() {
Set<Project> projects = new HashSet<>();
projects.add(mock(Project.class));
doReturn(projects).when(kieProjectService).getProjects(any(Repository.class),
anyString());
final Boolean thereIsAProjectInTheWorkbench = libraryService.thereIsAProjectInTheWorkbench();
assertTrue(thereIsAProjectInTheWorkbench);
verify(kieProjectService,
times(1)).getProjects(any(Repository.class),
anyString());
verify(kieProjectService).getProjects(repo2Default,
"repo2-branch1");
}
@Test(expected = IllegalArgumentException.class)
public void getNullProjectAssetsTest() {
libraryService.getProjectAssets(null);
}
@Test
public void emptyFirstPage() throws Exception {
final Project project = mock(Project.class);
final Path path = mock(Path.class);
when(project.getRootPath()).thenReturn(path);
when(path.toURI()).thenReturn("a/b/c");
final ProjectAssetsQuery query = new ProjectAssetsQuery(project,
"",
0,
10);
final PageResponse<RefactoringPageRow> pageRowPageResponse = new PageResponse<>();
pageRowPageResponse.setPageRowList(new ArrayList<>());
when(refactoringQueryService.query(any(RefactoringPageRequest.class))).thenReturn(pageRowPageResponse);
libraryService.getProjectAssets(query);
verify(refactoringQueryService).query(pageRequestArgumentCaptor.capture());
final RefactoringPageRequest pageRequest = pageRequestArgumentCaptor.getValue();
assertEquals(FindAllLibraryAssetsQuery.NAME,
pageRequest.getQueryName());
assertEquals(1,
pageRequest.getQueryTerms().size());
assertEquals("a/b/c",
pageRequest.getQueryTerms().iterator().next().getValue());
assertEquals(0,
pageRequest.getStartRowIndex());
assertEquals(10,
pageRequest.getPageSize());
}
@Test
public void queryWithAFilter() throws Exception {
final Project project = mock(Project.class);
final Path path = mock(Path.class);
when(project.getRootPath()).thenReturn(path);
when(path.toURI()).thenReturn("the_project");
final ProjectAssetsQuery query = new ProjectAssetsQuery(project,
"helloo",
10,
20);
final PageResponse<RefactoringPageRow> pageRowPageResponse = new PageResponse<>();
pageRowPageResponse.setPageRowList(new ArrayList<>());
when(refactoringQueryService.query(any(RefactoringPageRequest.class))).thenReturn(pageRowPageResponse);
libraryService.getProjectAssets(query);
verify(refactoringQueryService).query(pageRequestArgumentCaptor.capture());
final RefactoringPageRequest pageRequest = pageRequestArgumentCaptor.getValue();
assertEquals(FindAllLibraryAssetsQuery.NAME,
pageRequest.getQueryName());
assertEquals(2,
pageRequest.getQueryTerms().size());
final Iterator<ValueIndexTerm> iterator = pageRequest.getQueryTerms().iterator();
assertEquals("the_project",
iterator.next().getValue());
assertEquals("*helloo*",
iterator.next().getValue());
assertEquals(10,
pageRequest.getStartRowIndex());
assertEquals(20,
pageRequest.getPageSize());
}
@Test
public void assertLoadPreferences() {
libraryService.getPreferences();
verify(preferences).load();
}
@Test
public void hasProjectsTest() {
final Repository emptyRepository = mock(Repository.class);
final Repository repository = mock(Repository.class);
final Set<Project> projects = new HashSet<>();
projects.add(mock(Project.class));
doReturn(projects).when(kieProjectService).getProjects(eq(repository),
anyString());
assertTrue(libraryService.hasProjects(repository,
"master"));
assertFalse(libraryService.hasProjects(emptyRepository,
"master"));
}
@Test
public void hasAssetsTest() {
final Package package1 = mock(Package.class);
final Project project1 = mock(Project.class);
doReturn(package1).when(projectService).resolveDefaultPackage(project1);
doReturn(true).when(explorerServiceHelper).hasAssets(package1);
final Package package2 = mock(Package.class);
final Project project2 = mock(Project.class);
doReturn(package2).when(projectService).resolveDefaultPackage(project2);
doReturn(false).when(explorerServiceHelper).hasAssets(package2);
assertTrue(libraryService.hasAssets(project1));
assertFalse(libraryService.hasAssets(project2));
}
@Test
public void getExampleProjectsImportUrlDefinedTest() {
final Set<ExampleProject> exampleProjects = new HashSet<>();
exampleProjects.add(mock(ExampleProject.class));
when(preferences.getImportProjectsUrl()).thenReturn("importProjectsUrl");
doReturn(exampleProjects).when(examplesService).getProjects(new ExampleRepository("importProjectsUrl"));
final Set<ExampleProject> loadedExampleProjects = libraryService.getExampleProjects();
assertEquals(exampleProjects,
loadedExampleProjects);
}
@Test
public void getExampleProjectsImportUrlNotDefinedTest() {
final ExampleRepository playgroundRepository = new ExampleRepository("playgroundRepositoryUrl");
when(preferences.getImportProjectsUrl()).thenReturn("");
doReturn(playgroundRepository).when(examplesService).getPlaygroundRepository();
libraryService.getExampleProjects();
verify(examplesService,
times(1)).getProjects(playgroundRepository);
}
@Test
public void importProjectTest() {
final OrganizationalUnit organizationalUnit = mock(OrganizationalUnit.class);
final Repository repository = mock(Repository.class);
final ExampleProject exampleProject = mock(ExampleProject.class);
final Project project = mock(Project.class);
final ProjectContextChangeEvent projectContextChangeEvent = mock(ProjectContextChangeEvent.class);
doReturn(project).when(projectContextChangeEvent).getProject();
doReturn(projectContextChangeEvent).when(examplesService).setupExamples(any(ExampleOrganizationalUnit.class),
any(ExampleTargetRepository.class),
anyString(),
anyList());
final Project importedProject = libraryService.importProject(organizationalUnit,
repository,
"master",
exampleProject);
assertEquals(project,
importedProject);
}
@Test
public void importDefaultProjectTest() {
final Repository repository = mock(Repository.class);
when(repository.getAlias()).thenReturn("repoAlias");
final OrganizationalUnit organizationalUnit = mock(OrganizationalUnit.class);
when(organizationalUnit.getName()).thenReturn("ou");
when(organizationalUnit.getIdentifier()).thenReturn("ou");
when(organizationalUnit.getRepositories()).thenReturn(singletonList(repository));
when(ouService.getOrganizationalUnits()).thenReturn(singletonList(organizationalUnit));
final ExampleProject exampleProject = mock(ExampleProject.class);
final Project project = mock(Project.class);
final ProjectContextChangeEvent projectContextChangeEvent = mock(ProjectContextChangeEvent.class);
doReturn(project).when(projectContextChangeEvent).getProject();
doReturn(projectContextChangeEvent).when(examplesService).setupExamples(any(ExampleOrganizationalUnit.class),
any(ExampleTargetRepository.class),
anyString(),
anyList());
final Project importedProject = libraryService.importProject(exampleProject);
assertEquals(project,
importedProject);
verify(examplesService).setupExamples(new ExampleOrganizationalUnit(organizationalUnit.getName()),
new ExampleTargetRepository(repository.getAlias()),
"master",
singletonList(exampleProject));
}
@Test
public void createPOM() {
when(preferences.getProjectPreferences().getGroupId()).thenReturn("projectGroupID");
when(preferences.getProjectPreferences().getVersion()).thenReturn("1.0");
when(preferences.getProjectPreferences().getDescription()).thenReturn("desc");
GAV gav = libraryService.createGAV("proj",
preferences);
POM proj = libraryService.createPOM("proj",
"description",
gav);
assertEquals("proj",
proj.getName());
assertEquals("description",
proj.getDescription());
assertEquals(gav,
proj.getGav());
}
@Test
public void createGAV() {
when(preferences.getProjectPreferences().getGroupId()).thenReturn("projectGroupID");
when(preferences.getProjectPreferences().getVersion()).thenReturn("1.0");
GAV gav = libraryService.createGAV("proj",
preferences);
assertEquals(preferences.getProjectPreferences().getGroupId(),
gav.getGroupId());
assertEquals("proj",
gav.getArtifactId());
assertEquals(preferences.getProjectPreferences().getVersion(),
gav.getVersion());
}
private void organizationalUnitWithSecondaryRepositoryExistent(final OrganizationalUnit organizationalUnit,
final String repositoryIdentifier) {
final OrganizationalUnitRepositoryInfo info5 = libraryService.getOrganizationalUnitRepositoryInfo(organizationalUnit);
assertOrganizationalUnitRepositoryInfo(info5,
4,
organizationalUnit.getIdentifier(),
1,
repositoryIdentifier);
}
private void organizationalUnitWithNoRepositoriesCreatesTheSecondaryRepositorySincePrimaryAlreadyExists(final OrganizationalUnit organizationalUnit,
final String repositoryIdentifier,
final Repository alreadyExistentPrimaryRepository) {
doReturn(alreadyExistentPrimaryRepository).when(repositoryService).getRepository("repository1");
final OrganizationalUnitRepositoryInfo info = libraryService.getOrganizationalUnitRepositoryInfo(organizationalUnit);
assertOrganizationalUnitRepositoryInfo(info,
4,
organizationalUnit.getIdentifier(),
0,
repositoryIdentifier);
}
private void organizationalUnitWithNoRepositoriesCreatesThePrimaryRepository(final OrganizationalUnit organizationalUnit,
final String repositoryIdentifier) {
doReturn(null).when(repositoryService).getRepository("repository1");
final OrganizationalUnitRepositoryInfo info = libraryService.getOrganizationalUnitRepositoryInfo(organizationalUnit);
assertOrganizationalUnitRepositoryInfo(info,
4,
organizationalUnit.getIdentifier(),
0,
repositoryIdentifier);
}
private void organizationalUnitWithTwoRepositoriesSelectsTheFirst(final OrganizationalUnit organizationalUnit,
final String repositoryIdentifier) {
final OrganizationalUnitRepositoryInfo info = libraryService.getOrganizationalUnitRepositoryInfo(organizationalUnit);
assertOrganizationalUnitRepositoryInfo(info,
4,
organizationalUnit.getIdentifier(),
2,
repositoryIdentifier);
}
private void organizationalUnitWithPrimaryRepositoryExistent(final OrganizationalUnit organizationalUnit,
final String repositoryIdentifier) {
final OrganizationalUnitRepositoryInfo info = libraryService.getOrganizationalUnitRepositoryInfo(organizationalUnit);
assertOrganizationalUnitRepositoryInfo(info,
4,
organizationalUnit.getIdentifier(),
1,
repositoryIdentifier);
}
private void assertOrganizationalUnitRepositoryInfo(final OrganizationalUnitRepositoryInfo info,
final int totalOfOrganizationalUnits,
final String organizationalUnitIdentifier,
final int totalOfRepositories,
final String repositoryAlias) {
assertEquals(totalOfOrganizationalUnits,
info.getOrganizationalUnits().size());
assertEquals(organizationalUnitIdentifier,
info.getSelectedOrganizationalUnit().getIdentifier());
assertEquals(totalOfRepositories,
info.getRepositories().size());
assertEquals(repositoryAlias,
info.getSelectedRepository().getAlias());
}
private Repository getRepository(final String alias) {
final Repository repository1 = mock(Repository.class);
doReturn(alias).when(repository1).getAlias();
return repository1;
}
private OrganizationalUnit getOrganizationalUnit(final String identifier,
final Repository... repositories) {
final OrganizationalUnit organizationalUnit = mock(OrganizationalUnit.class);
doReturn(identifier).when(organizationalUnit).getIdentifier();
doReturn(Arrays.asList(repositories)).when(organizationalUnit).getRepositories();
return organizationalUnit;
}
}