/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.control.common;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Map;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
import net.codjo.control.common.i18n.InternationalizationFixture;
import net.codjo.control.common.message.SourceOfData;
import net.codjo.control.common.util.EntityHelper;
import net.codjo.control.common.util.EntityIterator;
import net.codjo.control.common.util.EntityResultState;
import org.easymock.MockControl;
/**
* DOCUMENT ME!
*
* @author $Author: torrent $
* @version $Revision: 1.7 $
*/
public class IntegrationPlanTest extends TestCase {
private InternationalizationFixture i18nFixture = new InternationalizationFixture();
private MockControl connectionControl;
private Dictionary dico;
private MockPlan dispatch;
private MockEntityHelper entityHelper;
private IntegrationPlan integrationPlan;
private EntityIterator iterator;
private MockControl iteratorControl;
private Connection mockConnection;
private Statement mockStatement;
private MockPlan planJava;
private MockPlan planSQL;
private MockShipment shipment;
private MockControl statementControl;
private MockEntity mockEntity;
private ControlContext context;
/**
* Verifie la cr�ation de la table temporaire des controles.
*/
public void test_createControlTable() throws Exception {
mockCreateTemporaryTable();
activateMock();
integrationPlan.createControlTable(mockConnection);
verifyMock();
}
public void test_proceedDeletedEntity_Java() throws Exception {
integrationPlan.getPlanListForDelete().getPlans().add(planJava);
integrationPlan.proceedDeletedEntity(mockConnection, new Object(), context);
assertTrue("Pas d'insertion car seulement un plan Java",
!entityHelper.insertObjectCalled);
assertTrue("Pas de creation de entityHelper",
!mockEntity.getEntityHelperCalled
&& !mockEntity.getEntityHelperForBatchCalled);
assertTrue("Pas de load", !entityHelper.updateObjectCalled);
assertTrue("Plan java est appel�", planJava.executeJAVACalled);
assertTrue("Pas de shipment", !shipment.called);
assertTrue("Pas de dispatch", !dispatch.executeSQLCalled);
}
public void test_proceedDeletedEntity_NoStep()
throws Exception {
integrationPlan.setPlanListForDelete(null);
integrationPlan.proceedDeletedEntity(mockConnection, new Object(), context);
assertTrue("Pas d'insertion car seulement un plan Java",
!entityHelper.insertObjectCalled);
assertTrue("Pas de creation de entityHelper",
!mockEntity.getEntityHelperCalled
&& !mockEntity.getEntityHelperForBatchCalled);
assertTrue("Pas de load", !entityHelper.updateObjectCalled);
assertTrue("Pas de shipment", !shipment.called);
assertTrue("Pas de dispatch", !dispatch.executeSQLCalled);
}
/**
* Verifie que le traitement d'un plan Java marche.
*/
public void test_proceedEntity_Java() throws Exception {
integrationPlan.getPlanList().getPlans().add(planJava);
integrationPlan.proceedNewEntity(mockConnection, new Object(), context);
assertTrue("Pas d'insertion car seulement un plan Java",
!entityHelper.insertObjectCalled);
assertTrue("Pas de creation de entityHelper",
!mockEntity.getEntityHelperCalled
&& !mockEntity.getEntityHelperForBatchCalled);
assertTrue("Pas de load", !entityHelper.updateObjectCalled);
assertTrue("Plan java est appel�", planJava.executeJAVACalled);
assertControlContext();
assertTrue("Pas de shipment", !shipment.called);
assertTrue("Pas de dispatch", !dispatch.executeSQLCalled);
}
/**
* Verifie que le traitement d'un plan Java marche.
*/
public void test_proceedEntity_Java_nostep_for_user()
throws Exception {
integrationPlan.getPlanList().getPlans().add(planJava);
planJava.hasStepForReturn = false;
integrationPlan.proceedNewEntity(mockConnection, new Object(), context);
assertTrue("Pas d'insertion car pas de Step", !entityHelper.insertObjectCalled);
assertTrue("Pas de creation de entityHelper",
!mockEntity.getEntityHelperCalled
&& !mockEntity.getEntityHelperForBatchCalled);
assertTrue("Pas de load", !entityHelper.updateObjectCalled);
assertTrue("Plan java n'est pas appel�", !planJava.executeJAVACalled);
assertTrue("Pas de shipment", !shipment.called);
assertTrue("Pas de dispatch", !dispatch.executeSQLCalled);
}
/**
* Verifie que le traitement passe correctement d'un plan Java a un plan SQL.
*/
public void test_proceedEntity_Java_to_SQL() throws Exception {
integrationPlan.getPlanList().getPlans().add(planJava);
integrationPlan.getPlanList().getPlans().add(planSQL);
mockCreateTemporaryTable();
mockDropTemporaryTable();
activateMock();
dico.setNow(Timestamp.valueOf("1999-12-10 10:00:00.0"));
integrationPlan.proceedNewEntity(mockConnection, new Object(), context);
verifyMock();
assertTrue(entityHelper.insertObjectCalled);
assertTrue(entityHelper.updateObjectCalled);
assertTrue("Creation de entityHelper de type bean",
mockEntity.getEntityHelperCalled && !mockEntity.getEntityHelperForBatchCalled);
assertTrue(planSQL.executeSQLCalled);
assertTrue(planJava.executeJAVACalled);
assertTrue(!shipment.called);
assertTrue(!dispatch.executeSQLCalled);
}
/**
* Verifie que le traitement passe correctement d'un plan Java a un plan SQL.
*/
public void test_proceedEntity_SQL_Java() throws Exception {
integrationPlan.getPlanList().getPlans().add(planSQL);
integrationPlan.getPlanList().getPlans().add(planJava);
mockCreateTemporaryTable();
mockDropTemporaryTable();
activateMock();
dico.setNow(Timestamp.valueOf("1999-12-10 10:00:00.0"));
integrationPlan.proceedNewEntity(mockConnection, new Object(), context);
verifyMock();
assertTrue("Creation de entityHelper de type bean",
mockEntity.getEntityHelperCalled && !mockEntity.getEntityHelperForBatchCalled);
assertTrue(entityHelper.insertObjectCalled);
assertTrue(planSQL.executeSQLCalled);
assertTrue(entityHelper.updateObjectCalled);
assertTrue(planJava.executeJAVACalled);
assertTrue(entityHelper.insertObjectCalled);
assertTrue(planSQL.executeSQLCalled);
assertTrue(!shipment.called);
assertTrue(!dispatch.executeSQLCalled);
}
/**
* Bug : duplicate key. Si l'integration possede 2 plans SQL, l'objet integrationPlan tente d'inserer 2 fois le bean
* � controler.
*/
public void test_proceedEntity_SQL_SQL() throws Exception {
MockPlan planSQLbis = new MockPlan();
integrationPlan.getPlanList().getPlans().add(planSQL);
integrationPlan.getPlanList().getPlans().add(planSQLbis);
mockCreateTemporaryTable();
mockDropTemporaryTable();
activateMock();
dico.setNow(Timestamp.valueOf("1999-12-10 10:00:00.0"));
integrationPlan.proceedNewEntity(mockConnection, new Object(), context);
verifyMock();
assertTrue(planSQL.executeSQLCalled);
assertTrue(planSQLbis.executeSQLCalled);
assertTrue(entityHelper.insertObjectCalled);
assertEquals(1, entityHelper.insertObjectNbcalled);
assertTrue(entityHelper.updateTableCalled);
assertEquals(1, entityHelper.updateTableNbcalled);
}
public void test_proceedDeletedEntity_SQL_SQL()
throws Exception {
MockPlan planSQLbis = new MockPlan();
integrationPlan.getPlanListForDelete().getPlans().add(planSQL);
integrationPlan.getPlanListForDelete().getPlans().add(planSQLbis);
mockCreateTemporaryTable();
mockDropTemporaryTable();
activateMock();
dico.setNow(Timestamp.valueOf("1999-12-10 10:00:00.0"));
integrationPlan.proceedDeletedEntity(mockConnection, new Object(), context);
verifyMock();
assertTrue(planSQL.executeSQLCalled);
assertTrue(planSQLbis.executeSQLCalled);
assertTrue(entityHelper.insertObjectCalled);
assertEquals(1, entityHelper.insertObjectNbcalled);
assertTrue(entityHelper.updateObjectCalled);
assertEquals(1, entityHelper.updateTableNbcalled);
}
/**
* Verifie le traitement de la table des Quarantaine en mode java.
*/
public void test_proceedQuarantine_java() throws Exception {
integrationPlan.getPlanList().getPlans().add(planJava);
Object obj = new Object();
mockCreateTemporaryTable();
iterator.hasNext();
iteratorControl.setReturnValue(true, 1);
iterator.next();
iteratorControl.setReturnValue(obj, 1);
iterator.update(obj, null);
iteratorControl.setVoidCallable(1);
iterator.hasNext();
iteratorControl.setReturnValue(false, 1);
iterator.close();
iteratorControl.setVoidCallable(1);
mockDropTemporaryTable();
activateMock();
dico.setNow(Timestamp.valueOf("1999-12-10 10:00:00.0"));
integrationPlan.proceedQuarantine(mockConnection, context);
verifyMock();
assertTrue("Creation de entityHelper de type batch",
!mockEntity.getEntityHelperCalled && mockEntity.getEntityHelperForBatchCalled);
assertTrue(planJava.executeJAVACalled);
assertTrue(shipment.called);
assertTrue(dispatch.executeSQLCalled);
assertEquals(new Timestamp(System.currentTimeMillis()).toString().substring(0, 10),
dico.getNow().toString().substring(0, 10));
assertControlContext();
}
/**
* Verifie le traitement de la table des Quarantaine.
*/
public void test_proceedQuarantine_sql() throws Exception {
integrationPlan.getPlanList().getPlans().add(planSQL);
mockCreateTemporaryTable();
mockDropTemporaryTable();
activateMock();
dico.setNow(Timestamp.valueOf("1999-12-10 10:00:00.0"));
integrationPlan.proceedQuarantine(mockConnection, context);
verifyMock();
assertTrue("Pas de creation de entityHelper car pas de plan JAVA",
!mockEntity.getEntityHelperCalled
&& !mockEntity.getEntityHelperForBatchCalled);
assertTrue(planSQL.executeSQLCalled);
assertEquals(SourceOfData.IMPORT, planSQL.stepFor);
assertTrue(shipment.called);
assertTrue(dispatch.executeSQLCalled);
assertEquals(new Timestamp(System.currentTimeMillis()).toString().substring(0, 10),
dico.getNow().toString().substring(0, 10));
}
public void test_cleanUpType_delete() throws Exception {
integrationPlan.setCleanUpType("delete");
integrationPlan.getPlanList().getPlans().add(planSQL);
mockCreateTemporaryTable();
mockDeleteTemporaryTable();
activateMock();
dico.setNow(Timestamp.valueOf("1999-12-10 10:00:00.0"));
integrationPlan.proceedNewEntity(mockConnection, new Object(), context);
verifyMock();
}
public void test_cleanUpType_drop() throws Exception {
integrationPlan.setCleanUpType("drop");
integrationPlan.getPlanList().getPlans().add(planSQL);
mockCreateTemporaryTable();
mockDropTemporaryTable();
activateMock();
dico.setNow(Timestamp.valueOf("1999-12-10 10:00:00.0"));
integrationPlan.proceedNewEntity(mockConnection, new Object(), context);
verifyMock();
}
public void test_cleanUpType_unknown() throws Exception {
integrationPlan.setCleanUpType("unknown");
integrationPlan.getPlanList().getPlans().add(planSQL);
mockCreateTemporaryTable();
mockDeleteTemporaryTable();
activateMock();
dico.setNow(Timestamp.valueOf("1999-12-10 10:00:00.0"));
try {
integrationPlan.proceedNewEntity(mockConnection, new Object(), context);
fail("cleanup type unknown");
}
catch (IllegalArgumentException ex) {
assertEquals("cleanup type unknown (delete or drop).", ex.getMessage());
}
}
/**
* The JUnit setup method
*/
@Override
protected void setUp() throws Exception {
i18nFixture.doSetUp();
dico = new Dictionary();
context = new ControlContext("user", "prevId", SourceOfData.IMPORT);
planSQL = new MockPlan();
planJava = new MockPlan();
planJava.setType(Plan.JAVA_TYPE);
entityHelper = new MockEntityHelper();
dispatch = new MockPlan();
shipment = new MockShipment();
shipment.setTo("TABLE");
mockEntity = new MockEntity();
integrationPlan = new IntegrationPlan();
integrationPlan.setPlanList(new PlansList());
integrationPlan.setPlanListForDelete(new PlansList());
integrationPlan.setDispatch(dispatch);
integrationPlan.setDictionary(dico);
integrationPlan.setShipment(shipment);
integrationPlan.setEntity(mockEntity);
initMockStuff();
}
/**
* The teardown method for JUnit
*/
@Override
protected void tearDown() throws Exception {
i18nFixture.doTearDown();
}
/**
* Description of the Method
*/
private void activateMock() {
connectionControl.replay();
statementControl.replay();
iteratorControl.replay();
}
/**
* Description of the Method
*/
private void initMockStuff() {
connectionControl = MockControl.createControl(Connection.class);
mockConnection = (Connection)connectionControl.getMock();
statementControl = MockControl.createControl(Statement.class);
mockStatement = (Statement)statementControl.getMock();
iteratorControl = MockControl.createControl(EntityIterator.class);
iterator = (EntityIterator)iteratorControl.getMock();
}
/**
* Description of the Method
*
* @throws SQLException Description of the Exception
*/
private void mockCleanup() throws SQLException {
mockStatement.getWarnings();
statementControl.setReturnValue(null, 1);
mockStatement.close();
statementControl.setVoidCallable(1);
}
/**
* Description of the Method
*
* @param query Description of the Parameter
*
* @throws SQLException Description of the Exception
*/
private void mockCreateStatement(final String query)
throws SQLException {
mockConnection.createStatement();
connectionControl.setReturnValue(mockStatement, 1);
mockStatement.executeUpdate(query);
statementControl.setReturnValue(5, 1);
}
/**
* Description of the Method
*
* @throws SQLException Description of the Exception
*/
private void mockCreateTemporaryTable() throws SQLException {
// mockDropTemporaryTable();
mockCreateStatement("create TABLE (...)");
mockCleanup();
integrationPlan.setControlTableDef("create $table$ (...)");
dico.addVariable("table", "TABLE");
}
/**
* Description of the Method
*
* @throws SQLException Description of the Exception
*/
private void mockDropTemporaryTable() throws SQLException {
mockCreateStatement("drop table TABLE");
mockStatement.close();
statementControl.setVoidCallable(1);
}
private void mockDeleteTemporaryTable() throws SQLException {
mockCreateStatement("delete from TABLE");
mockStatement.close();
statementControl.setVoidCallable(1);
}
/**
* Description of the Method
*
* @throws AssertionFailedError Description of the Exception
*/
private void verifyMock() throws AssertionFailedError {
connectionControl.verify();
statementControl.verify();
iteratorControl.verify();
}
private void assertControlContext() {
assertNotNull("Plan java est appel� avec context", planJava.ctxt);
assertEquals("Plan java est appel� avec context immutable",
ImmutableControlContext.class, planJava.ctxt.getClass());
assertEquals("Plan java est appel� avec context immutable (user)",
context.getUser(), planJava.ctxt.getUser());
assertEquals("Plan java est appel� avec context immutable (user)",
context.getCurrentRequestId(), planJava.ctxt.getCurrentRequestId());
}
/**
* Description of the Class
*
* @author BULTEZ
* @version $Revision: 1.7 $
*/
private static class MockPlan extends Plan {
private boolean executeJAVACalled = false;
private boolean executeSQLCalled = false;
private boolean hasStepForReturn = true;
private String stepFor = null;
private ControlContext ctxt;
@Override
public void executeJAVA(Object obj,
Dictionary dico,
ControlContext context,
String pathOfRequest,
Map<Step, StepAudit> stepAuditMap) throws ControlException {
executeJAVACalled = true;
this.ctxt = context;
}
@Override
public void executeMASS(Connection con,
Dictionary dico,
ControlContext context,
String stepForParam,
String pathOfRequest,
Map<Step, StepAudit> stepAuditMap) throws SQLException, ControlException {
executeSQLCalled = true;
this.stepFor = stepForParam;
}
@Override
public boolean hasStepFor(String stepForParam) {
return hasStepForReturn;
}
}
/**
* Description of the Class
*
* @author BULTEZ
* @version $Revision: 1.7 $
*/
private static class MockShipment extends Shipment {
private boolean called = false;
@Override
public void execute(Connection con, Dictionary dico)
throws SQLException {
called = true;
}
}
private class MockEntity extends Entity {
private boolean getEntityHelperCalled = false;
private boolean getEntityHelperForBatchCalled = false;
@Override
public EntityHelper getEntityHelper() {
getEntityHelperCalled = true;
return entityHelper;
}
@Override
public EntityHelper getEntityHelperForBatch() {
getEntityHelperForBatchCalled = true;
return entityHelper;
}
}
/**
* Description of the Class
*
* @author BULTEZ
* @version $Revision: 1.7 $
*/
private class MockEntityHelper extends EntityHelper {
private boolean insertObjectCalled = false;
private int insertObjectNbcalled = 0;
private boolean updateObjectCalled = false;
private boolean updateTableCalled = false;
private int updateTableNbcalled = 0;
@Override
public void updateTable(Connection con, Object vo, String tableName) {
updateTableCalled = true;
updateTableNbcalled++;
}
@Override
public void insertIntoTable(Connection con, Object bean, String tableName) {
insertObjectCalled = true;
insertObjectNbcalled++;
}
@Override
public EntityIterator iterator(Connection con, String tableName) {
return iterator;
}
@Override
public EntityResultState updateObject(Connection con, Object bean,
String tableName) {
updateObjectCalled = true;
return new ControlException(EntityResultState.NO_ERROR, "");
}
}
}