package org.pentaho.platform.engine.services.connection.datasource.dbcp;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.mockito.Mockito;
import org.pentaho.database.model.DatabaseAccessType;
import org.pentaho.database.model.IDatabaseConnection;
import org.pentaho.platform.api.data.DBDatasourceServiceException;
import org.pentaho.platform.api.repository.datasource.DatasourceMgmtServiceException;
import org.pentaho.platform.api.repository.datasource.IDatasourceMgmtService;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.Collection;
import static org.mockito.Mockito.*;
/**
* Created by gmoran on 5/2/14.
*/
@RunWith(Parameterized.class)
public class PentahoConnectionDatasourceServiceTest {
private BaseDatasourceService service;
private BaseDatasourceService spyService;
private IDatabaseConnection mockConnection;
private String dsName;
@Parameterized.Parameters
public static Collection services() {
return Arrays.asList( new Object[][] {
{ new NonPooledDatasourceService(), "test1" },
{ new PooledDatasourceService(), "test2" },
{ new PooledOrJndiDatasourceService(), "test3" },
{ new NonPooledOrJndiDatasourceService(), "test4" }
} );
}
@Before
public void setUp(){
mockConnection = mock(IDatabaseConnection.class);
// Set it up - this is a NATIVE connection
when( mockConnection.getAccessType()).thenReturn( DatabaseAccessType.NATIVE );
when( mockConnection.getDatabaseName()).thenReturn( dsName );
DataSource mockDs = mock(DataSource.class);
IDatasourceMgmtService mockMgmtService = mock(IDatasourceMgmtService.class);
spyService = spy(service );
try {
when( mockMgmtService.getDatasourceByName( dsName ) ).thenReturn( mockConnection );
} catch ( DatasourceMgmtServiceException e ) {
e.printStackTrace();
}
try {
doReturn(mockDs).when( spyService ).resolveDatabaseConnection( mockConnection );
} catch ( DBDatasourceServiceException e ) {
e.printStackTrace();
}
doReturn( mockMgmtService ).when( spyService ).getDatasourceMgmtService();
service.clearCache();
}
public PentahoConnectionDatasourceServiceTest( BaseDatasourceService service, String name ){
this.service = service;
this.dsName = name;
}
@Test
public void testPentahoConnectionServices( ){
try {
// Now make sure that the resolve.. service method gets called; if not,
// fail the test
spyService.getDataSource( dsName );
verify(spyService).resolveDatabaseConnection( mockConnection );
verify(spyService, Mockito.never()).getJndiDataSource( dsName );
} catch ( DBDatasourceServiceException e ) {
e.printStackTrace();
}
}
@Test
public void testCachedPentahoConnectionServices( ){
try {
// Now make sure that the JNDI service method gets called the first time,
// but the second time it should retrieve from cache.
spyService.getDataSource( dsName );
spyService.getDataSource( dsName );
verify(spyService, Mockito.times( 1 )).resolveDatabaseConnection( mockConnection );
} catch ( DBDatasourceServiceException e ) {
e.printStackTrace();
}
}
}