/* * Copyright 2015 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.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import org.guvnor.common.services.backend.file.LinkedFilter; import org.guvnor.common.services.backend.metadata.attribute.OtherMetaView; import org.guvnor.common.services.project.model.Package; import org.guvnor.common.services.shared.metadata.MetadataService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.screens.explorer.model.FolderItem; import org.kie.workbench.common.screens.explorer.model.FolderItemOperation; import org.kie.workbench.common.screens.explorer.model.FolderItemType; import org.kie.workbench.common.screens.explorer.service.ActiveOptions; import org.kie.workbench.common.screens.explorer.service.Option; import org.kie.workbench.common.services.shared.project.KieProjectService; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.uberfire.backend.server.UserServicesImpl; import org.uberfire.backend.server.VFSLockServiceImpl; import org.uberfire.backend.vfs.Path; import org.uberfire.backend.vfs.PathFactory; import org.uberfire.ext.editor.commons.service.CopyService; import org.uberfire.ext.editor.commons.service.DeleteService; import org.uberfire.ext.editor.commons.service.RenameService; import org.uberfire.io.IOService; import org.uberfire.java.nio.fs.file.SimpleFileSystemProvider; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class ExplorerServiceHelperTest { private SimpleFileSystemProvider fileSystemProvider; @Mock private KieProjectService projectService; @Mock private FolderListingResolver folderListingResolver; @Mock private IOService ioService; @Mock private IOService ioServiceConfig; @Mock private OtherMetaView otherMetaView; @Mock private VFSLockServiceImpl lockService; @Mock private MetadataService metadataService; @Mock private UserServicesImpl userServices; @Mock private DeleteService deleteService; @Mock private RenameService renameService; @Mock private CopyService copyService; @Mock private Package pkg; @Mock private Package childPkg; @Mock private Path srcPath; @Mock private Path srcTestPath; @Mock private Path srcResourcesPath; @Mock private Path testResourcesPath; private org.uberfire.java.nio.file.Path path; private ExplorerServiceHelper helper; private final List<String> tags = new ArrayList<String>() {{ add( "tag" ); }}; @Before public void setUp() throws Exception { fileSystemProvider = new SimpleFileSystemProvider(); //Ensure URLs use the default:// scheme fileSystemProvider.forceAsDefault(); path = fileSystemProvider.getPath( this.getClass().getResource( "myfile.file" ).toURI() ); when( srcPath.toURI() ).thenReturn( path.toUri().toString() ); when( srcTestPath.toURI() ).thenReturn( path.toUri().toString() ); when( srcResourcesPath.toURI() ).thenReturn( path.toUri().toString() ); when( testResourcesPath.toURI() ).thenReturn( path.toUri().toString() ); when( pkg.getPackageMainSrcPath() ).thenReturn( srcPath ); when( pkg.getPackageTestSrcPath() ).thenReturn( srcTestPath ); when( pkg.getPackageMainResourcesPath() ).thenReturn( srcResourcesPath ); when( pkg.getPackageTestResourcesPath() ).thenReturn( testResourcesPath ); when( metadataService.getTags( any( Path.class ) ) ).thenReturn( tags ); when( ioService.newDirectoryStream( any( org.uberfire.java.nio.file.Path.class ), any( LinkedFilter.class ) ) ).thenReturn( new DirectoryStreamMock() { private List<org.uberfire.java.nio.file.Path> items = new ArrayList<org.uberfire.java.nio.file.Path>() {{ add( path ); }}; @Override public Iterator<org.uberfire.java.nio.file.Path> iterator() { return items.iterator(); } } ); helper = spy( new ExplorerServiceHelper( projectService, folderListingResolver, ioService, ioServiceConfig, lockService, metadataService, userServices, deleteService, renameService, copyService ) ); } @Test public void testBusinessViewWithoutTags() { final List<FolderItem> fis = getFolderItems( Option.BUSINESS_CONTENT ); checkFolderItemsWithoutTags( fis ); } @Test public void testTechnicalViewWithoutTags() { final List<FolderItem> fis = getFolderItems( Option.TECHNICAL_CONTENT ); checkFolderItemsWithoutTags( fis ); } protected void checkFolderItemsWithoutTags( List<FolderItem> fis ) { assertNotNull( fis ); assertEquals( 4, fis.size() ); assertEquals( 0, fis.get( 0 ).getTags().size() ); assertEquals( 0, fis.get( 1 ).getTags().size() ); assertEquals( 0, fis.get( 2 ).getTags().size() ); assertEquals( 0, fis.get( 3 ).getTags().size() ); } @Test public void testBusinessViewWithTags() { final List<FolderItem> fis = getFolderItems( Option.BUSINESS_CONTENT, Option.SHOW_TAG_FILTER ); checkFolderItemsWithTags( fis ); } @Test public void testTechnicalViewWithags() { final List<FolderItem> fis = getFolderItems( Option.TECHNICAL_CONTENT, Option.SHOW_TAG_FILTER ); checkFolderItemsWithTags( fis ); } protected void checkFolderItemsWithTags( List<FolderItem> fis ) { assertNotNull( fis ); assertEquals( 4, fis.size() ); assertEquals( 1, fis.get( 0 ).getTags().size() ); assertEquals( 1, fis.get( 1 ).getTags().size() ); assertEquals( 1, fis.get( 2 ).getTags().size() ); assertEquals( 1, fis.get( 3 ).getTags().size() ); } protected List<FolderItem> getFolderItems( Option... options ) { final ActiveOptions activeOptions = new ActiveOptions( options ); return helper.getItems( pkg, activeOptions ); } @Test public void testDeleteOperationHasRestrictions() { givenThatOperationHasRestrictions( FolderItemOperation.DELETE ); givenThatOperationHasNoRestrictions( FolderItemOperation.RENAME ); givenThatOperationHasNoRestrictions( FolderItemOperation.COPY ); List<FolderItemOperation> restrictedOperations = whenRestrictedOperationsAreListed(); thenOperationIsRestricted( FolderItemOperation.DELETE, restrictedOperations ); thenThereAreNOperationsRestricted( 1, restrictedOperations ); } @Test public void testRenameOperationHasRestrictions() { givenThatOperationHasNoRestrictions( FolderItemOperation.DELETE ); givenThatOperationHasRestrictions( FolderItemOperation.RENAME ); givenThatOperationHasNoRestrictions( FolderItemOperation.COPY ); List<FolderItemOperation> restrictedOperations = whenRestrictedOperationsAreListed(); thenOperationIsRestricted( FolderItemOperation.RENAME, restrictedOperations ); thenThereAreNOperationsRestricted( 1, restrictedOperations ); } @Test public void testCopyOperationHasRestrictions() { givenThatOperationHasNoRestrictions( FolderItemOperation.DELETE ); givenThatOperationHasNoRestrictions( FolderItemOperation.RENAME ); givenThatOperationHasRestrictions( FolderItemOperation.COPY ); List<FolderItemOperation> restrictedOperations = whenRestrictedOperationsAreListed(); thenOperationIsRestricted( FolderItemOperation.COPY, restrictedOperations ); thenThereAreNOperationsRestricted( 1, restrictedOperations ); } @Test public void testDeleteRenameCopyOperationHasRestrictions() { givenThatOperationHasRestrictions( FolderItemOperation.DELETE ); givenThatOperationHasRestrictions( FolderItemOperation.RENAME ); givenThatOperationHasRestrictions( FolderItemOperation.COPY ); List<FolderItemOperation> restrictedOperations = whenRestrictedOperationsAreListed(); thenOperationIsRestricted( FolderItemOperation.DELETE, restrictedOperations ); thenOperationIsRestricted( FolderItemOperation.RENAME, restrictedOperations ); thenOperationIsRestricted( FolderItemOperation.COPY, restrictedOperations ); thenThereAreNOperationsRestricted( 3, restrictedOperations ); } @Test public void packageHasNoAssetsTest() { doReturn( false ).when( helper ).hasAssets( srcPath ); doReturn( false ).when( helper ).hasAssets( srcResourcesPath ); doReturn( false ).when( helper ).hasAssets( srcTestPath ); doReturn( false ).when( helper ).hasAssets( testResourcesPath ); doReturn( new HashSet<Package>() {{ add( childPkg ); }} ).when( projectService ).resolvePackages( pkg ); doReturn( false ).when( helper ).hasAssets( childPkg ); assertFalse( helper.hasAssets( pkg ) ); } @Test public void packageHasAssetsInsideSrcPathTest() { doReturn( true ).when( helper ).hasAssets( srcPath ); doReturn( false ).when( helper ).hasAssets( srcResourcesPath ); doReturn( false ).when( helper ).hasAssets( srcTestPath ); doReturn( false ).when( helper ).hasAssets( testResourcesPath ); doReturn( new HashSet<Package>() {{ add( childPkg ); }} ).when( projectService ).resolvePackages( pkg ); doReturn( false ).when( helper ).hasAssets( childPkg ); assertTrue( helper.hasAssets( pkg ) ); } @Test public void packageHasAssetsInsideResourcesPathTest() { doReturn( false ).when( helper ).hasAssets( srcPath ); doReturn( true ).when( helper ).hasAssets( srcResourcesPath ); doReturn( false ).when( helper ).hasAssets( srcTestPath ); doReturn( false ).when( helper ).hasAssets( testResourcesPath ); doReturn( new HashSet<Package>() {{ add( childPkg ); }} ).when( projectService ).resolvePackages( pkg ); doReturn( false ).when( helper ).hasAssets( childPkg ); assertTrue( helper.hasAssets( pkg ) ); } @Test public void packageHasAssetsInsideTestSrcPathTest() { doReturn( false ).when( helper ).hasAssets( srcPath ); doReturn( false ).when( helper ).hasAssets( srcResourcesPath ); doReturn( true ).when( helper ).hasAssets( srcTestPath ); doReturn( false ).when( helper ).hasAssets( testResourcesPath ); doReturn( new HashSet<Package>() {{ add( childPkg ); }} ).when( projectService ).resolvePackages( pkg ); doReturn( false ).when( helper ).hasAssets( childPkg ); assertTrue( helper.hasAssets( pkg ) ); } @Test public void packageHasAssetsInsideTestResourcesPathTest() { doReturn( false ).when( helper ).hasAssets( srcPath ); doReturn( false ).when( helper ).hasAssets( srcResourcesPath ); doReturn( false ).when( helper ).hasAssets( srcTestPath ); doReturn( true ).when( helper ).hasAssets( testResourcesPath ); doReturn( new HashSet<Package>() {{ add( childPkg ); }} ).when( projectService ).resolvePackages( pkg ); doReturn( false ).when( helper ).hasAssets( childPkg ); assertTrue( helper.hasAssets( pkg ) ); } @Test public void packageHasAssetsInsideChildPackageTest() { doReturn( false ).when( helper ).hasAssets( srcPath ); doReturn( false ).when( helper ).hasAssets( srcResourcesPath ); doReturn( false ).when( helper ).hasAssets( srcTestPath ); doReturn( false ).when( helper ).hasAssets( testResourcesPath ); doReturn( new HashSet<Package>() {{ add( childPkg ); }} ).when( projectService ).resolvePackages( pkg ); doReturn( true ).when( helper ).hasAssets( childPkg ); assertTrue( helper.hasAssets( pkg ) ); } private void givenThatOperationHasRestrictions( FolderItemOperation operation ) { mockOperationRestrictions( operation, true ); } private void givenThatOperationHasNoRestrictions( FolderItemOperation operation ) { mockOperationRestrictions( operation, false ); } private void mockOperationRestrictions( FolderItemOperation operation, boolean hasRestrictions ) { if ( FolderItemOperation.DELETE.equals( operation ) ) { mockDeleteRestrictions( hasRestrictions ); } else if ( FolderItemOperation.RENAME.equals( operation ) ) { mockRenameRestrictions( hasRestrictions ); } else if ( FolderItemOperation.COPY.equals( operation ) ) { mockCopyRestrictions( hasRestrictions ); } } private List<FolderItemOperation> whenRestrictedOperationsAreListed() { return helper.getRestrictedOperations( getPath( "file.txt" ) ); } private void thenOperationIsRestricted( FolderItemOperation operation, List<FolderItemOperation> restrictedOperations ) { assertTrue( restrictedOperations.contains( operation ) ); } private void thenThereAreNOperationsRestricted( int n, List<FolderItemOperation> restrictedOperations ) { assertEquals( n, restrictedOperations.size() ); } private void mockDeleteRestrictions( boolean hasRestrictions ) { when( deleteService.hasRestriction( any( Path.class ) ) ).thenReturn( hasRestrictions ); } private void mockRenameRestrictions( boolean hasRestrictions ) { when( renameService.hasRestriction( any( Path.class ) ) ).thenReturn( hasRestrictions ); } private void mockCopyRestrictions( boolean hasRestrictions ) { when( copyService.hasRestriction( any( Path.class ) ) ).thenReturn( hasRestrictions ); } private Path getPath( String fileName ) { return PathFactory.newPath( fileName, "default://tmp/" + fileName ); } }