/*!
* 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-2015 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.platform.dataaccess.datasource.api.resources;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.database.model.DatabaseConnection;
import org.pentaho.database.model.IDatabaseConnection;
import org.pentaho.platform.dataaccess.datasource.wizard.service.ConnectionServiceException;
import org.pentaho.platform.dataaccess.datasource.wizard.service.impl.ConnectionServiceImpl;
import org.pentaho.platform.web.http.api.resources.JaxbList;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;
import static junit.framework.Assert.fail;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.times;
public class JdbcDatasourceResourceTest {
private static JDBCDatasourceResource jdbcDatasourceResource;
@Before
public void setUp() {
jdbcDatasourceResource = spy( new JDBCDatasourceResource() );
jdbcDatasourceResource.service = mock( ConnectionServiceImpl.class );
}
@After
public void cleanup() {
jdbcDatasourceResource = null;
}
@Test
public void testDeleteConnection() throws Exception {
Response mockResponse = mock( Response.class );
doReturn( true ).when( jdbcDatasourceResource.service ).deleteConnection( "Name" );
doReturn( mockResponse ).when( jdbcDatasourceResource ).buildOkResponse();
Response response = jdbcDatasourceResource.deleteConnection( "Name" );
verify( jdbcDatasourceResource, times( 1 ) ).deleteConnection( "Name" );
assertEquals( mockResponse, response );
}
@Test
public void testDeleteConnectionError() throws Exception {
Response mockResponse = mock( Response.class );
//Test 1
doReturn( false ).when( jdbcDatasourceResource.service ).deleteConnection( "Name" );
doReturn( mockResponse ).when( jdbcDatasourceResource ).buildNotModifiedResponse();
Response response = jdbcDatasourceResource.deleteConnection( "Name" );
assertEquals( mockResponse, response );
//Test 2
RuntimeException mockException = mock( RuntimeException.class );
doThrow( mockException ).when( jdbcDatasourceResource.service ).deleteConnection( "Name" );
doReturn( mockResponse ).when( jdbcDatasourceResource ).buildServerErrorResponse();
response = jdbcDatasourceResource.deleteConnection( "Name" );
assertEquals( mockResponse, response );
verify( jdbcDatasourceResource, times( 2 ) ).deleteConnection( "Name" );
}
@Test
public void testGetConnectionIDs() throws Exception {
IDatabaseConnection mockIDatabaseConnection = mock( IDatabaseConnection.class );
List<IDatabaseConnection> conns = new ArrayList<IDatabaseConnection>();
conns.add( mockIDatabaseConnection );
List<String> connStrList = new ArrayList<String>();
connStrList.add( conns.get( 0 ).getName() );
doReturn( conns ).when( jdbcDatasourceResource.service ).getConnections();
JaxbList<String> connections = jdbcDatasourceResource.getConnectionIDs();
verify( jdbcDatasourceResource, times( 1 ) ).getConnectionIDs();
assertEquals( connections.getList().get( 0 ), connStrList.get( 0 ) );
}
@Test
public void testGetConnectionIDsError() throws Exception {
ConnectionServiceException mockConnectionServiceException = mock( ConnectionServiceException.class );
doThrow( mockConnectionServiceException ).when( jdbcDatasourceResource.service ).getConnections();
try {
JaxbList<String> connections = jdbcDatasourceResource.getConnectionIDs();
fail( "Should get WebApplicationException" );
} catch ( WebApplicationException e ) {
// good
}
}
@Test
public void testGetConnection() throws Exception {
IDatabaseConnection mockIDatabaseConnection = mock( IDatabaseConnection.class );
doReturn( mockIDatabaseConnection ).when( jdbcDatasourceResource.service ).getConnectionByName( "Name" );
Response mockResponse = mock( Response.class );
doReturn( mockResponse ).when( jdbcDatasourceResource ).buildOkResponse( mockIDatabaseConnection );
Response response = jdbcDatasourceResource.getConnection( "Name" );
verify( jdbcDatasourceResource, times( 1 ) ).getConnection( "Name" );
assertEquals( response, mockResponse );
}
@Test
public void testGetConnectionError() throws Exception {
ConnectionServiceException mockConnectionServiceException = mock( ConnectionServiceException.class );
doThrow( mockConnectionServiceException ).when( jdbcDatasourceResource.service ).getConnectionByName( "Name" );
Response mockResponse = mock( Response.class );
doReturn( mockResponse ).when( jdbcDatasourceResource ).buildServerErrorResponse();
Response response = jdbcDatasourceResource.getConnection( "Name" );
verify( jdbcDatasourceResource, times( 1 ) ).getConnection( "Name" );
assertEquals( response, mockResponse );
}
@Test
public void testAdd() throws Exception {
doNothing().when( jdbcDatasourceResource ).validateAccess();
DatabaseConnection mockDatabaseConnection = mock( DatabaseConnection.class );
doReturn( true ).when( jdbcDatasourceResource.service ).addConnection( mockDatabaseConnection );
Response mockResponse = mock( Response.class );
doReturn( mockResponse ).when( jdbcDatasourceResource ).buildOkResponse();
Response response = jdbcDatasourceResource.addOrUpdate( mockDatabaseConnection.getName(), mockDatabaseConnection );
verify( jdbcDatasourceResource, times( 1 ) ).addOrUpdate( mockDatabaseConnection.getName(), mockDatabaseConnection );
assertEquals( response, mockResponse );
}
@Test
public void testAddError() throws Exception {
doNothing().when( jdbcDatasourceResource ).validateAccess();
DatabaseConnection mockDatabaseConnection = mock( DatabaseConnection.class );
//Test 1
doReturn( false ).when( jdbcDatasourceResource.service ).addConnection( mockDatabaseConnection );
Response mockResponse = mock( Response.class );
doReturn( mockResponse ).when( jdbcDatasourceResource ).buildNotModifiedResponse();
Response response = jdbcDatasourceResource.addOrUpdate( mockDatabaseConnection.getName(), mockDatabaseConnection );
assertEquals( response, mockResponse );
//Test 2
RuntimeException mockException = mock( RuntimeException.class );
doThrow( mockException ).when( jdbcDatasourceResource.service ).addConnection( mockDatabaseConnection );
mockResponse = mock( Response.class );
doReturn( mockResponse ).when( jdbcDatasourceResource ).buildServerErrorResponse();
response = jdbcDatasourceResource.addOrUpdate( mockDatabaseConnection.getName(), mockDatabaseConnection );
assertEquals( response, mockResponse );
verify( jdbcDatasourceResource, times( 2 ) ).addOrUpdate( mockDatabaseConnection.getName(), mockDatabaseConnection );
}
@Test
public void testUpdate() throws Exception {
DatabaseConnection mockDatabaseConnection = mock( DatabaseConnection.class );
doReturn( "" ).when( mockDatabaseConnection ).getPassword();
doReturn( "id" ).when( mockDatabaseConnection ).getName();
IDatabaseConnection mockSavedConn = mock( IDatabaseConnection.class );
doReturn( mockSavedConn ).when( jdbcDatasourceResource.service ).getConnectionByName( "id" );
doReturn( "password" ).when( mockSavedConn ).getPassword();
doReturn( true ).when( jdbcDatasourceResource.service ).updateConnection( mockDatabaseConnection );
doNothing().when( jdbcDatasourceResource ).validateAccess();
Response mockResponse = mock( Response.class );
doReturn( mockResponse ).when( jdbcDatasourceResource ).buildOkResponse();
Response response = jdbcDatasourceResource.addOrUpdate( mockDatabaseConnection.getName(), mockDatabaseConnection );
verify( jdbcDatasourceResource, times( 1 ) ).addOrUpdate( mockDatabaseConnection.getName(), mockDatabaseConnection );
assertEquals( response, mockResponse );
}
@Test
public void testUpdateError() throws Exception {
DatabaseConnection mockDatabaseConnection = mock( DatabaseConnection.class );
doReturn( "" ).when( mockDatabaseConnection ).getPassword();
doReturn( "id" ).when( mockDatabaseConnection ).getId();
IDatabaseConnection mockSavedConn = mock( IDatabaseConnection.class );
doReturn( mockSavedConn ).when( jdbcDatasourceResource.service ).getConnectionById( "id" );
doReturn( "password" ).when( mockSavedConn ).getPassword();
//Test 1
doReturn( false ).when( jdbcDatasourceResource.service ).updateConnection( mockDatabaseConnection );
Response mockResponse = mock( Response.class );
doReturn( mockResponse ).when( jdbcDatasourceResource ).buildNotModifiedResponse();
Response response = jdbcDatasourceResource.addOrUpdate( mockDatabaseConnection.getName(), mockDatabaseConnection );
assertEquals( 500, response.getStatus() );
//Test 2
RuntimeException mockException = mock( RuntimeException.class );
doThrow( mockException ).when( jdbcDatasourceResource.service ).updateConnection( mockDatabaseConnection );
doReturn( mockResponse ).when( jdbcDatasourceResource ).buildServerErrorResponse();
response = jdbcDatasourceResource.addOrUpdate( mockDatabaseConnection.getName(), mockDatabaseConnection );
assertEquals( response, mockResponse );
verify( jdbcDatasourceResource, times( 2 ) ).addOrUpdate( mockDatabaseConnection.getName(), mockDatabaseConnection );
}
}