/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.control.common;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.SQLWarning;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
import org.easymock.MockControl;
/**
* Description of the Class
*
* @author $Author: galaber $
* @version $Revision: 1.5 $
*/
public class StepTest extends TestCase {
private MockControl connectionControl;
private Dictionary dico;
private Connection mockConnection;
private PreparedStatement mockStatement;
private MockControl statementControl;
private Step step;
private ControlContext context;
/**
* Verification pour le cas d'une requete simple sans parametres ou variable (en mode SQL).
*
* @throws Exception
*/
public void testSQLexecute() throws Exception {
String query = "update table set FIELD='1' where FIELD !=1";
mockCreatePrepareStatement(query);
mockCleanup();
activateMock();
step.setQuery(new Query(query));
step.execute(mockConnection, dico, "", false, null);
verifyMock();
}
/**
* Verification pour le cas d'un control java.
*
* @throws Exception
*/
public void testJAVAexecute() throws Exception {
SingletonFakeControl.singleton = null;
step.setControlClass(SingletonFakeControl.class.getName());
step.setErrorCode(5);
step.execute("object to be tested", dico, context);
assertNotNull(SingletonFakeControl.singleton);
assertEquals("object to be tested", SingletonFakeControl.singleton.getControledObject());
assertEquals(5, SingletonFakeControl.singleton.getErrorCode());
assertEquals(context, SingletonFakeControl.singleton.getContext());
}
/**
* Verification pour le cas d'une requete simple sans parametres ou variable (en mode SQL), avec un
* warning.
*
* @throws Exception
*/
public void testSQLexecuteWarning() throws Exception {
String query = "update table set FIELD='1' where FIELD !=1";
mockCreatePrepareStatement(query);
mockStatement.getWarnings();
statementControl.setReturnValue(new SQLWarning("grr", "010P4"), 1);
mockStatement.close();
statementControl.setVoidCallable(1);
activateMock();
step.setQuery(new Query(query));
try {
step.execute(mockConnection, dico, "", false, null);
fail("Car un warning");
}
catch (SQLException ex) {
;
}
verifyMock();
}
/**
* Verification pour le cas d'une requete simple sans parametres ou variable (en mode SQL), avec un
* warning ignor�.
*
* @throws Exception
*/
public void testSQLexecuteWarningIgnored()
throws Exception {
String queryStr = "update table set FIELD='1' where FIELD !=1";
mockCreatePrepareStatement(queryStr);
mockStatement.getWarnings();
statementControl.setReturnValue(new SQLWarning("grr", "010P4"), 1);
mockStatement.close();
statementControl.setVoidCallable(1);
activateMock();
Query query = new Query(queryStr);
query.setIgnoreWarningCode("010P4");
step.setQuery(query);
step.execute(mockConnection, dico, "", false, null);
verifyMock();
}
/**
* Verification pour le cas d'une requete simple avec parametres et avec variable (en mode SQL).
*
* @throws Exception
*/
public void testSQLexecuteParametres() throws Exception {
String query = "update TABLE set FIELD=? where FIELD !=1";
mockCreatePrepareStatement(query);
mockStatement.setString(1, "toto");
mockStatement.setInt(2, 5);
mockCleanup();
activateMock();
step.addParameter(new Parameter(2, "int", "5"));
step.addParameter(new Parameter(1, "string", "toto"));
step.setQuery(new Query("update $table$ set FIELD=? where FIELD !=1"));
dico.addVariable("table", "TABLE");
step.execute(mockConnection, dico, "", false, null);
verifyMock();
}
/**
* Verification pour le cas d'une requete simple avec parametres et avec la variable automatique (en mode
* SQL).
*
* @throws Exception
*/
public void testSQLexecuteParametresErrorCode()
throws Exception {
String query = "update TABLE set FIELD=? where FIELD !=1";
mockCreatePrepareStatement(query);
mockStatement.setString(1, "toto");
mockStatement.setInt(2, 5);
mockCleanup();
activateMock();
step.setErrorCode(5);
step.addParameter(new Parameter(2, "int", "$" + Step.ERROR_CODE + "$"));
step.addParameter(new Parameter(1, "string", "toto"));
step.setQuery(new Query("update $table$ set FIELD=? where FIELD !=1"));
dico.addVariable("table", "TABLE");
step.execute(mockConnection, dico, "", false, null);
verifyMock();
}
/**
* Verification pour le cas d'une requete utilisant une table temporaire (en mode SQL).
*
* @throws Exception
*/
public void testSQLexecuteTemporaryTable()
throws Exception {
String sql = "update xx";
mockCreatePrepareStatement(sql);
mockCreateStatement("drop table #TEMP");
mockStatement.close();
statementControl.setVoidCallable(1);
mockCleanup();
activateMock();
Query query = new Query(sql);
query.setTemporaryTable("#TEMP");
step.setQuery(query);
step.execute(mockConnection, dico, "", false, null);
verifyMock();
}
/**
* Verification pour le cas d'une requete simple sans parametres mais avec variable (en mode SQL).
*
* @throws Exception
*/
public void testSQLexecuteVariable() throws Exception {
String query = "update TABLE set FIELD='1' where FIELD !=1";
mockCreatePrepareStatement(query);
mockCleanup();
activateMock();
step.setQuery(new Query("update $table$ set FIELD='1' where FIELD !=1"));
dico.addVariable("table", "TABLE");
step.execute(mockConnection, dico, "", false, null);
verifyMock();
}
public void test_isStepFor() {
step.setStepFor(null);
assertTrue(step.isStepFor(Step.FOR_ALL));
assertTrue(step.isStepFor(Step.FOR_USER));
assertTrue(step.isStepFor(Step.FOR_USER_ADD));
assertTrue(step.isStepFor(Step.FOR_USER_UPDATE));
assertTrue(step.isStepFor(Step.FOR_BATCH));
step.setStepFor(Step.FOR_ALL);
assertTrue(step.isStepFor(Step.FOR_ALL));
assertTrue(step.isStepFor(Step.FOR_USER));
assertTrue(step.isStepFor(Step.FOR_USER_ADD));
assertTrue(step.isStepFor(Step.FOR_USER_UPDATE));
assertTrue(step.isStepFor(Step.FOR_BATCH));
step.setStepFor(Step.FOR_USER);
assertTrue(!step.isStepFor(Step.FOR_ALL));
assertTrue(step.isStepFor(Step.FOR_USER));
assertTrue(step.isStepFor(Step.FOR_USER_ADD));
assertTrue(step.isStepFor(Step.FOR_USER_UPDATE));
assertTrue(!step.isStepFor(Step.FOR_BATCH));
step.setStepFor(Step.FOR_BATCH);
assertTrue(!step.isStepFor(Step.FOR_ALL));
assertTrue(!step.isStepFor(Step.FOR_USER));
assertTrue(!step.isStepFor(Step.FOR_USER_ADD));
assertTrue(!step.isStepFor(Step.FOR_USER_UPDATE));
assertTrue(step.isStepFor(Step.FOR_BATCH));
step.setStepFor(Step.FOR_USER_ADD);
assertTrue(!step.isStepFor(Step.FOR_ALL));
assertTrue(step.isStepFor(Step.FOR_USER));
assertTrue(step.isStepFor(Step.FOR_USER_ADD));
assertTrue(!step.isStepFor(Step.FOR_USER_UPDATE));
assertTrue(!step.isStepFor(Step.FOR_BATCH));
step.setStepFor(Step.FOR_USER_UPDATE);
assertTrue(!step.isStepFor(Step.FOR_ALL));
assertTrue(step.isStepFor(Step.FOR_USER));
assertTrue(!step.isStepFor(Step.FOR_USER_ADD));
assertTrue(step.isStepFor(Step.FOR_USER_UPDATE));
assertTrue(!step.isStepFor(Step.FOR_BATCH));
step.setStepFor("import");
assertFalse(step.isStepFor("transferq"));
assertFalse(step.isStepFor("batch.transferq"));
assertTrue(step.isStepFor("import"));
assertFalse(step.isStepFor("batch.import"));
assertFalse(step.isStepFor("test/t2/batch.import"));
assertTrue(step.isStepFor("test/t2/import"));
assertTrue(step.isStepFor("test/t2/import/ui/ol"));
assertFalse(step.isStepFor("test/t2/batch.import.spe1"));
step.setStepFor("batch");
assertTrue(step.isStepFor("test/t2/batch/import.spe1"));
}
@Override
protected void setUp() {
step = new Step();
dico = new Dictionary();
context = new ControlContext("user", "prevId",null);
initMockStuff();
}
@Override
protected void tearDown() {
}
private void activateMock() {
connectionControl.replay();
statementControl.replay();
}
private void initMockStuff() {
connectionControl = MockControl.createControl(Connection.class);
mockConnection = (Connection)connectionControl.getMock();
statementControl = MockControl.createControl(PreparedStatement.class);
mockStatement = (PreparedStatement)statementControl.getMock();
}
private void mockCleanup() throws SQLException {
mockStatement.getWarnings();
statementControl.setReturnValue(null, 1);
mockStatement.close();
statementControl.setVoidCallable(1);
}
private void mockCreatePrepareStatement(final String query)
throws SQLException {
mockConnection.prepareStatement(query);
connectionControl.setReturnValue(mockStatement, 1);
mockStatement.executeUpdate();
statementControl.setReturnValue(5, 1);
}
private void mockCreateStatement(final String query)
throws SQLException {
mockConnection.createStatement();
connectionControl.setReturnValue(mockStatement, 1);
mockStatement.executeUpdate(query);
statementControl.setReturnValue(5, 1);
}
private void verifyMock() throws AssertionFailedError {
connectionControl.verify();
statementControl.verify();
}
static class SingletonFakeControl extends FakeControl {
public static SingletonFakeControl singleton;
SingletonFakeControl() {
singleton = this;
}
}
}