diff --git a/org.idempiere.test/src/org/idempiere/test/base/LogicExpressionTest.java b/org.idempiere.test/src/org/idempiere/test/base/LogicExpressionTest.java index 568270d2a7..67b79379bd 100644 --- a/org.idempiere.test/src/org/idempiere/test/base/LogicExpressionTest.java +++ b/org.idempiere.test/src/org/idempiere/test/base/LogicExpressionTest.java @@ -28,7 +28,19 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import org.compiere.model.MColumn; +import org.compiere.model.MTable; +import org.compiere.model.PO; +import org.compiere.model.Query; +import org.compiere.util.DB; import org.compiere.util.Env; import org.compiere.util.Evaluatee; import org.compiere.util.LegacyLogicEvaluator; @@ -439,6 +451,47 @@ public class LogicExpressionTest extends AbstractTestCase { assertTrue(LogicEvaluator.evaluateLogic(evaluatee, expr)); } + @Test + public void testValidateAD() { + String[] columns = {"MandatoryLogic","DocValueLogic","ReadOnlyLogic","DisplayLogic","ZoomLogic"}; + Query query = new Query(Env.getCtx(), MColumn.Table_Name, "AD_Column_ID < 1000000 AND ColumnName=?", getTrxName()); + query.setOnlyActiveRecords(true); + List exceptions = new ArrayList(); + for(String column : columns) { + List list = query.setParameters(column).list(); + for(MColumn mc : list) { + MTable table = MTable.get(mc.getAD_Table_ID()); + if (!table.isActive() || table.getAD_Table_ID() >= 1000000) + continue; + StringBuilder builder = new StringBuilder(); + builder.append("SELECT * ") + .append(" FROM ") + .append(table.getTableName()) + .append(" WHERE ") + .append(mc.getColumnName()) + .append(" IS NOT NULL"); + try (PreparedStatement stmt = DB.prepareStatement(builder.toString(), getTrxName())) { + ResultSet rs = stmt.executeQuery(); + while (rs.next()) { + String expr = rs.getString(mc.getColumnName()); + if (expr.startsWith("@SQL=") || expr.startsWith("SQL=")) + continue; + try { + LogicEvaluator.validate(expr); + } catch (Exception e) { + PO po = table.getPO(rs, getTrxName()); + System.out.println(po.toString()+", " + table.getTableName()+"."+mc.getColumnName()+" = " + expr); + exceptions.add(e); + } + } + } catch (SQLException e) { + fail(e.getMessage(), e); + } + } + } + assertTrue(exceptions.isEmpty(), "Found " + exceptions.size() + " logic expression with invalid syntax in AD"); + } + private static class ContextEvaluatee implements Evaluatee { @Override