package net.codjo.dataprocess.server.dao; import net.codjo.database.common.api.JdbcFixture; import net.codjo.datagen.DatagenFixture; import net.codjo.dataprocess.common.DataProcessConstants; import net.codjo.dataprocess.common.codec.TreatmentModelCodec; import net.codjo.dataprocess.common.exception.TreatmentException; import net.codjo.dataprocess.common.model.ExecutionListModel; import net.codjo.dataprocess.common.model.TreatmentModel; import net.codjo.dataprocess.common.model.UserTreatment; import net.codjo.dataprocess.common.util.XMLUtils; import net.codjo.dataprocess.server.handlerhelper.TreatmentHandlerHelper; import net.codjo.dataprocess.server.repository.Repository; import net.codjo.dataprocess.server.util.SQLUtil; import net.codjo.dataprocess.server.util.TestUtils; import net.codjo.test.common.fixture.CompositeFixture; import net.codjo.tokio.TokioFixture; import net.codjo.util.file.FileUtil; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import static net.codjo.dataprocess.common.DataProcessConstants.Command.COPY; import static net.codjo.dataprocess.common.DataProcessConstants.Command.CREATE; import static net.codjo.dataprocess.common.DataProcessConstants.Command.DELETE; import static net.codjo.dataprocess.common.DataProcessConstants.Command.IS_EXIST; import static net.codjo.dataprocess.common.DataProcessConstants.Command.READ; import static net.codjo.dataprocess.common.DataProcessConstants.Command.UPDATE; import static net.codjo.test.common.matcher.JUnitMatchers.*; /** * */ public class TreatmentDaoTest { private TreatmentDao treatmentDao = new TreatmentDao(); private static final TokioFixture TOKIO = new TokioFixture(TreatmentDaoTest.class); private static final DatagenFixture DATAGEN = new DatagenFixture(TreatmentDaoTest.class); private static final CompositeFixture COMPOSITE_FIXTURE = new CompositeFixture(TOKIO, DATAGEN); @BeforeClass public static void beforeClass() throws Exception { COMPOSITE_FIXTURE.doSetUp(); try { JdbcFixture jdbcFixture = TOKIO.getJdbcFixture(); jdbcFixture.advanced().dropAllObjects(); DATAGEN.generate(); TestUtils.initScript(jdbcFixture, DATAGEN, "T_TRANSFER.tab"); TestUtils.initScript(jdbcFixture, DATAGEN, "PM_DP_CONTEXT.tab"); TestUtils.initScript(jdbcFixture, DATAGEN, "PM_REPOSITORY.tab"); TestUtils.initScript(jdbcFixture, DATAGEN, "PM_REPOSITORY_CONTENT.tab"); TestUtils.initScript(jdbcFixture, DATAGEN, "PM_FAMILY.tab"); TestUtils.initScript(jdbcFixture, DATAGEN, "PM_EXECUTION_LIST.tab"); TestUtils.initScript(jdbcFixture, DATAGEN, "PM_TREATMENT.tab"); TestUtils.initScript(jdbcFixture, DATAGEN, "PM_EXECUTION_LIST_STATUS.tab"); TestUtils.initScript(jdbcFixture, DATAGEN, "PM_TREATMENT_STATUS.tab"); TestUtils.initScript(jdbcFixture, DATAGEN, "PM_DEPENDENCY.tab"); } catch (Exception e) { COMPOSITE_FIXTURE.doTearDown(); fail(e.getLocalizedMessage()); } } @AfterClass public static void afterClass() throws Exception { COMPOSITE_FIXTURE.doTearDown(); } @Test public void load() throws Exception { // �talon List<ExecutionListModel> expectedList = new ArrayList<ExecutionListModel>(); expectedList.add(buildModel(1, "liste1", 1, 0)); expectedList.add(buildModel(2, "liste2", 2, 1)); UserTreatment usrTrt = expectedList.get(1).getPriorityMap().keySet().iterator().next(); expectedList.get(1).getPriorityMap().remove(usrTrt); TOKIO.insertInputInDb("LOAD"); Repository.reinitializeRepositoryCache(); initRepository(1, "TreatmentTest.xml"); List<ExecutionListModel> resList = treatmentDao.getExecutionListModel(TOKIO.getConnection(), 1, 1); assertThat(expectedList.size(), equalTo(resList.size())); verifyResult(resList, expectedList); } @Test public void getExecutionListModel() throws Exception { TOKIO.insertInputInDb("LOAD"); Repository.reinitializeRepositoryCache(); initRepository(1, "TreatmentTest.xml"); ExecutionListModel execListModel = treatmentDao.getExecutionListModel(TOKIO.getConnection(), "liste1", 1, 1); assertThat(execListModel.getName(), equalTo("liste1")); execListModel = treatmentDao.getExecutionListModel(TOKIO.getConnection(), "liste2", 1, 1); assertThat(execListModel.getName(), equalTo("liste2")); try { execListModel = treatmentDao.getExecutionListModel(TOKIO.getConnection(), "liste4", 1, 1); assertThat(execListModel.getName(), equalTo("liste4")); fail("Le test aurait d� �chou�."); } catch (Exception ex) { assertThat(ex.getLocalizedMessage(), equalTo("Liste de traitements 'liste4' non trouv�e (repository id = 1, family id = 1)")); } } private static void initRepository(int repositoryId, String fileName) throws Exception { String content = loadFileAsString(fileName); TOKIO.executeQuery("delete PM_REPOSITORY_CONTENT"); String sql = "insert into PM_REPOSITORY_CONTENT (REPOSITORY_CONTENT_ID, REPOSITORY_ID, TREATMENT_ID, CONTENT)" + " values (?, ?, ?, ?)"; final Document doc = XMLUtils.parse(content); NodeList nodes = doc.getElementsByTagName(DataProcessConstants.TREATMENT_ENTITY_XML); Connection con = TOKIO.getConnection(); PreparedStatement pStmt = con.prepareStatement(sql); try { for (int i = 0; i < nodes.getLength(); i++) { Node node = nodes.item(i); String treatmentId = node.getAttributes().getNamedItem("id").getNodeValue(); String nodeValue = XMLUtils.nodeToString(node); pStmt.setInt(1, SQLUtil.getNextId(con, "PM_REPOSITORY_CONTENT", "REPOSITORY_CONTENT_ID")); pStmt.setInt(2, repositoryId); pStmt.setString(3, treatmentId); pStmt.setString(4, nodeValue); pStmt.executeUpdate(); } } finally { pStmt.close(); } sql = "delete PM_REPOSITORY insert into PM_REPOSITORY (REPOSITORY_ID) values (?)"; pStmt = con.prepareStatement(sql); try { pStmt.setInt(1, repositoryId); pStmt.executeUpdate(); } finally { pStmt.close(); } } @Test public void save() throws Exception { List<ExecutionListModel> trtList = new ArrayList<ExecutionListModel>(); trtList.add(buildModel(10, "liste1", 1, 45)); trtList.add(buildModel(20, "liste2", 2, 95)); Map<UserTreatment, Integer> prioMap = trtList.get(1).getPriorityMap(); UserTreatment toBeRemove = null; for (UserTreatment userTreatment : prioMap.keySet()) { toBeRemove = userTreatment; if ((toBeRemove.getPriority() == 3) && ("TRAITEMENT_3".equals(toBeRemove.getId()))) { break; } } prioMap.remove(toBeRemove); TOKIO.insertInputInDb("SAVE"); treatmentDao.save(TOKIO.getConnection(), trtList, 1, 0); TOKIO.assertAllOutputs("SAVE"); } @Test public void manageTreatmentModel() throws Exception { String treatmentContent1 = "<treatment id=\"CexportSharesByCompany\" type=\"sql\" scope=\"CONTROL\">\n" + " <target>[$][@] delete TC_CSCOP_TITRESGPFO[$][@] insert into TC_CSCOP_TITRESGPFO[$][@] (CODE_VALEUR,[$][@] LIBELLE_VALEUR,[$][@] CATEGORIE_VALEUR)[$][@] values ('RIEN','1;AG;AG;100;'+left(?,4)+';'+right(?,2),'RIEN')[$][@][$][@] insert into TC_CSCOP_TITRESGPFO[$][@] (CODE_VALEUR,[$][@] LIBELLE_VALEUR,[$][@] CATEGORIE_VALEUR)[$][@] select 'RIEN','2;20;'[$][@] + CODE_ENTITE_SAP_CIE +';'[$][@] + CODE_ENTITE_SAP_PTF +';'[$][@] + convert(varchar(25), convert(numeric(24),VARIATION_QUANTITE))[$][@] +';0;0;0;0;'[$][@] + case when (VARIATION_QUANTITE > 0) then[$][@] convert(varchar(25),convert(numeric(24),VARIATION_QUANTITE))[$][@] else '0' end +';'[$][@] + case when (VARIATION_QUANTITE < 0) then[$][@] convert(varchar(25),convert(numeric(24),VARIATION_QUANTITE))[$][@] else '0' end +';0'[$][@] ,'RIEN'[$][@] from EXPORT_BO_SPLIT[$][@] where EXPORT_BO_SPLIT.PERIODE = ?[$][@] and CODE_ENTITE_SAP_CIE = ?[$][@] and CODE_PORTEFEUILLE = 'SHARE'[$][@] order by CODE_ENTITE_SAP_CIE,CODE_ENTITE_SAP_PTF DESC[$][@] </target>\n" + " <arguments>\n" + " <arg name=\"periode\" position=\"1\" type=\"12\" value=\"$periode$\"/>\n" + " <arg name=\"periode\" position=\"2\" type=\"12\" value=\"$periode$\"/>\n" + " <arg name=\"periode\" position=\"3\" type=\"12\" value=\"$periode$\"/>\n" + " <arg name=\"company\" position=\"4\" type=\"12\" value=\"$company$\"/>\n" + " </arguments>\n" + " <comment></comment>\n" + " <title>Export par compagnie</title>\n" + " <result-table>TC_CSCOP_TITRESGPFO</result-table>\n" + "</treatment>"; String treatmentContent2 = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" + "<treatment id=\"C60TreatmentHistoriseRapprochement\" scope=\"TREATMENT\" type=\"java\">" + "<comment>Insertion dans l'historique des rapprochements</comment>" + "<title>C60.TreatmentHistoriseRapprochement</title>" + "<target>net.codjo.creo.server.dataprocess.treatment.c60.C60TreatmentHistoriseRapprochement</target>" + "<result-table/>" + "<arguments/>" + "</treatment>"; String treatmentContentUpdate = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" + "<treatment id=\"C60TreatmentHistoriseRapprochement\" scope=\"TREATMENT\" type=\"java\">" + "<comment>pomme pomme pomme pomme !</comment>" + "<title>C60.TreatmentHistoriseRapprochement</title>" + "<target>net.codjo.creo.server.dataprocess.treatment.c60.C60TreatmentHistoriseRapprochement</target>" + "<result-table/>" + "<arguments>" + "<arg position=\"1\" type=\"12\" name=\"datecourante\" value=\"$datecourante$\"/>" + "<arg position=\"2\" type=\"12\" name=\"datecourante\" value=\"$datecourante$\"/>" + "</arguments>" + "</treatment>"; Connection con = TOKIO.getConnection(); deleteTables(con); assertThat(DataProcessConstants.NO_RESULT, equalTo(treatmentDao.manageTreatmentModel(con, CREATE, 1, treatmentContent1))); assertThat(DataProcessConstants.NO_RESULT, equalTo(treatmentDao.manageTreatmentModel(con, CREATE, 1, treatmentContent2))); try { assertThat(DataProcessConstants.NO_RESULT, equalTo(treatmentDao.manageTreatmentModel(con, UPDATE, 2, treatmentContentUpdate))); fail("Le test devrait �chouer : le traitement est inexistant dans ce repository"); } catch (TreatmentException ex) { assertThat( "\n'C60TreatmentHistoriseRapprochement' est inexistant dans le repository (repositoryId = 2)", equalTo(ex.getMessage())); } assertThat(DataProcessConstants.NO_RESULT, equalTo(treatmentDao.manageTreatmentModel(con, UPDATE, 1, treatmentContentUpdate))); String xmlContent = treatmentDao.manageTreatmentModel(con, READ, 1, treatmentContentUpdate); TreatmentModel treatmentModel = TreatmentModelCodec.decode(xmlContent); assertThat("pomme pomme pomme pomme !", equalTo(treatmentModel.getComment())); assertThat(2, equalTo(treatmentModel.getArguments().getArgs().size())); assertThat(DataProcessConstants.NO_RESULT, equalTo(treatmentDao.manageTreatmentModel(con, DELETE, 1, treatmentContentUpdate))); try { assertThat(DataProcessConstants.NO_RESULT, equalTo(treatmentDao.manageTreatmentModel(con, DELETE, 1, treatmentContentUpdate))); fail("Le test devrait �chouer : le traitement devrait d�j� �tre supprim�."); } catch (TreatmentException ex) { assertThat( "\n'C60TreatmentHistoriseRapprochement' est inexistant dans le repository (repositoryId = 1)", equalTo(ex.getMessage())); } xmlContent = treatmentDao.manageTreatmentModel(con, READ, 1, treatmentContent1); treatmentModel = TreatmentModelCodec.decode(xmlContent); assertThat(treatmentModel.getTarget(), equalTo("delete TC_CSCOP_TITRESGPFO\n" + " insert into TC_CSCOP_TITRESGPFO\n" + " (CODE_VALEUR,\n" + " LIBELLE_VALEUR,\n" + " CATEGORIE_VALEUR)\n" + " values ('RIEN','1;AG;AG;100;'+left(?,4)+';'+right(?,2),'RIEN')\n" + "\n" + " insert into TC_CSCOP_TITRESGPFO\n" + " (CODE_VALEUR,\n" + " LIBELLE_VALEUR,\n" + " CATEGORIE_VALEUR)\n" + " select 'RIEN','2;20;'\n" + " + CODE_ENTITE_SAP_CIE +';'\n" + " + CODE_ENTITE_SAP_PTF +';'\n" + " + convert(varchar(25), convert(numeric(24),VARIATION_QUANTITE))\n" + " +';0;0;0;0;'\n" + " + case when (VARIATION_QUANTITE > 0) then\n" + " convert(varchar(25),convert(numeric(24),VARIATION_QUANTITE))\n" + " else '0' end +';'\n" + " + case when (VARIATION_QUANTITE < 0) then\n" + " convert(varchar(25),convert(numeric(24),VARIATION_QUANTITE))\n" + " else '0' end +';0'\n" + " ,'RIEN'\n" + " from EXPORT_BO_SPLIT\n" + " where EXPORT_BO_SPLIT.PERIODE = ?\n" + " and CODE_ENTITE_SAP_CIE = ?\n" + " and CODE_PORTEFEUILLE = 'SHARE'\n" + " order by CODE_ENTITE_SAP_CIE,CODE_ENTITE_SAP_PTF DESC")); assertThat(Boolean.valueOf(treatmentDao.manageTreatmentModel(con, IS_EXIST, 1, treatmentContent1)), equalTo(true)); assertThat(Boolean.valueOf(treatmentDao.manageTreatmentModel(con, IS_EXIST, 1, treatmentContentUpdate)), equalTo(false)); assertThat(DataProcessConstants.NO_RESULT, equalTo(treatmentDao.manageTreatmentModel(con, CREATE, 1, treatmentContent2))); treatmentDao.manageTreatmentModel(con, COPY, 1, "3"); assertThat(Boolean.valueOf(treatmentDao.manageTreatmentModel(con, IS_EXIST, 3, treatmentContent1)), equalTo(true)); assertThat(Boolean.valueOf(treatmentDao.manageTreatmentModel(con, IS_EXIST, 3, treatmentContent2)), equalTo(true)); } @Test public void deleteTreatmentModel() throws Exception { String treatmentContentAa = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" + "<treatment id=\"traitement_aa\" scope=\"TREATMENT\" type=\"java\">" + "<comment>traitement_aa traitement_aa traitement_aa</comment>" + "<title>Mon traitement aa</title>" + "<target>net.codjo.creo.server.dataprocess.treatment.c60.traitement_aa</target>" + "<result-table/>" + "<arguments>" + "<arg position=\"1\" type=\"12\" name=\"datecourante\" value=\"$datecourante$\"/>" + "<arg position=\"2\" type=\"12\" name=\"datecourante\" value=\"$datecourante$\"/>" + "</arguments>" + "</treatment>"; String treatmentContentCc = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" + "<treatment id=\"traitement_cc\" scope=\"TREATMENT\" type=\"java\">" + "<comment>traitement_cc traitement_cc traitement_cc</comment>" + "<title>Mon traitement cc</title>" + "<target>net.codjo.creo.server.dataprocess.treatment.c60.traitement_cc</target>" + "<result-table/>" + "<arguments>" + "<arg position=\"1\" type=\"12\" name=\"datecourante\" value=\"$datecourante$\"/>" + "<arg position=\"2\" type=\"12\" name=\"datecourante\" value=\"$datecourante$\"/>" + "</arguments>" + "</treatment>"; String treatmentContentDd = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" + "<treatment id=\"traitement_dd\" scope=\"TREATMENT\" type=\"java\">" + "<comment>traitement_cc traitement_cc traitement_cc</comment>" + "<title>Mon traitement cc</title>" + "<target>net.codjo.creo.server.dataprocess.treatment.c60.traitement_cc</target>" + "<result-table/>" + "<arguments>" + "<arg position=\"1\" type=\"12\" name=\"datecourante\" value=\"$datecourante$\"/>" + "<arg position=\"2\" type=\"12\" name=\"datecourante\" value=\"$datecourante$\"/>" + "</arguments>" + "</treatment>"; TOKIO.insertInputInDb("delete_treatmentModel"); try { TreatmentHandlerHelper.manageTreatmentModel(TOKIO.getConnection(), DataProcessConstants.Command.DELETE, 1, treatmentContentAa); fail("Ce test devrait echou� car le traitement 'traitement_aa' est utilis� dans des listes de traitement!"); } catch (TreatmentException ex) { assertThat(ex.getLocalizedMessage(), equalTo("\n" + "Le traitement 'traitement_aa' est utilis� dans des listes de traitement : 'ma_list_3','ma_list_4'.\n" + "Sa suppression est donc impossible.")); } TreatmentHandlerHelper.manageTreatmentModel(TOKIO.getConnection(), DataProcessConstants.Command.DELETE, 1, treatmentContentCc); try { TreatmentHandlerHelper.manageTreatmentModel(TOKIO.getConnection(), DataProcessConstants.Command.DELETE, 1, treatmentContentDd); fail("Ce test devrait �chou� car le traitement 'traitement_dd' est inexistant"); } catch (TreatmentException ex) { assertThat(ex.getLocalizedMessage(), equalTo("\n" + "'traitement_dd' est inexistant dans le repository (repositoryId = 1)")); } TOKIO.assertAllOutputs("delete_treatmentModel"); } private static void deleteTables(Connection con) throws SQLException { con.createStatement().executeUpdate("delete PM_REPOSITORY delete PM_REPOSITORY_CONTENT " + "delete PM_EXECUTION_LIST delete PM_EXECUTION_LIST_STATUS " + "delete PM_TREATMENT_STATUS delete PM_TREATMENT"); } private static void verifyResult(List<ExecutionListModel> result, List<ExecutionListModel> expected) { for (int i = 0; i < result.size(); i++) { ExecutionListModel trtExpected = expected.get(i); ExecutionListModel trtResult = result.get(i); assertThat(trtExpected.getName(), equalTo(trtResult.getName())); Map resMap = trtResult.getPriorityMap(); Map expectedMap = trtExpected.getPriorityMap(); assertThat(expectedMap.size(), equalTo(resMap.size())); } } private static ExecutionListModel buildModel(int id, String name, int priority, int status) { ExecutionListModel trtMod = new ExecutionListModel(); trtMod.setId(id); trtMod.setName(name); trtMod.setPriority(priority); trtMod.setStatus(status); Map<UserTreatment, Integer> userTreatmentMap = buildTreatmentMap(); trtMod.setPriorityMap(userTreatmentMap); return trtMod; } private static Map<UserTreatment, Integer> buildTreatmentMap() { Map<UserTreatment, Integer> userTreatmentMap = new HashMap<UserTreatment, Integer>(); TreatmentModel treatmentModel = new TreatmentModel(); treatmentModel.setId("TRAITEMENT_1"); treatmentModel.setTitle("comment1"); UserTreatment usrTrt = new UserTreatment(treatmentModel); usrTrt.setPriority(0); userTreatmentMap.put(usrTrt, 0); treatmentModel = new TreatmentModel(); treatmentModel.setId("TRAITEMENT_2"); treatmentModel.setTitle("comment2"); usrTrt = new UserTreatment(treatmentModel); usrTrt.setPriority(2); userTreatmentMap.put(usrTrt, 1); treatmentModel = new TreatmentModel(); treatmentModel.setId("TRAITEMENT_3"); treatmentModel.setTitle("comment3"); usrTrt = new UserTreatment(treatmentModel); usrTrt.setPriority(3); userTreatmentMap.put(usrTrt, 2); return userTreatmentMap; } private static String loadFileAsString(String fileName) throws IOException { String localPath = TreatmentDaoTest.class.getResource(fileName).getPath(); return FileUtil.loadContent(new File(localPath)); } }