/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2017 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* 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.pentaho.di.ui.repo;
import org.json.simple.JSONObject;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.plugins.PluginInterface;
import org.pentaho.di.core.plugins.PluginRegistry;
import org.pentaho.di.core.plugins.RepositoryPluginType;
import org.pentaho.di.repository.AbstractRepository;
import org.pentaho.di.repository.BaseRepositoryMeta;
import org.pentaho.di.repository.RepositoriesMeta;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.repository.RepositoryCapabilities;
import org.pentaho.di.repository.RepositoryMeta;
import org.pentaho.di.repository.filerep.KettleFileRepositoryMeta;
import org.pentaho.di.ui.core.PropsUI;
import org.pentaho.di.ui.spoon.Spoon;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Created by bmorrise on 5/3/16.
*/
@RunWith( MockitoJUnitRunner.class )
public class RepositoryConnectControllerTest {
public static final String PLUGIN_NAME = "PLUGIN NAME";
public static final String ID = "ID";
public static final String PLUGIN_DESCRIPTION = "PLUGIN DESCRIPTION";
public static final String DATABASE_NAME = "DATABASE NAME";
public static final String REPOSITORY_NAME = "Repository Name";
public static final String REPOSITORY_ID = "Repository ID";
public static final String REPOSITORY_DESCRIPTION = "Repository Description";
@Mock
RepositoriesMeta repositoriesMeta;
@Mock
PluginRegistry pluginRegistry;
@Mock
RepositoryMeta repositoryMeta;
@Mock
PluginInterface pluginInterface;
@Mock
AbstractRepository repository;
@Mock
DatabaseMeta databaseMeta;
@Mock
PropsUI propsUI;
@Mock
Spoon spoon;
private RepositoryConnectController controller;
@BeforeClass
public static void setUpClass() throws Exception {
if ( !KettleEnvironment.isInitialized() ) {
KettleEnvironment.init();
}
}
@Before
public void setUp() {
controller = new RepositoryConnectController( pluginRegistry, () -> spoon, repositoriesMeta );
when( pluginInterface.getName() ).thenReturn( PLUGIN_NAME );
when( pluginInterface.getIds() ).thenReturn( new String[] { ID } );
when( pluginInterface.getDescription() ).thenReturn( PLUGIN_DESCRIPTION );
List<PluginInterface> plugins = new ArrayList<>();
plugins.add( pluginInterface );
when( pluginRegistry.getPlugins( RepositoryPluginType.class ) ).thenReturn( plugins );
when( repositoryMeta.getId() ).thenReturn( ID );
when( repositoryMeta.getName() ).thenReturn( PLUGIN_NAME );
when( repositoryMeta.getDescription() ).thenReturn( PLUGIN_DESCRIPTION );
}
@Test
public void testGetPlugins() throws Exception {
String plugins = controller.getPlugins();
assertEquals( "[{\"name\":\"PLUGIN NAME\",\"description\":\"PLUGIN DESCRIPTION\",\"id\":\"ID\"}]", plugins );
}
@Test
public void testCreateRepository() throws Exception {
String id = ID;
Map<String, Object> items = new HashMap<>();
when( pluginRegistry.loadClass( RepositoryPluginType.class, id, RepositoryMeta.class ) )
.thenReturn( repositoryMeta );
when( pluginRegistry.loadClass( RepositoryPluginType.class, repositoryMeta.getId(), Repository.class ) )
.thenReturn( repository );
when( repository.test() ).thenReturn( true );
boolean result = controller.createRepository( id, items );
assertEquals( true, result );
when( repository.test() ).thenReturn( false );
result = controller.createRepository( id, items );
assertEquals( false, result );
when( repository.test() ).thenReturn( true );
doThrow( new KettleException() ).when( repositoriesMeta ).writeData();
result = controller.createRepository( id, items );
assertEquals( false, result );
}
@Test
public void testGetRepositories() {
when( repositoriesMeta.nrRepositories() ).thenReturn( 1 );
when( repositoriesMeta.getRepository( 0 ) ).thenReturn( repositoryMeta );
JSONObject json = new JSONObject();
json.put( "displayName", REPOSITORY_NAME );
json.put( "isDefault", false );
json.put( "description", REPOSITORY_DESCRIPTION );
json.put( "id", REPOSITORY_ID );
when( repositoryMeta.toJSONObject() ).thenReturn( json );
String repositories = controller.getRepositories();
assertEquals(
"[{\"isDefault\":false,\"displayName\":\"Repository Name\",\"description\":\"Repository Description\","
+ "\"id\":\"Repository ID\"}]",
repositories );
}
@Test
public void testConnectToRepository() throws Exception {
when( pluginRegistry.loadClass( RepositoryPluginType.class, repositoryMeta.getId(), Repository.class ) )
.thenReturn( repository );
controller.setCurrentRepository( repositoryMeta );
controller.connectToRepository();
verify( repository ).init( repositoryMeta );
verify( repository ).connect( null, null );
}
@Test
public void testGetDatabases() throws Exception {
when( repositoriesMeta.nrDatabases() ).thenReturn( 1 );
when( repositoriesMeta.getDatabase( 0 ) ).thenReturn( databaseMeta );
when( databaseMeta.getName() ).thenReturn( DATABASE_NAME );
String databases = controller.getDatabases();
assertEquals( "[{\"name\":\"DATABASE NAME\"}]", databases );
}
@Test
public void testDeleteRepository() throws Exception {
int index = 1;
when( repositoriesMeta.findRepository( REPOSITORY_NAME ) ).thenReturn( repositoryMeta );
when( repositoriesMeta.indexOfRepository( repositoryMeta ) ).thenReturn( index );
when( repositoriesMeta.getRepository( index ) ).thenReturn( repositoryMeta );
boolean result = controller.deleteRepository( REPOSITORY_NAME );
assertEquals( true, result );
verify( repositoriesMeta ).removeRepository( index );
verify( repositoriesMeta ).writeData();
}
@Test
public void testSetDefaultRepository() {
int index = 1;
when( repositoriesMeta.findRepository( REPOSITORY_NAME ) ).thenReturn( repositoryMeta );
when( repositoriesMeta.indexOfRepository( repositoryMeta ) ).thenReturn( index );
boolean result = controller.setDefaultRepository( REPOSITORY_NAME );
assertEquals( true, result );
}
@Test
public void testAddDatabase() throws Exception {
controller.addDatabase( databaseMeta );
verify( repositoriesMeta ).addDatabase( databaseMeta );
verify( repositoriesMeta ).writeData();
}
@Test
public void testGetDefaultUrl() throws Exception {
String defaultUrl = controller.getDefaultUrl();
assertNotNull( defaultUrl );
}
@Test
public void testGetRepository() throws Exception {
KettleFileRepositoryMeta kettleFileRepositoryMeta = new KettleFileRepositoryMeta();
kettleFileRepositoryMeta.setId( REPOSITORY_ID );
kettleFileRepositoryMeta.setDescription( REPOSITORY_DESCRIPTION );
kettleFileRepositoryMeta.setName( REPOSITORY_NAME );
when( repositoriesMeta.findRepository( REPOSITORY_NAME ) ).thenReturn( kettleFileRepositoryMeta );
String output = controller.getRepository( REPOSITORY_NAME );
assertEquals( true, output.contains( REPOSITORY_ID ) );
assertEquals( true, output.contains( REPOSITORY_DESCRIPTION ) );
assertEquals( true, output.contains( REPOSITORY_NAME ) );
}
@Test
public void testRepoSwitch() throws Exception {
when( pluginRegistry.loadClass( RepositoryPluginType.class, REPOSITORY_ID, Repository.class ) ).thenReturn(
repository );
KettleFileRepositoryMeta kettleFileRepositoryMeta = new KettleFileRepositoryMeta();
kettleFileRepositoryMeta.setId( REPOSITORY_ID );
kettleFileRepositoryMeta.setDescription( REPOSITORY_DESCRIPTION );
kettleFileRepositoryMeta.setName( REPOSITORY_NAME );
controller.connectToRepository( kettleFileRepositoryMeta );
verify( spoon ).closeAllJobsAndTransformations( true );
when( spoon.getRepository() ).thenReturn( repository );
controller.connectToRepository( kettleFileRepositoryMeta );
verify( spoon ).closeRepository();
}
@Test
public void testOnlySetConnectedOnConnect() throws Exception {
when( pluginRegistry.loadClass( RepositoryPluginType.class, ID, Repository.class ) )
.thenReturn( repository );
when( pluginRegistry.loadClass( RepositoryPluginType.class, ID, RepositoryMeta.class ) )
.thenReturn( repositoryMeta );
when( repository.test() ).thenReturn( true );
Map<String, Object> items = new HashMap<>();
boolean result = controller.createRepository( ID, items );
assertEquals( true, result );
assertNull( controller.getConnectedRepository() );
controller.connectToRepository();
assertNotNull( controller.getConnectedRepository() );
}
@Test
public void testEditConnectedRepository() throws Exception {
RepositoryMeta before = new TestRepositoryMeta( ID, "name1", PLUGIN_DESCRIPTION, "same" );
RepositoryMeta edited = new TestRepositoryMeta( ID, "name2", PLUGIN_DESCRIPTION, "same" );
when( pluginRegistry.loadClass( RepositoryPluginType.class, ID, Repository.class ) )
.thenReturn( repository );
when( pluginRegistry.loadClass( RepositoryPluginType.class, ID, RepositoryMeta.class ) )
.thenReturn( edited );
when( repositoriesMeta.nrRepositories() ).thenReturn( 1 );
when( repositoriesMeta.getRepository( 0 ) ).thenReturn( before );
controller.setConnectedRepository( before.clone() );
controller.setCurrentRepository( before );
controller.createRepository( ID, new HashMap<String,Object>() );
assertEquals( edited , controller.getConnectedRepository() );
}
@Test
public void testEditConnectedRepositoryIncomaptible() throws Exception {
RepositoryMeta before = new TestRepositoryMeta( ID, "name1", PLUGIN_DESCRIPTION, "inner1" );
RepositoryMeta edited = new TestRepositoryMeta( ID, "name2", PLUGIN_DESCRIPTION, "something completely different" );
when( pluginRegistry.loadClass( RepositoryPluginType.class, ID, Repository.class ) )
.thenReturn( repository );
when( pluginRegistry.loadClass( RepositoryPluginType.class, ID, RepositoryMeta.class ) )
.thenReturn( edited );
when( repositoriesMeta.nrRepositories() ).thenReturn( 1 );
when( repositoriesMeta.getRepository( 0 ) ).thenReturn( before );
controller.setConnectedRepository( before.clone() );
controller.setCurrentRepository( before );
controller.createRepository( ID, new HashMap<String,Object>() );
assertNotEquals( edited , controller.getConnectedRepository() );
}
@Test
public void testIsDatabaseWithNameExist() throws Exception {
final DatabaseMeta databaseMeta1 = new DatabaseMeta();
databaseMeta1.setName( "TestDB1" );
controller.addDatabase( databaseMeta1 );
final DatabaseMeta databaseMeta2 = new DatabaseMeta();
databaseMeta2.setName( "TestDB2" );
controller.addDatabase( databaseMeta2 );
when( repositoriesMeta.nrDatabases() ).thenReturn( 2 );
when( repositoriesMeta.getDatabase( 0 ) ).thenReturn( databaseMeta1 );
when( repositoriesMeta.getDatabase( 1 ) ).thenReturn( databaseMeta2 );
//existing databases
assertFalse( controller.isDatabaseWithNameExist( databaseMeta1, false ) );
databaseMeta2.setName( "TestDB1" );
assertTrue( controller.isDatabaseWithNameExist( databaseMeta2, false ) );
//new databases
final DatabaseMeta databaseMeta3 = new DatabaseMeta();
databaseMeta3.setName( "TestDB3" );
assertFalse( controller.isDatabaseWithNameExist( databaseMeta3, true ) );
databaseMeta3.setName( "TestDB1" );
assertTrue( controller.isDatabaseWithNameExist( databaseMeta3, true ) );
}
private static class TestRepositoryMeta extends BaseRepositoryMeta implements RepositoryMeta {
private String innerStuff;
public TestRepositoryMeta( String id, String name, String description, String innerStuff ) {
super( id, name, description, false );
this.innerStuff = innerStuff;
}
@Override
public RepositoryCapabilities getRepositoryCapabilities() {
return null;
}
@Override
public RepositoryMeta clone() {
return new TestRepositoryMeta( getId(), getName(), getDescription(), innerStuff );
}
@SuppressWarnings( "unchecked" )
@Override
public JSONObject toJSONObject() {
JSONObject obj = super.toJSONObject();
obj.put( "extra", innerStuff );
return obj;
}
@Override
public void populate( Map<String, Object> properties, RepositoriesMeta repositoriesMeta ) {
}
}
}