package net.codjo.dataprocess.server.kernel;
import net.codjo.database.common.api.DatabaseFactory;
import net.codjo.database.common.api.JdbcFixture;
import net.codjo.dataprocess.common.DataProcessConstants;
import net.codjo.dataprocess.common.context.DataProcessContext;
import net.codjo.dataprocess.common.exception.TreatmentException;
import net.codjo.dataprocess.common.model.ArgList;
import net.codjo.dataprocess.common.model.ArgModel;
import net.codjo.dataprocess.common.model.ExecutionListModel;
import net.codjo.dataprocess.common.model.TreatmentModel;
import java.sql.Connection;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static net.codjo.test.common.matcher.JUnitMatchers.*;
/**
*
*/
public class TreatmentFactoryTest {
private JdbcFixture jdbc;
@Before
public void before() throws Exception {
jdbc = new DatabaseFactory().createJdbcFixture();
jdbc.doSetUp();
}
@After
public void after() {
jdbc.doTearDown();
}
@Test
public void sqlQueryType() throws Exception {
Connection con = jdbc.getConnection();
TreatmentModel treatmentModel = new TreatmentModel();
treatmentModel.setId("traitement 1");
treatmentModel.setType(DataProcessConstants.SQL_QUERY_TYPE);
ArgList argList = buildArgsForQuery();
treatmentModel.setArguments(argList);
ExecutionListModel executionListModel = new ExecutionListModel();
AbstractTreatment abstractTreatment = TreatmentFactory
.buildTreatment(con, treatmentModel, 1, executionListModel);
assertThat(abstractTreatment.getConnection(), is(sameInstance(con)));
assertThat(abstractTreatment.getExecutionListModel(), is(sameInstance(executionListModel)));
assertThat(abstractTreatment.getRepositoryId(), equalTo(1));
assertThat(abstractTreatment.getTreatmentModel(), is(sameInstance(treatmentModel)));
assertThat(abstractTreatment.getArgument("1"), equalTo("$portfolioCode$"));
assertThat(abstractTreatment.getArgument("2"), equalTo("0.12345"));
}
@Test
public void sqlQueryTypeWithResult() throws Exception {
Connection con = jdbc.getConnection();
TreatmentModel treatmentModel = new TreatmentModel();
treatmentModel.setId("traitement 1");
treatmentModel.setType(DataProcessConstants.SQL_QUERY_TYPE_WITH_RESULT);
ArgList argList = buildArgsForQuery();
treatmentModel.setArguments(argList);
ExecutionListModel executionListModel = new ExecutionListModel();
AbstractTreatment abstractTreatment = TreatmentFactory
.buildTreatment(con, treatmentModel, 1, executionListModel);
assertThat(abstractTreatment.getConnection(), is(sameInstance(con)));
assertThat(abstractTreatment.getExecutionListModel(), is(sameInstance(executionListModel)));
assertThat(abstractTreatment.getRepositoryId(), equalTo(1));
assertThat(abstractTreatment.getTreatmentModel(), is(sameInstance(treatmentModel)));
assertThat(abstractTreatment.getArgument("1"), equalTo("$portfolioCode$"));
assertThat(abstractTreatment.getArgument("2"), equalTo("0.12345"));
}
@Test
public void bsh() throws Exception {
Connection con = jdbc.getConnection();
TreatmentModel treatmentModel = new TreatmentModel();
treatmentModel.setId("traitement 1");
treatmentModel.setType(DataProcessConstants.BSH_TYPE);
treatmentModel.setTarget("int a = 5;");
ArgList argList = buildArgsForQuery();
treatmentModel.setArguments(argList);
ExecutionListModel executionListModel = new ExecutionListModel();
AbstractTreatment abstractTreatment = TreatmentFactory
.buildTreatment(con, treatmentModel, 1, executionListModel);
assertThat(abstractTreatment.getConnection(), is(sameInstance(con)));
assertThat(abstractTreatment.getExecutionListModel(), is(sameInstance(executionListModel)));
assertThat(abstractTreatment.getRepositoryId(), equalTo(1));
assertThat(abstractTreatment.getTreatmentModel(), is(sameInstance(treatmentModel)));
DataProcessContext context = new DataProcessContext();
context.setProperty("portfolioCode", "CP1");
abstractTreatment.configure(context);
assertThat(abstractTreatment.getArgument("CODE_VALEUR"), nullValue());
assertThat(abstractTreatment.getArgument("CODE_PORTEFEUILLE"), equalTo("CP1"));
assertThat(abstractTreatment.getArgument("QUANTITE"), equalTo("0.12345"));
}
@Test
public void bshWithResult() throws Exception {
Connection con = jdbc.getConnection();
TreatmentModel treatmentModel = new TreatmentModel();
treatmentModel.setId("traitement 2");
treatmentModel.setType(DataProcessConstants.BSH_TYPE_WITH_RESULT);
treatmentModel.setTarget("int b = 6;");
ArgList argList = buildArgsForQuery();
treatmentModel.setArguments(argList);
ExecutionListModel executionListModel = new ExecutionListModel();
AbstractTreatment abstractTreatment = TreatmentFactory
.buildTreatment(con, treatmentModel, 2, executionListModel);
assertThat(abstractTreatment.getConnection(), is(sameInstance(con)));
assertThat(abstractTreatment.getExecutionListModel(), is(sameInstance(executionListModel)));
assertThat(abstractTreatment.getRepositoryId(), equalTo(2));
assertThat(abstractTreatment.getTreatmentModel(), is(sameInstance(treatmentModel)));
DataProcessContext context = new DataProcessContext();
context.setProperty("portfolioCode", "CP2");
abstractTreatment.configure(context);
assertThat(abstractTreatment.getArgument("CODE_VALEUR"), nullValue());
assertThat(abstractTreatment.getArgument("CODE_PORTEFEUILLE"), equalTo("CP2"));
assertThat(abstractTreatment.getArgument("QUANTITE"), equalTo("0.12345"));
}
@Test
public void javaType() throws Exception {
Connection con = jdbc.getConnection();
TreatmentModel treatmentModel = new TreatmentModel();
treatmentModel.setId("traitement 3");
treatmentModel.setType(DataProcessConstants.JAVA_TYPE);
treatmentModel.setTarget(JavaTreatmentExemple.class.getName());
ArgList argList = buildArgsForQuery();
treatmentModel.setArguments(argList);
ExecutionListModel executionListModel = new ExecutionListModel();
AbstractTreatment abstractTreatment = TreatmentFactory
.buildTreatment(con, treatmentModel, 3, executionListModel);
assertThat(abstractTreatment.getConnection(), is(sameInstance(con)));
assertThat(abstractTreatment.getExecutionListModel(), is(sameInstance(executionListModel)));
assertThat(abstractTreatment.getRepositoryId(), equalTo(3));
assertThat(abstractTreatment.getTreatmentModel(), is(sameInstance(treatmentModel)));
DataProcessContext context = new DataProcessContext();
context.setProperty("portfolioCode", "CP1");
abstractTreatment.configure(context);
assertThat(abstractTreatment.getArgument("CODE_VALEUR"), nullValue());
assertThat(abstractTreatment.getArgument("CODE_PORTEFEUILLE"), equalTo("CP1"));
assertThat(abstractTreatment.getArgument("QUANTITE"), equalTo("0.12345"));
}
@Test
public void javaTypeWithResult() throws Exception {
Connection con = jdbc.getConnection();
TreatmentModel treatmentModel = new TreatmentModel();
treatmentModel.setId("traitement 4");
treatmentModel.setType(DataProcessConstants.JAVA_TYPE_WITH_RESULT);
treatmentModel.setTarget(JavaTreatmentExemple.class.getName());
ArgList argList = buildArgsForQuery();
treatmentModel.setArguments(argList);
ExecutionListModel executionListModel = new ExecutionListModel();
AbstractTreatment abstractTreatment = TreatmentFactory
.buildTreatment(con, treatmentModel, 4, executionListModel);
assertThat(abstractTreatment.getConnection(), is(sameInstance(con)));
assertThat(abstractTreatment.getExecutionListModel(), is(sameInstance(executionListModel)));
assertThat(abstractTreatment.getRepositoryId(), equalTo(4));
assertThat(abstractTreatment.getTreatmentModel(), is(sameInstance(treatmentModel)));
DataProcessContext context = new DataProcessContext();
context.setProperty("portfolioCode", "CP4");
abstractTreatment.configure(context);
assertThat(abstractTreatment.getArgument("CODE_VALEUR"), nullValue());
assertThat(abstractTreatment.getArgument("CODE_PORTEFEUILLE"), equalTo("CP4"));
assertThat(abstractTreatment.getArgument("QUANTITE"), equalTo("0.12345"));
}
@Test
public void storedProcType() throws Exception {
Connection con = jdbc.getConnection();
TreatmentModel treatmentModel = new TreatmentModel();
treatmentModel.setId("traitement 5");
treatmentModel.setType(DataProcessConstants.STORED_PROC_TYPE);
ArgList argList = buildArgsForQuery();
treatmentModel.setArguments(argList);
ExecutionListModel executionListModel = new ExecutionListModel();
AbstractTreatment abstractTreatment = TreatmentFactory
.buildTreatment(con, treatmentModel, 5, executionListModel);
assertThat(abstractTreatment.getConnection(), is(sameInstance(con)));
assertThat(abstractTreatment.getExecutionListModel(), is(sameInstance(executionListModel)));
assertThat(abstractTreatment.getRepositoryId(), equalTo(5));
assertThat(abstractTreatment.getTreatmentModel(), is(sameInstance(treatmentModel)));
assertThat(abstractTreatment.getArgument("1"), equalTo("$portfolioCode$"));
assertThat(abstractTreatment.getArgument("2"), equalTo("0.12345"));
}
@Test
public void storedProcTypeWithResult() throws Exception {
Connection con = jdbc.getConnection();
TreatmentModel treatmentModel = new TreatmentModel();
treatmentModel.setId("traitement 6");
treatmentModel.setType(DataProcessConstants.STORED_PROC_TYPE_WITH_RESULT);
ArgList argList = buildArgsForQuery();
treatmentModel.setArguments(argList);
ExecutionListModel executionListModel = new ExecutionListModel();
AbstractTreatment abstractTreatment = TreatmentFactory
.buildTreatment(con, treatmentModel, 6, executionListModel);
assertThat(abstractTreatment.getConnection(), is(sameInstance(con)));
assertThat(abstractTreatment.getExecutionListModel(), is(sameInstance(executionListModel)));
assertThat(abstractTreatment.getRepositoryId(), equalTo(6));
assertThat(abstractTreatment.getTreatmentModel(), is(sameInstance(treatmentModel)));
assertThat(abstractTreatment.getArgument("1"), equalTo("$portfolioCode$"));
assertThat(abstractTreatment.getArgument("2"), equalTo("0.12345"));
}
@Test
public void testUnknowType() throws Exception {
Connection con = jdbc.getConnection();
TreatmentModel treatmentModel = new TreatmentModel();
treatmentModel.setId("traitement 7");
treatmentModel.setType("bob");
ArgList argList = buildArgsForQuery();
treatmentModel.setArguments(argList);
ExecutionListModel executionListModel = new ExecutionListModel();
try {
TreatmentFactory.buildTreatment(con, treatmentModel, 6, executionListModel);
fail("Une exception �tait attendue !");
}
catch (TreatmentException ex) {
assertThat(ex.getLocalizedMessage(), equalTo("Type de traitement inconnu : bob"));
}
}
@Test
public void testClassNotFound() throws Exception {
Connection con = jdbc.getConnection();
TreatmentModel treatmentModel = new TreatmentModel();
treatmentModel.setId("traitement 7");
treatmentModel.setType(DataProcessConstants.JAVA_TYPE);
treatmentModel.setTarget("com.class.inexistante");
ArgList argList = buildArgsForQuery();
treatmentModel.setArguments(argList);
ExecutionListModel executionListModel = new ExecutionListModel();
try {
TreatmentFactory.buildTreatment(con, treatmentModel, 7, executionListModel);
fail("Une exception �tait attendue !");
}
catch (TreatmentException ex) {
assertThat(ex.getLocalizedMessage(), equalTo(
"La classe 'com.class.inexistante' du traitement java 'traitement 7' n'existe pas, caus�e par: com.class.inexistante"));
}
}
@Test
public void testClassNotInstanciable() throws Exception {
Connection con = jdbc.getConnection();
TreatmentModel treatmentModel = new TreatmentModel();
treatmentModel.setId("traitement 7");
treatmentModel.setType(DataProcessConstants.JAVA_TYPE);
treatmentModel.setTarget(JavaTreatmentExemple2.class.getName());
ArgList argList = buildArgsForQuery();
treatmentModel.setArguments(argList);
ExecutionListModel executionListModel = new ExecutionListModel();
try {
TreatmentFactory.buildTreatment(con, treatmentModel, 7, executionListModel);
fail("Une exception �tait attendue !");
}
catch (TreatmentException ex) {
assertThat(ex.getLocalizedMessage(), equalTo(
"Probl�me d'instanciation/accessibilit� de la classe 'net.codjo.dataprocess.server.kernel.JavaTreatmentExemple2' du traitement java 'traitement 7', caus�e par: Class net.codjo.dataprocess.server.kernel.TreatmentFactory can not access a member of class net.codjo.dataprocess.server.kernel.JavaTreatmentExemple2 with modifiers \"private\""));
}
}
@Test
public void getNotResolvableArgument() throws Exception {
Connection con = jdbc.getConnection();
TreatmentModel treatmentModel = new TreatmentModel();
treatmentModel.setId("traitement 4");
treatmentModel.setType(DataProcessConstants.JAVA_TYPE);
treatmentModel.setTarget(JavaTreatmentExemple.class.getName());
ArgList argList = buildArgsForQuery();
treatmentModel.setArguments(argList);
ExecutionListModel executionListModel = new ExecutionListModel();
AbstractTreatment abstractTreatment = TreatmentFactory
.buildTreatment(con, treatmentModel, 4, executionListModel);
DataProcessContext context = new DataProcessContext();
context.setProperty("periode", "200512");
assertThat(abstractTreatment.getArgument("CODE_VALEUR"), nullValue());
assertThat(abstractTreatment.getArgument("CODE_PORTEFEUILLE"), equalTo("$portfolioCode$"));
assertThat(abstractTreatment.getArgument("QUANTITE"), equalTo("0.12345"));
List<String> list = abstractTreatment.getNotResolvableArguments(context);
assertThat(list.contains("Le param�tre 'code' n'est pas configur�."), equalTo(true));
assertThat(list.contains("Le param�tre 'portfolioCode' n'est pas configur�."), equalTo(true));
}
private static ArgList buildArgsForQuery() {
ArgList argList = new ArgList();
List<ArgModel> list = new ArrayList<ArgModel>();
list.add(new ArgModel("CODE_PORTEFEUILLE", "$portfolioCode$", 1, Types.VARCHAR));
list.add(new ArgModel("QUANTITE", "0.12345", 2, Types.NUMERIC));
list.add(new ArgModel("CODE", "$code$", 3, Types.NUMERIC));
argList.setArgs(list);
return argList;
}
}