package org.pentaho.platform.plugin.action.datatransforms;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.dom4j.Node;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.pentaho.actionsequence.dom.ActionInputConstant;
import org.pentaho.actionsequence.dom.IActionInput;
import org.pentaho.actionsequence.dom.actions.ResultSetCompareAction;
import org.pentaho.commons.connection.IPentahoResultSet;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.api.engine.IRuntimeContext;
public class ResultSetCompareComponentTest {
private static final String RESULT_SET_ELEMENT_VALUE = "TEST_VALUE";
private static final String FIRST_ROW = "FIRST_ROW";
private static final String SECOND_ROW = "SECOND_ROW";
private final Level level = LogManager.getRootLogger().getLevel();
@Before
public void setUp() {
LogManager.getRootLogger().setLevel( Level.OFF );
}
@Test
public void validation_fails_without_both_resultSets() {
int actualValidateResult = callValidationWithResultSets( null, null );
assertEquals( IRuntimeContext.RUNTIME_CONTEXT_VALIDATE_FAIL, actualValidateResult );
}
@Test
public void validation_fails_without_first_resultSets() {
IPentahoResultSet rs = Mockito.mock( IPentahoResultSet.class );
int actualValidateResult = callValidationWithResultSets( null, rs );
assertEquals( IRuntimeContext.RUNTIME_CONTEXT_VALIDATE_FAIL, actualValidateResult );
}
@Test
public void validation_fails_without_second_resultSets() {
IPentahoResultSet rs = Mockito.mock( IPentahoResultSet.class );
int actualValidateResult = callValidationWithResultSets( rs, null );
assertEquals( IRuntimeContext.RUNTIME_CONTEXT_VALIDATE_FAIL, actualValidateResult );
}
@Test
public void validation_fails_without_compareColumnNumber() {
ResultSetCompareComponent rscc = createResultSetCompareComponent();
IPentahoResultSet rs = Mockito.mock( IPentahoResultSet.class );
ResultSetCompareAction resultSetCompareAction = createResultSetCompareAction( rs, rs, null, false, true );
rscc.setActionDefinition( resultSetCompareAction );
int actualValidateResult = rscc.validate();
assertEquals( IRuntimeContext.RUNTIME_CONTEXT_VALIDATE_FAIL, actualValidateResult );
}
@Test
public void validationSuccessful() {
ResultSetCompareComponent rscc = createResultSetCompareComponent();
IPentahoResultSet rs = Mockito.mock( IPentahoResultSet.class );
ResultSetCompareAction resultSetCompareAction = createResultSetCompareAction( rs, rs, 0, false, true );
rscc.setActionDefinition( resultSetCompareAction );
int actualValidateResult = rscc.validate();
assertEquals( IRuntimeContext.RUNTIME_CONTEXT_VALIDATE_OK, actualValidateResult );
}
@Test
public void execute_fails_without_validation() {
ResultSetCompareComponent rscc = createResultSetCompareComponent();
IPentahoResultSet rs = Mockito.mock( IPentahoResultSet.class );
ResultSetCompareAction resultSetCompareAction = createResultSetCompareAction( rs, rs, 0, false, true );
rscc.setActionDefinition( resultSetCompareAction );
int actualExecuteResult = rscc.execute();
assertNotEquals( IRuntimeContext.RUNTIME_STATUS_SUCCESS, actualExecuteResult );
}
@Test
public void execute_fails_when_resultSets_have_different_number_of_rows() {
ResultSetCompareComponent rscc = createResultSetCompareComponent();
IPentahoResultSet rs1 = createResultSet( 1, 1, RESULT_SET_ELEMENT_VALUE );
IPentahoResultSet rs2 = createResultSet( 1, 2, RESULT_SET_ELEMENT_VALUE );
ResultSetCompareAction resultSetCompareAction = createResultSetCompareAction( rs1, rs2, 0, false, true );
rscc.setActionDefinition( resultSetCompareAction );
rscc.validate();
int actualExecuteResult = rscc.execute();
assertEquals( IRuntimeContext.RUNTIME_STATUS_FAILURE, actualExecuteResult );
}
@Test
public void execute_fails_when_resultSets_have_different_number_of_columns() {
ResultSetCompareComponent rscc = createResultSetCompareComponent();
IPentahoResultSet rs1 = createResultSet( 1, 1, RESULT_SET_ELEMENT_VALUE );
IPentahoResultSet rs2 = createResultSet( 2, 1, RESULT_SET_ELEMENT_VALUE );
ResultSetCompareAction resultSetCompareAction = createResultSetCompareAction( rs1, rs2, 0, false, true );
rscc.setActionDefinition( resultSetCompareAction );
rscc.validate();
int actualExecuteResult = rscc.execute();
assertEquals( IRuntimeContext.RUNTIME_STATUS_FAILURE, actualExecuteResult );
}
@Test
public void execute_fails_when_resultSets_have_different_values_in_compareColumn() {
ResultSetCompareComponent rscc = createResultSetCompareComponent();
IPentahoResultSet rs1 = createResultSet( new String[][] { { FIRST_ROW }, { SECOND_ROW } } );
IPentahoResultSet rs2 = createResultSet( new String[][] { { FIRST_ROW }, { "SECOND" } } );
ResultSetCompareAction resultSetCompareAction = createResultSetCompareAction( rs1, rs2, 0, false, true );
rscc.setActionDefinition( resultSetCompareAction );
rscc.validate();
int actualExecuteResult = rscc.execute();
assertEquals( IRuntimeContext.RUNTIME_STATUS_FAILURE, actualExecuteResult );
}
@Test
public void executeSuccessful() {
ResultSetCompareComponent rscc = createResultSetCompareComponent();
IPentahoResultSet rs1 = createResultSet( new String[][] { { FIRST_ROW }, { SECOND_ROW } } );
IPentahoResultSet rs2 = createResultSet( new String[][] { { FIRST_ROW }, { SECOND_ROW } } );
ResultSetCompareAction resultSetCompareAction = createResultSetCompareAction( rs1, rs2, 0, false, true );
rscc.setActionDefinition( resultSetCompareAction );
rscc.validate();
int actualExecuteResult = rscc.execute();
assertEquals( IRuntimeContext.RUNTIME_STATUS_SUCCESS, actualExecuteResult );
}
@After
public void tearDown() {
LogManager.getRootLogger().setLevel( level );
}
private static int callValidationWithResultSets( IPentahoResultSet resultSet1, IPentahoResultSet resultSet2 ) {
ResultSetCompareComponent rscc = createResultSetCompareComponent();
ResultSetCompareAction resultSetCompareAction =
createResultSetCompareAction( resultSet1, resultSet2, 0, false, true );
rscc.setActionDefinition( resultSetCompareAction );
return rscc.validate();
}
private static IPentahoResultSet createResultSet( int columnCount, int rowCount, Object resultSetElement ) {
IPentahoResultSet rs = Mockito.mock( IPentahoResultSet.class );
when( rs.getColumnCount() ).thenReturn( columnCount );
when( rs.getRowCount() ).thenReturn( rowCount );
when( rs.getValueAt( anyInt(), anyInt() ) ).thenReturn( resultSetElement );
return rs;
}
private static IPentahoResultSet createResultSet( final Object[][] resultSet ) {
IPentahoResultSet rs = Mockito.mock( IPentahoResultSet.class );
when( rs.getRowCount() ).thenReturn( resultSet.length );
when( rs.getColumnCount() ).thenAnswer( new Answer<Integer>() {
@Override
public Integer answer( InvocationOnMock invocation ) throws Throwable {
return resultSet.length == 0 ? 0 : resultSet[0].length;
}
} );
when( rs.getValueAt( anyInt(), anyInt() ) ).thenAnswer( new Answer<Object>() {
@Override
public Object answer( InvocationOnMock invocation ) throws Throwable {
Object[] args = invocation.getArguments();
int rowNumber = (Integer) args[0];
int colNumber = (Integer) args[1];
return resultSet[rowNumber][colNumber];
}
} );
return rs;
}
private static ResultSetCompareComponent createResultSetCompareComponent() {
ResultSetCompareComponent rscc = new ResultSetCompareComponent();
IRuntimeContext context = mock( IRuntimeContext.class );
rscc.setRuntimeContext( context );
rscc.setSession( mock( IPentahoSession.class ) );
rscc.setComponentDefinition( mock( Node.class ) );
rscc.setInstanceId( "TEST_ID" );
rscc.setProcessId( "TEST_PROCESS_ID" );
rscc.setActionName( "TEST_ACTION_NAME" );
return rscc;
}
private static ResultSetCompareAction createResultSetCompareAction( IPentahoResultSet resultSet1,
IPentahoResultSet resultSet2, Integer compareColumnNum, boolean outputMismatches, boolean stopOnError ) {
ResultSetCompareAction resultSetCompareAction = mock( ResultSetCompareAction.class );
IActionInput resultSetInput1 = ActionInputConstant.NULL_INPUT;
if ( resultSet1 != null ) {
resultSetInput1 = mock( IActionInput.class );
when( resultSetInput1.getValue() ).thenReturn( resultSet1 );
}
when( resultSetCompareAction.getResultSet1() ).thenReturn( resultSetInput1 );
IActionInput resultSetInput2 = ActionInputConstant.NULL_INPUT;
if ( resultSet2 != null ) {
resultSetInput2 = mock( IActionInput.class );
when( resultSetInput2.getValue() ).thenReturn( resultSet2 );
}
when( resultSetCompareAction.getResultSet2() ).thenReturn( resultSetInput2 );
IActionInput compareColumnNumInput = ActionInputConstant.NULL_INPUT;
if ( compareColumnNum != null ) {
compareColumnNumInput = mock( IActionInput.class );
when( compareColumnNumInput.getStringValue() ).thenReturn( String.valueOf( compareColumnNum ) );
}
when( resultSetCompareAction.getCompareColumnNum() ).thenReturn( compareColumnNumInput );
IActionInput outputMismatchesInput = mock( IActionInput.class );
when( outputMismatchesInput.getStringValue() ).thenReturn( String.valueOf( outputMismatches ) );
when( resultSetCompareAction.getOutputMismatches() ).thenReturn( outputMismatchesInput );
IActionInput stopOnErrorInput = mock( IActionInput.class );
when( stopOnErrorInput.getStringValue() ).thenReturn( String.valueOf( stopOnError ) );
when( resultSetCompareAction.getStopOnError() ).thenReturn( stopOnErrorInput );
return resultSetCompareAction;
}
}