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.TreatmentModel; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import java.text.ParseException; import java.text.SimpleDateFormat; 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 BshScriptTreatmentTest { private JdbcFixture fixture; @Before public void before() throws Exception { fixture = new DatabaseFactory().createJdbcFixture(); fixture.doSetUp(); } @After public void after() { fixture.doTearDown(); } @Test public void basic() throws Exception { String code = "RESULT = Integer.toString(5 * 2);"; DataProcessContext context = new DataProcessContext(); AbstractTreatment abstractTreatment = createTreatment(code, context); Object result = abstractTreatment.proceedTreatment(context); assertThat(result.toString(), equalTo("10")); } @Test public void treatmentException() { String code = "import net.codjo.dataprocess.common.exception.TreatmentException;"; code = code + " \n throw new TreatmentException(\"BAD\")"; DataProcessContext context = new DataProcessContext(); try { AbstractTreatment abstractTreatment = createTreatment(code, context); abstractTreatment.proceedTreatment(context); fail("Ce script Bean Shell aurait d� provoquer un TreatmentException !"); } catch (Exception e) { assertThat("BAD", equalTo(e.getMessage())); } } @Test public void exception() { String code = "import net.codjo.dataprocess.common.exception.TreatmentException;"; code = code + " \n throw new IllegalArgumentException(\"BAD\")"; DataProcessContext context = new DataProcessContext(); try { AbstractTreatment abstractTreatment = createTreatment(code, context); abstractTreatment.proceedTreatment(context); fail("Ce script Bean Shell aurait d� provoquer un TreatmentException !"); } catch (Exception e) { assertThat(e.getCause() instanceof IllegalArgumentException, equalTo(true)); assertThat( "Erreur ligne 2 --> throw new IllegalArgumentException ( \"BAD\" ) ; \nSourced file: inline evaluation of: ``import net.codjo.dataprocess.common.exception.TreatmentException; throw new Il . . . '' : TargetError", equalTo(e.getMessage())); assertThat("BAD", equalTo(e.getCause().getMessage())); } } @Test public void errorInCode() { String code = "RESULT = Integer.toStrin(5 * 2);"; DataProcessContext context = new DataProcessContext(); try { AbstractTreatment abstractTreatment = createTreatment(code, context); abstractTreatment.proceedTreatment(context); fail("Ce script Bean Shell aurait d� provoquer une erreur !"); } catch (Exception e) { assertThat("L'ex�cution du script Bean Shell a �chou� !\n", equalTo(e.getMessage())); assertThat("Sourced file: inline evaluation of: ``RESULT = Integer.toStrin(5 * 2);'' : " + "Error in method invocation: Static method toStrin( int ) not found in class'java.lang.Integer'", equalTo(e.getCause().getMessage())); } } @Test public void getArgument() throws Exception { DataProcessContext context = new DataProcessContext(); context.setProperty("portfolioCode", "MIMI"); String code = "String tiret=\"-\";\n"; code = code + "RESULT = tiret + treatment.getArgument(\"CODE_PORTEFEUILLE\") + tiret"; AbstractTreatment abstractTreatment = createTreatment(code, context); Object result = abstractTreatment.proceedTreatment(context); assertThat(result.toString(), equalTo("-MIMI-")); } @Test public void getConnection() throws Exception { DataProcessContext context = new DataProcessContext(); String code = "import java.sql.*;\n" + "\n" + "ResultSet rs = treatment.getConnection().createStatement().executeQuery(\"select getdate()\");\n" + "try {\n" + "rs.next();\n" + "RESULT = rs.getString(1).substring(0, 10);" + "}\n" + "finally {\n" + "rs.close();\n" + "}"; AbstractTreatment abstractTreatment = createTreatment(code, context); Object result = abstractTreatment.proceedTreatment(context); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { simpleDateFormat.parse(result.toString()); } catch (ParseException e) { fail("Une exception �tait attendue !"); } assertThat(result.toString(), equalTo(getDate())); } private AbstractTreatment createTreatment(String code, DataProcessContext context) throws TreatmentException { TreatmentModel treatmentModel = new TreatmentModel(); treatmentModel.setTarget(code); treatmentModel.setType(DataProcessConstants.BSH_TYPE); treatmentModel.setArguments(buildArgsForQuery()); treatmentModel.setId("traitementTest"); AbstractTreatment abstractTreatment = TreatmentFactory.buildTreatment(fixture.getConnection(), treatmentModel, 0, null); abstractTreatment.configure(context); return abstractTreatment; } 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)); argList.setArgs(list); return argList; } private String getDate() throws SQLException { Statement stmt = fixture.getConnection().createStatement(); ResultSet rs = stmt.executeQuery("select getdate()"); try { rs.next(); return rs.getString(1).substring(0, 10); } finally { rs.close(); stmt.close(); } } }