/*!
* Copyright 2010 - 2015 Pentaho Corporation. All rights reserved.
*
* 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 com.pentaho.repository.importexport;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.pentaho.di.base.AbstractMeta;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.xml.XMLHandler;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.repository.StringObjectId;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.platform.api.repository2.unified.Converter;
import org.pentaho.platform.api.repository2.unified.IUnifiedRepository;
import org.pentaho.platform.api.repository2.unified.RepositoryFile;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.*;
/**
* @author Andrey Khayrutdinov
*/
@RunWith( Parameterized.class )
public class StreamToNodeConvertersPrivateDatabasesTest {
private static final String FILE_ID = "fileId";
@Parameterized.Parameters
public static List<Object[]> getData() throws Exception {
RepositoryFile repositoryFile = new RepositoryFile.Builder( "test file" ).build();
IUnifiedRepository pur = mock( IUnifiedRepository.class );
when( pur.getFileById( FILE_ID ) ).thenReturn( repositoryFile );
TransMeta transMeta = new TransMeta();
JobMeta jobMeta = new JobMeta();
Repository repository = mock( Repository.class );
when( repository.loadTransformation( any( StringObjectId.class ), anyString() ) ).thenReturn( transMeta );
when( repository.loadJob( any( StringObjectId.class ), anyString() ) ).thenReturn( jobMeta );
StreamToTransNodeConverter transNodeConverter = new StreamToTransNodeConverter( pur );
transNodeConverter = spy( transNodeConverter );
doReturn( repository ).when( transNodeConverter ).connectToRepository();
StreamToJobNodeConverter jobNodeConverter = new StreamToJobNodeConverter( pur );
jobNodeConverter = spy( jobNodeConverter );
doReturn( repository ).when( jobNodeConverter ).connectToRepository();
Object[] trans = { transNodeConverter, TransMeta.XML_TAG, transMeta };
Object[] job = { jobNodeConverter, JobMeta.XML_TAG, jobMeta };
return asList( trans, job );
}
@BeforeClass
public static void initKettle() throws Exception {
KettleEnvironment.init();
}
private final Converter converter;
private final String metaTag;
private final AbstractMeta meta;
public StreamToNodeConvertersPrivateDatabasesTest( Converter converter, String metaTag, AbstractMeta meta ) {
this.converter = converter;
this.metaTag = metaTag;
this.meta = meta;
}
@Test
public void removesSharedDatabases() throws Exception {
List<DatabaseMeta> dbs =
new ArrayList<DatabaseMeta>( asList( createDb( "meta1" ), createDb( "private" ), createDb( "meta2" ) ) );
meta.setDatabases( dbs );
meta.setPrivateDatabases( Collections.singleton( "private" ) );
InputStream stream = converter.convert( FILE_ID );
assertDatabaseNodes( stream, "private" );
}
@Test
public void removesAll_IfPrivateSetIsEmpty() throws Exception {
List<DatabaseMeta> dbs = new ArrayList<DatabaseMeta>( asList( createDb( "meta1" ), createDb( "meta2" ) ) );
meta.setDatabases( dbs );
meta.setPrivateDatabases( Collections.<String> emptySet() );
InputStream stream = converter.convert( FILE_ID );
assertDatabaseNodes( stream );
}
@Test
public void keepsAll_IfPrivateSetIsNull() throws Exception {
List<DatabaseMeta> dbs = new ArrayList<DatabaseMeta>( asList( createDb( "meta1" ), createDb( "meta2" ) ) );
meta.setDatabases( dbs );
meta.setPrivateDatabases( null );
InputStream stream = converter.convert( FILE_ID );
assertDatabaseNodes( stream, "meta1", "meta2" );
}
private void assertDatabaseNodes( InputStream stream, String... names ) throws Exception {
if ( names == null ) {
names = new String[0];
}
Document document = XMLHandler.loadXMLFile( stream, null, false, false );
Node metaNode = XMLHandler.getSubNode( document, metaTag );
List<Node> nodes = XMLHandler.getNodes( metaNode, DatabaseMeta.XML_TAG );
assertNodes( nodes, names );
}
private void assertNodes( List<Node> nodes, String... names ) {
assertEquals( names.length, nodes.size() );
Set<String> expectedNames = new HashSet<String>( asList( names ) );
for ( Node node : nodes ) {
String name = XMLHandler.getTagValue( node, "name" );
assertNotNull( name );
assertTrue( name, expectedNames.remove( name ) );
}
}
private DatabaseMeta createDb( String name ) {
DatabaseMeta meta = new DatabaseMeta();
meta.setName( name );
meta.getDatabaseInterface().setDatabaseName( name );
return meta;
}
}