/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2015 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.starmodeler.metastore;
import org.junit.Before;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.pentaho.di.repository.ObjectId;
import org.pentaho.di.starmodeler.StarDomain;
import org.pentaho.metastore.api.IMetaStore;
import org.pentaho.metastore.api.IMetaStoreAttribute;
import org.pentaho.metastore.api.IMetaStoreElement;
import org.pentaho.metastore.api.IMetaStoreElementType;
import org.pentaho.metastore.stores.delegate.DelegatingMetaStore;
import java.util.LinkedList;
import java.util.List;
import static org.junit.Assert.*;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
public class StarDomainMetaStoreUtilTest {
private IMetaStore metaStore;
private IMetaStoreElementType metaStoreElementType;
@Before
public void setUp() throws Exception {
metaStore = mock( IMetaStore.class );
metaStoreElementType = mock( IMetaStoreElementType.class );
when( metaStore.getElementTypeByName( anyString(), eq( StarDomainMetaStoreUtil.METASTORE_STAR_DOMAIN_TYPE_NAME ) ) )
.thenReturn( metaStoreElementType );
}
@Test
public void testGetStarDomainElementType() throws Exception {
final IMetaStoreElementType starDomainElementType = StarDomainMetaStoreUtil.getStarDomainElementType( metaStore );
assertEquals( starDomainElementType, metaStoreElementType );
verify( metaStore, times( 1 ) ).createNamespace( anyString() );
}
@Test
public void testCreateStarDomainElementType() throws Exception {
final IMetaStoreElementType metaStoreElementType = mock( IMetaStoreElementType.class );
when( metaStore.newElementType( anyString() ) ).thenReturn( metaStoreElementType );
final IMetaStoreElementType starDomainElementType = StarDomainMetaStoreUtil
.createStarDomainElementType( metaStore );
assertEquals( starDomainElementType, metaStoreElementType );
verify( starDomainElementType, times( 1 ) ).setName( StarDomainMetaStoreUtil.METASTORE_STAR_DOMAIN_TYPE_NAME );
verify( starDomainElementType, times( 1 ) )
.setDescription( StarDomainMetaStoreUtil.METASTORE_STAR_DOMAIN_TYPE_DESCRIPTION );
verify( metaStore, times( 1 ) ).createElementType( anyString(), eq( metaStoreElementType ) );
}
@Test
public void testSaveStarDomain() throws Exception {
final StarDomain starDomain = mock( StarDomain.class );
final ObjectId objectId = mock( ObjectId.class );
final String objectIdStr = "objectIdStr";
when( objectId.toString() ).thenReturn( objectIdStr );
when( starDomain.getObjectId() ).thenReturn( objectId );
final String starDomainName = "starDomainName";
when( starDomain.getName() ).thenReturn( starDomainName );
final IMetaStoreElement metaStoreElement = mock( IMetaStoreElement.class );
when( metaStoreElement.getId() ).thenReturn( "id" );
when( metaStore.getElement( anyString(), eq( metaStoreElementType ), eq( objectIdStr ) ) )
.thenReturn( metaStoreElement );
StarDomainMetaStoreUtil.saveStarDomain( metaStore, starDomain );
verify( metaStoreElement, times( 1 ) ).setElementType( eq( metaStoreElementType ) );
verify( metaStoreElement, times( 1 ) ).setName( eq( starDomainName ) );
verify( metaStoreElement, times( 1 ) ).addChild( any( IMetaStoreAttribute.class ) );
verify( metaStore, times( 1 ) )
.updateElement( anyString(), eq( metaStoreElementType ), eq( objectIdStr ), eq( metaStoreElement ) );
verify( starDomain, times( 1 ) ).setObjectId( any( ObjectId.class ) );
}
@Test
public void testGetStarDomainList() throws Exception {
final IMetaStoreElement metaStoreElement = mock( IMetaStoreElement.class );
final String id = "id";
when( metaStoreElement.getId() ).thenReturn( id );
final String name = "name";
when( metaStoreElement.getName() ).thenReturn( name );
final IMetaStoreAttribute metaStoreAttribute = mock( IMetaStoreAttribute.class );
when( metaStoreElement.getChild( eq( StarDomainMetaStoreUtil.Attribute.ID_STAR_DOMAIN_DESCRIPTION.id ) ) )
.thenReturn( metaStoreAttribute );
when( metaStore.getElements( anyString(), eq( metaStoreElementType ) ) )
.thenReturn( new LinkedList<IMetaStoreElement>() {
{
add( metaStoreElement );
}
} );
final List<IdNameDescription> starDomainList = StarDomainMetaStoreUtil.getStarDomainList( metaStore );
assertNotNull( starDomainList );
assertEquals( 1, starDomainList.size() );
final IdNameDescription result = starDomainList.get( 0 );
assertEquals( id, result.getId() );
assertEquals( name, result.getName() );
}
@Test
public void testLoadStarDomain() throws Exception {
final String id = "id";
final String msName = "MSName";
when( metaStore.getName() ).thenReturn( msName );
final DelegatingMetaStore delegatingMetaStore = spy( new DelegatingMetaStore( metaStore ) );
delegatingMetaStore.setActiveMetaStoreName( msName );
doAnswer( new Answer<IMetaStoreElementType>() {
@Override
public IMetaStoreElementType answer( InvocationOnMock invocationOnMock ) throws Throwable {
return metaStore.getElementTypeByName( (String) invocationOnMock.getArguments()[0],
(String) invocationOnMock.getArguments()[1] );
}
} ).when( delegatingMetaStore ).getElementTypeByName( anyString(), anyString() );
assertNull( StarDomainMetaStoreUtil.loadStarDomain( delegatingMetaStore, id ) );
final IMetaStoreElement metaStoreElement = mock( IMetaStoreElement.class );
final String name = "name";
when( metaStoreElement.getName() ).thenReturn( name );
doReturn( metaStoreElement ).when( delegatingMetaStore )
.getElement( anyString(), eq( metaStoreElementType ), eq( id ) );
final StarDomain starDomain = StarDomainMetaStoreUtil.loadStarDomain( delegatingMetaStore, id );
assertEquals( id, starDomain.getObjectId().getId() );
assertEquals( name, starDomain.getName() );
}
}