/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.control.common.loader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import junit.framework.TestCase;
import static org.mockito.AdditionalMatchers.not;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
*
*/
public class TransfertDataTest extends TestCase {
private static final String Q_TO_USER =
"insert into USER ( QUARANTINE_ID, TOTO_COL, TiTi_COL ) "
+ "select QUARANTINE.QUARANTINE_ID, QUARANTINE.TOTO_COL, QUARANTINE.TiTi_COL "
+ "from QUARANTINE where QUARANTINE.ERROR_TYPE > 0";
private static final String Q_TO_USER_DELETE =
"delete QUARANTINE"
+ " where QUARANTINE_ID in ("
+ " select USER.QUARANTINE_ID"
+ " from QUARANTINE INNER JOIN USER"
+ " on QUARANTINE.QUARANTINE_ID = USER.QUARANTINE_ID)";
private static final String USER_TO_Q =
"insert into QUARANTINE ( TOTO_COL, TiTi_COL ) "
+ "select USER.TOTO_COL, USER.TiTi_COL from USER where USER.ERROR_TYPE <= 0";
private static final String USER_TO_Q_DELETE =
"delete USER where ERROR_TYPE <= 0";
private TransfertData transfert;
private Connection connection;
private PreparedStatement statement;
ResultSet resultSet4Metadata;
public void test_buildQuery_replaceUserData_singleColumn() throws Exception {
transfert = new TransfertData("QUARANTINE", "USER");
transfert.addMatchingCol("TOTO_COL");
transfert.setReplaceUserData(true);
// QUARANTINE TO USER
transfert.getQuarantineToUserQuery(connection).execute();
verify(resultSet4Metadata, times(1)).getMetaData();
verify(connection).prepareStatement("delete USER from USER inner join QUARANTINE"
+ " on convert(varchar,USER.TOTO_COL) = convert(varchar,QUARANTINE.TOTO_COL)"
+ " where QUARANTINE.ERROR_TYPE > 0 ");
verify(connection).prepareStatement(Q_TO_USER);
verify(connection).prepareStatement(Q_TO_USER_DELETE);
verify(statement, times(3)).execute();
// QUARANTINE TO USER - Mecanisme de cache
setupNewMockedConnection();
transfert.getQuarantineToUserQuery(connection).execute();
verify(connection, times(0)).getMetaData();
verify(connection).prepareStatement("delete USER from USER inner join QUARANTINE"
+ " on convert(varchar,USER.TOTO_COL) = convert(varchar,QUARANTINE.TOTO_COL)"
+ " where QUARANTINE.ERROR_TYPE > 0 ");
verify(connection).prepareStatement(Q_TO_USER);
verify(connection).prepareStatement(Q_TO_USER_DELETE);
verify(statement, times(3)).execute();
// USER TO QUARANTINE
setupNewMockedConnection();
transfert.getUserToQuarantineQuery(connection).execute();
verify(connection, times(0)).getMetaData();
verify(connection).prepareStatement(USER_TO_Q);
verify(connection).prepareStatement(USER_TO_Q_DELETE);
verify(statement, times(2)).execute();
}
public void test_buildQuery_replaceUserData() throws Exception {
transfert = new TransfertData("QUARANTINE", "USER");
transfert.addMatchingCol("TOTO_COL");
transfert.addMatchingCol("TiTi_COL");
transfert.setReplaceUserData(true);
assertTrue(transfert.isReplaceUserData());
assertEquals("[TOTO_COL, TiTi_COL]", transfert.getMatchingCols().toString());
assertUnmodifiableList(transfert.getMatchingCols());
// QUARANTINE TO USER
transfert.getQuarantineToUserQuery(connection).execute();
verify(resultSet4Metadata, times(1)).getMetaData();
verify(connection).prepareStatement("delete USER from USER inner join QUARANTINE"
+ " on convert(varchar,USER.TOTO_COL) +'��'+ convert(varchar,USER.TiTi_COL) = "
+ "convert(varchar,QUARANTINE.TOTO_COL) +'��'+ convert(varchar,QUARANTINE.TiTi_COL)"
+ " where QUARANTINE.ERROR_TYPE > 0 ");
verify(connection).prepareStatement(Q_TO_USER);
verify(connection).prepareStatement(Q_TO_USER_DELETE);
verify(statement, times(3)).execute();
// USER TO QUARANTINE
setupNewMockedConnection();
transfert.getUserToQuarantineQuery(connection).execute();
verify(connection, times(0)).getMetaData();
verify(connection).prepareStatement(USER_TO_Q);
verify(connection).prepareStatement(USER_TO_Q_DELETE);
verify(statement, times(2)).execute();
}
public void test_buildQuery() throws Exception {
transfert = new TransfertData("QUARANTINE", "USER");
// USER TO QUARANTINE
transfert.getUserToQuarantineQuery(connection).execute();
verify(resultSet4Metadata, times(1)).getMetaData();
verify(connection).prepareStatement(USER_TO_Q);
verify(connection).prepareStatement(USER_TO_Q_DELETE);
verify(statement, times(2)).execute();
// QUARANTINE TO USER
setupNewMockedConnection();
transfert.getQuarantineToUserQuery(connection).execute();
verify(connection, times(0)).getMetaData();
verify(connection).prepareStatement(Q_TO_USER);
verify(connection).prepareStatement(Q_TO_USER_DELETE);
verify(statement, times(2)).execute();
}
private void assertUnmodifiableList(List matchingCols) {
try {
matchingCols.remove(0);
fail("Liste non modifiable");
}
catch (Exception ex) {
// Ok
}
}
@Override
protected void setUp() throws Exception {
super.setUp();
setupNewMockedConnection();
mockMetadataStuff();
}
private void setupNewMockedConnection() throws SQLException {
connection = mock(Connection.class);
statement = mock(PreparedStatement.class);
when(connection.prepareStatement(anyString())).thenReturn(statement);
}
private void mockMetadataStuff() throws SQLException {
Statement statement4Metadadta = mock(Statement.class);
resultSet4Metadata = mock(ResultSet.class);
ResultSetMetaData resultSetMetadata = mock(ResultSetMetaData.class);
when(connection.createStatement()).thenReturn(statement4Metadadta);
String metadataQuery = "select * from QUARANTINE where 1 = 0";
when(statement4Metadadta.executeQuery(metadataQuery)).thenReturn(resultSet4Metadata);
when(statement4Metadadta.executeQuery(not(eq(metadataQuery))))
.thenThrow(new SQLException("Unexpected query has been detected -> != " + metadataQuery));
when(resultSet4Metadata.getMetaData()).thenReturn(resultSetMetadata);
when(resultSetMetadata.getColumnCount()).thenReturn(3);
when(resultSetMetadata.getColumnLabel(1)).thenReturn("QUARANTINE_ID");
when(resultSetMetadata.getColumnLabel(2)).thenReturn("TOTO_COL");
when(resultSetMetadata.getColumnLabel(3)).thenReturn("TiTi_COL");
}
}