package org.pentaho.platform.web.http.api.resources.services; import org.apache.commons.io.IOUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.pentaho.platform.api.engine.IAuthorizationPolicy; import org.pentaho.platform.api.engine.PentahoAccessControlException; import org.pentaho.platform.plugin.services.importer.IPlatformImporter; import org.pentaho.platform.plugin.services.importer.PlatformImportException; import org.pentaho.platform.plugin.services.importer.RepositoryFileImportBundle; import org.pentaho.platform.security.policy.rolebased.actions.AdministerSecurityAction; import org.pentaho.platform.security.policy.rolebased.actions.PublishAction; import org.pentaho.platform.security.policy.rolebased.actions.RepositoryCreateAction; import org.pentaho.platform.security.policy.rolebased.actions.RepositoryReadAction; import java.io.InputStream; import static org.junit.Assert.fail; import static org.mockito.Mockito.*; public class RepositoryPublishServiceTest { private RepositoryPublishService repositoryPublishService; private RepositoryFileImportBundle mockRepositoryFileImportBundle; @Before public void setUp() { repositoryPublishService = spy( new RepositoryPublishService() ); repositoryPublishService.platformImporter = mock( IPlatformImporter.class ); repositoryPublishService.policy = mock( IAuthorizationPolicy.class ); mockRepositoryFileImportBundle = mock( RepositoryFileImportBundle.class ); } @After public void cleanup() { repositoryPublishService = null; } @Test public void testWriteFile() throws Exception { String pathId = "path:to:file"; InputStream stubInputStream = IOUtils.toInputStream( "some test data for my input stream" ); Boolean overwriteFile = true; doReturn( true ).when( repositoryPublishService.policy ).isAllowed( anyString() ); doReturn( repositoryPublishService.policy ).when( repositoryPublishService ).getPolicy(); doReturn( mockRepositoryFileImportBundle ).when( repositoryPublishService ).buildBundle( pathId, stubInputStream, overwriteFile ); repositoryPublishService.writeFile( pathId, stubInputStream, overwriteFile ); verify( repositoryPublishService.platformImporter, times( 1 ) ).importFile( mockRepositoryFileImportBundle ); } @Test public void testWriteFileException() throws Exception { String pathId = "path:to:file"; InputStream stubInputStream = IOUtils.toInputStream( "some test data for my input stream" ); Boolean overwriteFile = true; doReturn( mockRepositoryFileImportBundle ).when( repositoryPublishService ).buildBundle( pathId, stubInputStream, overwriteFile ); /* * Test 1 */ doReturn( false ).when( repositoryPublishService.policy ).isAllowed( anyString() ); doReturn( repositoryPublishService.policy ).when( repositoryPublishService ).getPolicy(); try { repositoryPublishService.writeFile( pathId, stubInputStream, overwriteFile ); fail(); } catch ( PentahoAccessControlException e ) { // Expected } catch ( Throwable t ) { fail(); } /* * Test 2 */ doReturn( true ).when( repositoryPublishService.policy ).isAllowed( anyString() ); doThrow( new PlatformImportException( "" ) ).when( repositoryPublishService.platformImporter ).importFile( mockRepositoryFileImportBundle ); try { repositoryPublishService.writeFile( pathId, stubInputStream, overwriteFile ); fail(); } catch ( PlatformImportException e ) { // Expected } catch ( Exception e ) { fail(); } /* * Test 3 */ doReturn( true ).when( repositoryPublishService.policy ).isAllowed( anyString() ); doThrow( new InternalError() ).when( repositoryPublishService.platformImporter ). importFile( mockRepositoryFileImportBundle ); try { repositoryPublishService.writeFile( pathId, stubInputStream, overwriteFile ); fail(); } catch ( PlatformImportException e ) { fail(); } catch ( InternalError e ) { // Expected } } @Test( expected = PentahoAccessControlException.class ) public void prohibitedForAdministerSecurity() throws PentahoAccessControlException { IAuthorizationPolicy policy = mock( IAuthorizationPolicy.class ); when( policy.isAllowed( RepositoryReadAction.NAME ) ).thenReturn( true ); when( policy.isAllowed( RepositoryCreateAction.NAME ) ).thenReturn( true ); when( policy.isAllowed( AdministerSecurityAction.NAME ) ).thenReturn( true ); when( policy.isAllowed( PublishAction.NAME ) ).thenReturn( false ); repositoryPublishService.validateAccess(); } @Test public void permittedForPublisher() throws PentahoAccessControlException { IAuthorizationPolicy policy = mock( IAuthorizationPolicy.class ); when( policy.isAllowed( PublishAction.NAME ) ).thenReturn( true ); doReturn( policy ).when( repositoryPublishService ).getPolicy(); repositoryPublishService.validateAccess(); } }