/*!
* 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-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.test.platform.plugin;
import com.mockrunner.mock.jdbc.MockConnection;
import com.mockrunner.mock.jdbc.MockPreparedStatement;
import com.mockrunner.mock.jdbc.MockResultSet;
import com.mockrunner.mock.jdbc.MockStatement;
import org.apache.commons.logging.Log;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.pentaho.actionsequence.dom.actions.SqlQueryAction;
import org.pentaho.platform.plugin.action.sql.SQLBaseComponent;
import org.pentaho.platform.plugin.services.connections.sql.SQLConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
@SuppressWarnings( "nls" )
public class SQLBaseComponentTest {
public static final MockResultSet set = new MockResultSet( "id" );
@BeforeClass
public static void createMockResultSet() {
set.addColumn( new String[] { "column1", "column2", "column3" } );
set.addRow( new String[] { "row1", "row12", "row13" } );
set.addRow( new String[] { "row2", "row22", "row23" } );
}
// IMPORTANT!!! This test is solely to exercise the SQLConnection's
// "fallBackToNonscrollableOnError" flag. We have set up a mock connection that
// does not support scrollable cursors. The connection should throw a SQLException, then
// we set the cursor to forward-only and attempt the query again.
@Test
public void testRunQuery() {
java.sql.Connection connection = new MockNativeConnection();
SQLConnection sqlConnection = new MockSQLConnection( connection );
MockSQLBaseComponent component = new MockSQLBaseComponent( sqlConnection );
Assert.assertTrue( component.runQuery() );
}
class MockNativeConnection extends MockConnection {
@Override
public Statement createStatement( int scrollType, int concur ) throws SQLException {
if ( scrollType == ResultSet.TYPE_SCROLL_INSENSITIVE ) {
throw new SQLException();
}
return new MockSQLBaseStatement( this, scrollType, concur );
}
@Override
public PreparedStatement prepareStatement( String query, int scrollType, int concur ) throws SQLException {
if ( scrollType == ResultSet.TYPE_SCROLL_INSENSITIVE ) {
throw new SQLException();
}
return new MockSQLBasePreparedStatement( this, query, scrollType, concur );
}
}
class MockSQLConnection extends SQLConnection {
public MockSQLConnection( Connection connection ) {
this.nativeConnection = connection;
}
}
class MockSQLBasePreparedStatement extends MockPreparedStatement {
public MockSQLBasePreparedStatement( Connection conn, String query, int scrollType, int concur ) {
super( conn, query, scrollType, concur );
}
@Override
public ResultSet executeQuery() throws SQLException {
return set;
}
}
class MockSQLBaseStatement extends MockStatement {
public MockSQLBaseStatement( Connection conn, int scrollType, int concur ) {
super( conn, scrollType, concur );
}
@Override
public ResultSet executeQuery( String query ) throws SQLException {
return set;
}
}
class MockSQLBaseComponent extends SQLBaseComponent {
private static final long serialVersionUID = 1L;
public MockSQLBaseComponent( SQLConnection conn ) {
connection = conn;
preparedQuery = "Select *";
SqlQueryAction action = new SqlQueryAction();
setActionDefinition( action );
}
public boolean runQuery() {
return this.runQuery( "select *", true );
}
@Override
public Log getLogger() {
return null;
}
@Override
public String getResultOutputName() {
return null;
}
@Override
public boolean validateSystemSettings() {
return true;
}
@Override
protected String applyInputsToFormat( String format ) {
return format;
}
}
}