/* * Copyright 2014 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.explorer.backend.server; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Set; 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.organizationalunit.impl.OrganizationalUnitImpl; import org.guvnor.structure.repositories.Repository; import org.guvnor.structure.repositories.impl.git.GitRepository; import org.jboss.errai.security.shared.api.identity.User; import org.junit.Before; import org.junit.Test; import org.kie.workbench.common.screens.explorer.model.FolderItem; import org.kie.workbench.common.screens.explorer.model.FolderItemType; import org.kie.workbench.common.screens.explorer.model.FolderListing; import org.kie.workbench.common.screens.explorer.model.ProjectExplorerContent; import org.kie.workbench.common.screens.explorer.service.ActiveOptions; import org.kie.workbench.common.screens.explorer.service.Option; import org.kie.workbench.common.screens.explorer.service.ProjectExplorerContentQuery; import org.kie.workbench.common.services.shared.project.KieProjectService; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.uberfire.backend.vfs.Path; import org.uberfire.backend.vfs.PathFactory; import org.uberfire.java.nio.fs.file.SimpleFileSystemProvider; import org.uberfire.security.authz.AuthorizationManager; import static org.junit.Assert.*; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; public class ProjectExplorerContentResolverDefaultSelectionsTest { private SimpleFileSystemProvider fs = new SimpleFileSystemProvider(); private ProjectExplorerContentResolver resolver; private OrganizationalUnit organizationalUnit; private GitRepository repository1; private Project repository1Project1; private Set<Project> repository1Projects; private GitRepository repository2; private Project repository2Project1; private Set<Project> repository2Projects; private UserExplorerData userExplorerData; private HelperWrapper helperWrapper; @Before public void setUp() throws Exception { //Ensure URLs use the default:// scheme fs.forceAsDefault(); final KieProjectService projectService = mock( KieProjectService.class ); final ExplorerServiceHelper helper = mock( ExplorerServiceHelper.class ); final AuthorizationManager authorizationManager = mock( AuthorizationManager.class ); final OrganizationalUnitService organizationalUnitService = mock( OrganizationalUnitService.class ); final ExplorerServiceHelper explorerServiceHelper = mock( ExplorerServiceHelper.class ); repository1 = getGitRepository( "repo1" ); repository2 = getGitRepository( "repo2" ); organizationalUnit = spy( new OrganizationalUnitImpl( "demo", "demo", "demo" ) ); organizationalUnit.getRepositories().add( repository1 ); organizationalUnit.getRepositories().add( repository2 ); final ArrayList<OrganizationalUnit> organizationalUnits = new ArrayList<OrganizationalUnit>(); organizationalUnits.add( organizationalUnit ); repository1Project1 = createProject( "master", "r1p1" ); repository1Projects = new HashSet<Project>() {{ add( repository1Project1 ); }}; repository2Project1 = createProject( "master", "r2p1" ); repository2Projects = new HashSet<Project>() {{ add( repository2Project1 ); }}; userExplorerData = new UserExplorerData(); userExplorerData.setOrganizationalUnit( organizationalUnit ); userExplorerData.addRepository( organizationalUnit, repository1 ); userExplorerData.addRepository( organizationalUnit, repository2 ); helperWrapper = new HelperWrapper( helper ); when( helper.getLastContent() ).thenAnswer( new Answer<Object>() { @Override public Object answer( InvocationOnMock invocationOnMock ) throws Throwable { return helperWrapper.getUserExplorerLastData(); } } ); when( helper.loadUserContent() ).thenReturn( userExplorerData ); when( helper.getFolderListing( any( FolderItem.class ), any( Project.class ), any( Package.class ), any( ActiveOptions.class ) ) ).thenReturn( new FolderListing( createFileItem(), Collections.EMPTY_LIST, Collections.EMPTY_LIST ) ); when( organizationalUnitService.getOrganizationalUnits() ).thenReturn( organizationalUnits ); when( organizationalUnitService.getOrganizationalUnit( "demo" ) ).thenReturn( organizationalUnit ); when( authorizationManager.authorize( any( OrganizationalUnit.class ), any( User.class ) ) ).thenReturn( true ); when( authorizationManager.authorize( any( Project.class ), any( User.class ) ) ).thenReturn( true ); when( projectService.getProjects( repository1, "master" ) ).thenReturn( repository1Projects ); when( projectService.getProjects( repository2, "master" ) ).thenReturn( repository2Projects ); when( projectService.resolveDefaultPackage( repository1Project1 ) ).thenReturn( createPackage( "master", repository1Project1.getProjectName() ) ); when( projectService.resolveDefaultPackage( repository2Project1 ) ).thenReturn( createPackage( "master", repository2Project1.getProjectName() ) ); resolver = new ProjectExplorerContentResolver( projectService, helper, authorizationManager, organizationalUnitService, explorerServiceHelper ); } @Test public void testSelectionsEmpty() throws Exception { final ProjectExplorerContent content = resolver.resolve( getContentQuery( null, null, null ) ); assertEquals( organizationalUnit, content.getOrganizationalUnit() ); //The implementation does not order Repositories internally hence we cannot //guarantee which Repository will be the default. Just test for consistency. if ( content.getRepository().equals( repository1 ) ) { assertEquals( repository1Project1, content.getProject() ); } else if ( content.getRepository().equals( repository2 ) ) { assertEquals( repository2Project1, content.getProject() ); } else { fail( "A default Repository should have been selected." ); } } @Test public void testSelectionsRepository() throws Exception { final ProjectExplorerContent content = resolver.resolve( getContentQuery( repository1, "master", null ) ); assertEquals( organizationalUnit, content.getOrganizationalUnit() ); assertEquals( repository1, content.getRepository() ); assertEquals( repository1Project1, content.getProject() ); } @Test public void testSelectionsProject() throws Exception { final ProjectExplorerContent content = resolver.resolve( getContentQuery( repository1, "master", repository1Project1 ) ); assertEquals( organizationalUnit, content.getOrganizationalUnit() ); assertEquals( repository1, content.getRepository() ); assertEquals( repository1Project1, content.getProject() ); } @Test public void testSelectionsDeleteRepository() throws Exception { //Select something in the Repository to be deleted final ProjectExplorerContent content1 = resolver.resolve( getContentQuery( repository2, "master", repository2Project1 ) ); assertEquals( organizationalUnit, content1.getOrganizationalUnit() ); assertEquals( repository2, content1.getRepository() ); assertEquals( repository2Project1, content1.getProject() ); //Delete the Repository organizationalUnit.getRepositories().remove( repository2 ); final ProjectExplorerContent content2 = resolver.resolve( getContentQuery( repository2, "master", repository2Project1 ) ); assertEquals( organizationalUnit, content2.getOrganizationalUnit() ); assertEquals( repository1, content2.getRepository() ); assertEquals( repository1Project1, content2.getProject() ); } private FolderItem createFileItem() { Path path = mock( Path.class ); return new FolderItem( path, "someitem", FolderItemType.FILE ); } private Project createProject( final String branch, final String projectName ) { return new Project( createMockPath( branch, projectName ), createMockPath( branch, projectName ), projectName ); } private Package createPackage( final String branch, final String projectName ) { return new Package( createMockPath( branch, projectName ), createMockPath( branch, projectName ), createMockPath( branch, projectName ), createMockPath( branch, projectName ), createMockPath( branch, projectName ), "default", "default", "default" ); } private Path createMockPath( final String branch, final String projectName ) { return new Path() { @Override public String getFileName() { return projectName; } @Override public String toURI() { return branch + "@" + projectName; } @Override public int compareTo( Path o ) { return toURI().compareTo( o.toURI() ); } }; } private ProjectExplorerContentQuery getContentQuery( final Repository repository, final String branch, final Project project ) { final ProjectExplorerContentQuery projectExplorerContentQuery = new ProjectExplorerContentQuery( organizationalUnit, repository, branch, project ); final ActiveOptions options = new ActiveOptions(); options.add( Option.TREE_NAVIGATOR ); options.add( Option.EXCLUDE_HIDDEN_ITEMS ); options.add( Option.BUSINESS_CONTENT ); projectExplorerContentQuery.setOptions( options ); return projectExplorerContentQuery; } private GitRepository getGitRepository( final String alias ) { final GitRepository repository = new GitRepository( alias ); final HashMap<String, Path> branches = new HashMap<String, Path>(); final Path path = PathFactory.newPath( "/", "file://master@project/" ); branches.put( "master", path ); repository.setBranches( branches ); return repository; } }