/* * 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.impl.git.GitRepository; import org.jboss.errai.security.shared.api.identity.User; import org.junit.Before; import org.junit.Ignore; 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 ProjectExplorerContentResolverTest { protected final SimpleFileSystemProvider fs = new SimpleFileSystemProvider(); private ProjectExplorerContentResolver resolver; private OrganizationalUnit organizationalUnit; private GitRepository repository; private Set<Project> masterProjects; private Set<Project> devProjects; private HelperWrapper helperWrapper; @Before public void setUp() throws Exception { //Ensure URLs use the default:// scheme fs.forceAsDefault(); KieProjectService projectService = mock( KieProjectService.class ); ExplorerServiceHelper helper = mock( ExplorerServiceHelper.class ); AuthorizationManager authorizationManager = mock( AuthorizationManager.class ); OrganizationalUnitService organizationalUnitService = mock( OrganizationalUnitService.class ); ExplorerServiceHelper explorerServiceHelper = mock( ExplorerServiceHelper.class ); repository = getGitRepository(); organizationalUnit = spy( new OrganizationalUnitImpl( "demo", "demo", "demo" ) ); organizationalUnit.getRepositories().add( repository ); ArrayList<OrganizationalUnit> organizationalUnits = new ArrayList<OrganizationalUnit>(); organizationalUnits.add( organizationalUnit ); UserExplorerData userExplorerData = new UserExplorerData(); userExplorerData.setOrganizationalUnit( organizationalUnit ); masterProjects = new HashSet<Project>(); masterProjects.add( createProject( "master", "project 1" ) ); masterProjects.add( createProject( "master", "project 2" ) ); devProjects = new HashSet<Project>(); devProjects.add( createProject( "dev-1.0.0", "project 1" ) ); devProjects.add( createProject( "dev-1.0.0", "project 2" ) ); 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( getFileItem(), 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( repository, "master" ) ).thenReturn( masterProjects ); when( projectService.getProjects( repository, "dev-1.0.0" ) ).thenReturn( devProjects ); when( projectService.resolveDefaultPackage( any( Project.class ) ) ).thenReturn( new Package() ); resolver = new ProjectExplorerContentResolver( projectService, helper, authorizationManager, organizationalUnitService, explorerServiceHelper ); } private FolderItem getFileItem() { Path path = mock( Path.class ); return new FolderItem( path, "someitem", FolderItemType.FILE ); } @Test public void testResolveNullQueryBusinessView() throws Exception { final ProjectExplorerContentQuery query = new ProjectExplorerContentQuery(); final ActiveOptions options = new ActiveOptions(); options.add( Option.TREE_NAVIGATOR ); options.add( Option.EXCLUDE_HIDDEN_ITEMS ); options.add( Option.BUSINESS_CONTENT ); query.setOptions( options ); resolver.resolve( query ); } @Test public void testResolveNullQueryTechnicalView() throws Exception { final ProjectExplorerContentQuery query = new ProjectExplorerContentQuery(); final ActiveOptions options = new ActiveOptions(); options.add( Option.TREE_NAVIGATOR ); options.add( Option.EXCLUDE_HIDDEN_ITEMS ); options.add( Option.TECHNICAL_CONTENT ); query.setOptions( options ); resolver.resolve( query ); } @Test public void testResolveWithOUNullQueryBusinessView() throws Exception { final ProjectExplorerContentQuery query = new ProjectExplorerContentQuery( organizationalUnit ); final ActiveOptions options = new ActiveOptions(); options.add( Option.TREE_NAVIGATOR ); options.add( Option.EXCLUDE_HIDDEN_ITEMS ); options.add( Option.BUSINESS_CONTENT ); query.setOptions( options ); resolver.resolve( query ); } @Test public void testResolveWithOUNullQueryTechnicalView() throws Exception { final ProjectExplorerContentQuery query = new ProjectExplorerContentQuery( organizationalUnit ); final ActiveOptions options = new ActiveOptions(); options.add( Option.TREE_NAVIGATOR ); options.add( Option.EXCLUDE_HIDDEN_ITEMS ); options.add( Option.TECHNICAL_CONTENT ); query.setOptions( options ); resolver.resolve( query ); } @Test public void testResolveWithOUWithRepositoryNullQueryBusinessView() throws Exception { final ProjectExplorerContentQuery query = new ProjectExplorerContentQuery( organizationalUnit, getGitRepository(), "master" ); final ActiveOptions options = new ActiveOptions(); options.add( Option.TREE_NAVIGATOR ); options.add( Option.EXCLUDE_HIDDEN_ITEMS ); options.add( Option.BUSINESS_CONTENT ); query.setOptions( options ); resolver.resolve( query ); } @Test public void testResolveWithOUWithRepositoryNullQueryTechnicalView() throws Exception { final ProjectExplorerContentQuery query = new ProjectExplorerContentQuery( organizationalUnit, getGitRepository(), "master" ); final ActiveOptions options = new ActiveOptions(); options.add( Option.TREE_NAVIGATOR ); options.add( Option.EXCLUDE_HIDDEN_ITEMS ); options.add( Option.TECHNICAL_CONTENT ); query.setOptions( options ); resolver.resolve( query ); } @Test public void testChangeProjectOnBusinessView() throws Exception { ProjectExplorerContent content = resolver.resolve( getContentQuery( "master", createProject( "master", "project 1" ), Option.BUSINESS_CONTENT ) ); helperWrapper.reset(); assertEquals( "master", content.getBranch() ); assertNotNull( content.getProject() ); // This will be the default project assertEquals( "master@project 1", content.getProject().getRootPath().toURI() ); content = resolver.resolve( getContentQuery( "dev-1.0.0", createProject( "dev-1.0.0", "project 1" ), Option.BUSINESS_CONTENT ) ); helperWrapper.reset(); assertEquals( "dev-1.0.0", content.getBranch() ); assertEquals( "project 1", content.getProject().getProjectName() ); assertEquals( "dev-1.0.0@project 1", content.getProject().getRootPath().toURI() ); content = resolver.resolve( getContentQuery( "dev-1.0.0", createProject( "dev-1.0.0", "project 2" ), Option.BUSINESS_CONTENT ) ); helperWrapper.reset(); assertEquals( "dev-1.0.0", content.getBranch() ); assertEquals( "project 2", content.getProject().getProjectName() ); assertEquals( "dev-1.0.0@project 2", content.getProject().getRootPath().toURI() ); content = resolver.resolve( getContentQuery( "master", createProject( "master", "project 2" ), Option.BUSINESS_CONTENT ) ); helperWrapper.reset(); assertEquals( "master", content.getBranch() ); assertEquals( "project 2", content.getProject().getProjectName() ); assertEquals( "master@project 2", content.getProject().getRootPath().toURI() ); } @Test public void testChangeProjectOnTechnicalView() { ProjectExplorerContent projectExplorerContent = resolver.resolve( getContentQuery( "master", createProject( "master", "project 1" ), Option.TECHNICAL_CONTENT ) ); helperWrapper.reset(); Content content = resolver.setupSelectedItems( getContentQuery( "master", createProject( "master", "project 2" ), Option.TECHNICAL_CONTENT, null, getFileItem() ) ); helperWrapper.reset(); assertEquals( "demo", content.getSelectedOrganizationalUnit().getName() ); assertEquals( "master", content.getSelectedBranch() ); assertEquals( "master@project 2", content.getSelectedProject().getRootPath().toURI() ); assertNull( content.getSelectedItem() ); assertNull( content.getSelectedPackage() ); } @Test public void testChangeProjectOnTechnicalViewWhenThereIsAFolderItemButNoActiveProjectOrganizationalUnitOrRepository() { ProjectExplorerContent projectExplorerContent = resolver.resolve( getContentQuery( "master", createProject( "master", "project 1" ), Option.TECHNICAL_CONTENT ) ); helperWrapper.reset(); ProjectExplorerContentQuery projectExplorerContentQuery = new ProjectExplorerContentQuery( null, null, null, null, null, getFileItem() ); ActiveOptions options = new ActiveOptions(); options.add( Option.TECHNICAL_CONTENT ); projectExplorerContentQuery.setOptions( options ); helperWrapper.excludePackage(); Content content = resolver.setupSelectedItems( projectExplorerContentQuery ); helperWrapper.reset(); assertEquals( "demo", content.getSelectedOrganizationalUnit().getName() ); assertEquals( "master", content.getSelectedBranch() ); assertEquals( "master@project 1", content.getSelectedProject().getRootPath().toURI() ); assertNotNull( content.getSelectedItem() ); assertNull( content.getSelectedPackage() ); } private Project createProject( final String branch, final String projectName ) { return new Project( createMockPath( branch, projectName ), createMockPath( branch, projectName ), projectName ); } 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() ); } }; } @Test @Ignore public void testBranchChange() throws Exception { // getContentQuery("dev-1.0.0"); // // UserExplorerLastData userExplorerLastData = new UserExplorerLastData(); // userExplorerLastData.setPackage(organizationalUnit, getGitRepository("master"), null, null); // // // when(authorizationManager.authorize(any(Resource.class), any(User.class))).thenReturn(true); // // when(helper.getLastContent()).thenReturn(userExplorerLastData); // // when(helper.loadUserContent()).thenReturn(new UserExplorerData()); // // when(ioService.newDirectoryStream(any(org.uberfire.java.nio.file.Path.class))).thenReturn(new DirectoryStream<org.uberfire.java.nio.file.Path>() { // @Override // public void close() throws IOException { // // } // // @Override // public Iterator<org.uberfire.java.nio.file.Path> iterator() { // return Collections.<org.uberfire.java.nio.file.Path>emptyList().iterator(); // } // }); // // when(organizationalUnitService.getOrganizationalUnit(anyString())).thenReturn(organizationalUnit); // ArrayList<Repository> repositories = new ArrayList<Repository>(); // repositories.add(getGitRepository("master")); // when(organizationalUnit.getRepositories()).thenReturn(repositories); // // ProjectExplorerContent content = resolver.resolve(contentQuery); // assertEquals("dev-1.0.0", content.getRepository().getCurrentBranch()); } private ProjectExplorerContentQuery getContentQuery( final String branchName, final Project project, final Option content ) { return getContentQuery( branchName, project, content, null, null ); } private ProjectExplorerContentQuery getContentQuery( final String branchName, final Project project, final Option content, final Package pkg, final FolderItem item ) { ProjectExplorerContentQuery projectExplorerContentQuery = new ProjectExplorerContentQuery( organizationalUnit, getGitRepository(), branchName, project, pkg, item ); ActiveOptions options = new ActiveOptions(); options.add( Option.TREE_NAVIGATOR ); options.add( Option.EXCLUDE_HIDDEN_ITEMS ); options.add( content ); projectExplorerContentQuery.setOptions( options ); return projectExplorerContentQuery; } private GitRepository getGitRepository() { GitRepository repository = new GitRepository(); HashMap<String, Path> branches = new HashMap<String, Path>(); Path pathToMaster = PathFactory.newPath( "/", "file://master@project/" ); branches.put( "master", pathToMaster ); Path pathToDev = PathFactory.newPath( "/", "file://dev-1.0.0@project/" ); branches.put( "dev-1.0.0", pathToDev ); repository.setRoot( pathToMaster ); repository.setBranches( branches ); return repository; } }