/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2002-2016 Pentaho Corporation.. All rights reserved. */ package org.pentaho.platform.plugin.services.importer; import static org.mockito.Mockito.*; import static org.junit.Assert.*; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.List; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.pentaho.metadata.repository.DomainAlreadyExistsException; import org.pentaho.metadata.repository.DomainIdNullException; import org.pentaho.metadata.repository.DomainStorageException; import org.pentaho.platform.api.engine.IPentahoSession; import org.pentaho.platform.api.mimetype.IMimeType; import org.pentaho.platform.api.repository2.unified.IPlatformImportBundle; import org.pentaho.platform.api.repository2.unified.RepositoryFileAcl; import org.pentaho.platform.plugin.action.mondrian.catalog.IAclAwareMondrianCatalogService; import org.pentaho.platform.plugin.action.mondrian.catalog.IMondrianCatalogService; import org.pentaho.platform.plugin.action.mondrian.catalog.MondrianCatalog; import org.pentaho.platform.plugin.action.mondrian.catalog.MondrianCatalogServiceException; import org.pentaho.platform.plugin.action.mondrian.catalog.MondrianCatalogServiceException.Reason; public class MondrianImportHandlerTest { private static final String OTHER_PARAMETR = "parametr=\"value\""; private String parameters; private IPlatformImportBundle bundle; private IMondrianCatalogService mondrianImporter; private List<IMimeType> mimeTypes; @Before public void setUp() { mondrianImporter = mock( IMondrianCatalogService.class ); bundle = mock( IPlatformImportBundle.class ); parameters = MondrianImportHandler.PROVIDER + "=provider;" + MondrianImportHandler.DATA_SOURCE + "=dataSource;" + OTHER_PARAMETR; mimeTypes = Arrays.asList( mock( IMimeType.class ) ); when( bundle.getProperty( eq( MondrianImportHandler.ENABLE_XMLA ) ) ).thenReturn( "true" ); when( bundle.getProperty( eq( MondrianImportHandler.PARAMETERS ) ) ).thenReturn( parameters ); } @Test( expected = IllegalArgumentException.class ) public void testConstructor_fail() { List<IMimeType> mimeTypes = Arrays.asList( mock( IMimeType.class ) ); new MondrianImportHandler( mimeTypes, null ); } @Test public void testGetMymeTypes() { List<IMimeType> mimeTypes = Arrays.asList( mock( IMimeType.class ) ); MondrianImportHandler handler = new MondrianImportHandler( mimeTypes, mondrianImporter ); assertEquals( mimeTypes, handler.getMimeTypes() ); } @Test( expected = PlatformImportException.class ) public void testImportFile_nullDomain() throws Exception { when( bundle.getProperty( eq( MondrianImportHandler.DOMAIN_ID ) ) ).thenReturn( null ); testImportFileBase(); } @Test public void testImportFile() throws Exception { when( bundle.getProperty( eq( MondrianImportHandler.DOMAIN_ID ) ) ).thenReturn( MondrianImportHandler.DOMAIN_ID ); testImportFileBase(); } @Test public void testImportFile_DoNotApplyAclSettings() throws Exception { when( bundle.getProperty( eq( MondrianImportHandler.DOMAIN_ID ) ) ).thenReturn( MondrianImportHandler.DOMAIN_ID ); when( bundle.isApplyAclSettings() ).thenReturn( false ); IAclAwareMondrianCatalogService aclImporter = mock( IAclAwareMondrianCatalogService.class ); MondrianImportHandler handler = new MondrianImportHandler( mimeTypes, aclImporter ); handler.importFile( bundle ); ArgumentCaptor<RepositoryFileAcl> captor = ArgumentCaptor.forClass( RepositoryFileAcl.class ); verify( aclImporter ).addCatalog( any( InputStream.class ), any( MondrianCatalog.class ), anyBoolean(), captor.capture(), any( IPentahoSession.class ) ); assertNull( captor.getValue() ); } @Test public void testImportFile_applyAclSettings() throws Exception { RepositoryFileAcl acl = mock( RepositoryFileAcl.class ); when( bundle.getProperty( eq( MondrianImportHandler.DOMAIN_ID ) ) ).thenReturn( MondrianImportHandler.DOMAIN_ID ); when( bundle.isApplyAclSettings() ).thenReturn( true ); when( bundle.getAcl() ).thenReturn( acl ); IAclAwareMondrianCatalogService aclImporter = mock( IAclAwareMondrianCatalogService.class ); MondrianImportHandler handler = new MondrianImportHandler( mimeTypes, aclImporter ); handler.importFile( bundle ); ArgumentCaptor<RepositoryFileAcl> captor = ArgumentCaptor.forClass( RepositoryFileAcl.class ); verify( aclImporter ).addCatalog( any( InputStream.class ), any( MondrianCatalog.class ), anyBoolean(), captor.capture(), any( IPentahoSession.class ) ); assertEquals( acl, captor.getValue() ); } @Test public void testConvertExceptionToStatus_ACCESS_DENIED() { testConvertExceptionToStatus( PlatformImportException.PUBLISH_TO_SERVER_FAILED, Reason.ACCESS_DENIED ); } @Test public void testConvertExceptionToStatus_GENERAL() { testConvertExceptionToStatus( PlatformImportException.PUBLISH_GENERAL_ERROR, Reason.GENERAL ); } @Test public void testConvertExceptionToStatus_ALREADY_EXISTS() { testConvertExceptionToStatus( PlatformImportException.PUBLISH_SCHEMA_EXISTS_ERROR, Reason.ALREADY_EXISTS ); } @Test public void testConvertExceptionToStatus_XMLA_SCHEMA_NAME_EXISTS() { testConvertExceptionToStatus( PlatformImportException.PUBLISH_XMLA_CATALOG_EXISTS, Reason.XMLA_SCHEMA_NAME_EXISTS ); } @Test public void testImportFileNonMondrianException() throws IOException { IOException exception = new IOException(); when( bundle.getProperty( eq( MondrianImportHandler.DOMAIN_ID ) ) ).thenReturn( MondrianImportHandler.DOMAIN_ID ); doThrow( exception ).when( bundle ).getInputStream(); try { testImportFileBase(); } catch ( PlatformImportException e ) { assertEquals( PlatformImportException.PUBLISH_GENERAL_ERROR, e.getErrorStatus() ); } catch ( Exception e ) { fail( "According current implementation, should not happen." ); } } public void testConvertExceptionToStatus( int importStatus, Reason reason ) { MondrianCatalogServiceException exception = new MondrianCatalogServiceException( "msg", reason ); when( bundle.getProperty( eq( MondrianImportHandler.DOMAIN_ID ) ) ).thenReturn( MondrianImportHandler.DOMAIN_ID ); doThrow( exception ).when( mondrianImporter ).addCatalog( any( InputStream.class ), any( MondrianCatalog.class ), anyBoolean(), any( IPentahoSession.class ) ); try { testImportFileBase(); } catch ( PlatformImportException e ) { assertEquals( importStatus, e.getErrorStatus() ); } catch ( Exception e ) { fail( "According current implementation, should not happen." ); } } public void testImportFileBase() throws PlatformImportException, DomainIdNullException, DomainAlreadyExistsException, DomainStorageException, IOException { MondrianImportHandler handler = new MondrianImportHandler( mimeTypes, mondrianImporter ); handler.importFile( bundle ); ArgumentCaptor<MondrianCatalog> mondrianCatalog = ArgumentCaptor.forClass( MondrianCatalog.class ); verify( mondrianImporter ).addCatalog( any( InputStream.class ), mondrianCatalog.capture(), anyBoolean(), any( IPentahoSession.class ) ); assertTrue( mondrianCatalog.getValue().getDataSourceInfo().contains( OTHER_PARAMETR ) ); } @Test public void testCreateCatalogObject_SpecificSymbolsInBundle() throws Exception { //createCatalogObject method has input parameters with custom-escaped only quotes //should unescape it and escape all symbols by standard escapeXml IPlatformImportBundle customBundle = mock( IPlatformImportBundle.class ); parameters = MondrianImportHandler.PROVIDER + "=provider;" + MondrianImportHandler.DATA_SOURCE + "=\"DS "Test's" & <Fun>\";" + "DynamicSchemaProcessor=\"DSP's & "Other" <stuff>\""; String expectedValue = new StringBuilder() .append( "DataSource=\"DS "Test's" & <Fun>\";" ) .append( "EnableXmla=true;" ) .append( "Provider=\"provider\";" ) .append( "DynamicSchemaProcessor=\"DSP's & "Other" <stuff>\"" ) .toString(); when( customBundle.getProperty( eq( MondrianImportHandler.ENABLE_XMLA ) ) ).thenReturn( "true" ); when( customBundle.getProperty( eq( MondrianImportHandler.DATA_SOURCE ) ) ).thenReturn( "DS "Test's" & <Fun>" ); when( customBundle.getProperty( eq( MondrianImportHandler.PARAMETERS ) ) ).thenReturn( parameters ); MondrianImportHandler mondrianImportHandler = new MondrianImportHandler( mimeTypes, mondrianImporter ); MondrianCatalog catalog = mondrianImportHandler.createCatalogObject( "catalog", true, customBundle ); assertEquals( catalog.getDataSourceInfo(), expectedValue ); } }