diff --git a/migration/i1.0a-release/oracle/201304181900_IDEMPIERE-851.sql b/migration/i1.0a-release/oracle/201304181900_IDEMPIERE-851.sql new file mode 100644 index 0000000000..cf1bca355f --- /dev/null +++ b/migration/i1.0a-release/oracle/201304181900_IDEMPIERE-851.sql @@ -0,0 +1,14 @@ +-- Apr 18, 2013 6:40:49 PM COT +-- IDEMPIERE-851 fitnesse improvements +UPDATE AD_Column SET IsAllowLogging='N',Updated=TO_DATE('2013-04-18 18:40:49','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=5903 +; + +-- Apr 18, 2013 6:42:14 PM COT +-- IDEMPIERE-851 fitnesse improvements +UPDATE AD_Column SET IsAllowLogging='N',Updated=TO_DATE('2013-04-18 18:42:14','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=11353 +; + + +SELECT register_migration_script('2010304181900_IDEMPIERE-851.sql') FROM dual +; + diff --git a/migration/i1.0a-release/postgresql/201304181900_IDEMPIERE-851.sql b/migration/i1.0a-release/postgresql/201304181900_IDEMPIERE-851.sql new file mode 100644 index 0000000000..e7da56f8ca --- /dev/null +++ b/migration/i1.0a-release/postgresql/201304181900_IDEMPIERE-851.sql @@ -0,0 +1,13 @@ +-- Apr 18, 2013 6:40:49 PM COT +-- IDEMPIERE-851 fitnesse improvements +UPDATE AD_Column SET IsAllowLogging='N',Updated=TO_TIMESTAMP('2013-04-18 18:40:49','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=5903 +; + +-- Apr 18, 2013 6:42:14 PM COT +-- IDEMPIERE-851 fitnesse improvements +UPDATE AD_Column SET IsAllowLogging='N',Updated=TO_TIMESTAMP('2013-04-18 18:42:14','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=11353 +; + + +SELECT register_migration_script('2010304181900_IDEMPIERE-851.sql') FROM dual +; diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/AssertRecord.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/AssertRecord.java index 4cf37ea271..9c89476c58 100644 --- a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/AssertRecord.java +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/AssertRecord.java @@ -66,7 +66,8 @@ public class AssertRecord extends TableFixture { MTable table = null; POInfo poinfo = null; boolean alreadyread = false; - String whereclause = new String(""); + StringBuilder whereclause = new StringBuilder(""); + boolean error=false; for (int i = 0; i < rows; i++) { String cell_title = getText(i, 0); String cell_value = getText(i, 1); @@ -89,8 +90,10 @@ public class AssertRecord extends TableFixture { exception(getCell(i, 1), new Exception("*Where* must be defined in second row")); return; } - whereclause = cell_value; - } else if (cell_title.equalsIgnoreCase("*Read*")) { + whereclause.append(cell_value); + } else if (cell_title.equalsIgnoreCase("*Read*") || cell_title.equalsIgnoreCase("*Read*Error*") ) + { + error= "*Read*Error*".equalsIgnoreCase(cell_title); if (! tableOK) { getCell(i, 1).addToBody("Table " + tableName + " does not exist"); wrong(i, 1); @@ -110,21 +113,45 @@ public class AssertRecord extends TableFixture { rs = pstmt.executeQuery(); if (rs.next()) { gpo = table.getPO(rs, null); + if(error){ + wrong(i,1); + return; + } + } else { getCell(i, 1).addToBody("No record found: " + sql); - wrong(i, 1); - return; + boolean value=Util.evaluateError("No record found: ",cell_value,error); + if(value){ + right(i,1); + return; + }else{ + wrong(i,1); + return; + } + } if (rs.next()) { getCell(i, 1).addToBody("More than one record found: " + sql); - wrong(i, 1); - return; + boolean value=Util.evaluateError("More than one record found: ",cell_value,error); + if(value){ + right(i,1); + return; + }else{ + wrong(i,1); + return; + } } } catch (SQLException e) - { - exception(getCell(i, 1), e); - return; + { + boolean value=Util.evaluateError(e.getMessage(),cell_value,error); + if(value){ + right(getCell(i, 1)); + return; + }else{ + exception(getCell(i, 1), e); + return; + } } finally { @@ -133,7 +160,9 @@ public class AssertRecord extends TableFixture { pstmt = null; } right(i, 1); - getCell(i, 1).addToBody(gpo.toString()); + if (gpo != null) { + getCell(i, 1).addToBody(gpo.toString()); + } alreadyread = true; } else { // columns @@ -142,30 +171,32 @@ public class AssertRecord extends TableFixture { // not read yet - add value to where clause String value_evaluated = Util.evaluate(ctx, windowNo, cell_value, getCell(i, 1)); if (whereclause.length() > 0) - whereclause = whereclause + " AND "; - whereclause = whereclause + cell_title + "=" + value_evaluated; + whereclause.append(" AND "); + whereclause.append(cell_title).append("=").append(value_evaluated); } else { // already read, compare the value of db with the context variable or formula String title_evaluated = ""; - Object result = gpo.get_Value(cell_title); - if (result != null) { - getCell(i, 0).addToBody("
" + result.toString()); - title_evaluated = result.toString(); - } - - String value_evaluated = cell_value; - if (cell_value.startsWith("@")) { - value_evaluated = Util.evaluate(ctx, windowNo, cell_value, getCell(i, 1)); - } - - if (title_evaluated.equals(value_evaluated)) { - right(i, 1); - } else { - wrong(i, 1); + if (gpo != null) { + Object result = gpo.get_Value(cell_title); + if (result != null) { + getCell(i, 0).addToBody("
" + result.toString()); + title_evaluated = result.toString(); + } + + String value_evaluated = cell_value; + if (cell_value.startsWith("@")) { + value_evaluated = Util.evaluate(ctx, windowNo,cell_value, getCell(i, 1)); + } + + if (title_evaluated.equals(value_evaluated)) { + right(i, 1); + } else { + wrong(i, 1); + } } } } - } + }//end while } // set the variables at the end // read - set context variables @@ -177,5 +208,5 @@ public class AssertRecord extends TableFixture { } } // doStaticTable - + } // AdempiereReadRecord diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/CreateRecord.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/CreateRecord.java index 2f6268d58a..a77e82e0a8 100644 --- a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/CreateRecord.java +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/CreateRecord.java @@ -64,11 +64,13 @@ public class CreateRecord extends TableFixture { String columnName = null; boolean tableOK = false; boolean columnsOK = true; + boolean error="*Save*Error*".equalsIgnoreCase(getText(rows-1, 0)); MTable table = null; POInfo poinfo = null; + for (int i = 0; i < rows; i++) { String cell_title = getText(i, 0); - String cell_value = getText(i, 1); + String cell_value = getText(i, 1); if (cell_title.equalsIgnoreCase("*Table*")) { if (i > 0) { exception(getCell(i, 1), new Exception("*Table* must be defined in first row")); @@ -78,22 +80,31 @@ public class CreateRecord extends TableFixture { // TODO : trx // TODO : verify if the record already exists table = MTable.get(ctx, tableName); - if (table == null || table.get_ID() <= 0) { - wrong(i, 1); + if (table == null || table.get_ID() <= 0) { + boolean value=Util.evaluateError("Table " + tableName + " does not exist", cell_value, error); + if(value) + right(i,1); + else + wrong(i,1); tableOK = false; } else { tableOK = true; gpo = table.getPO(0, null); } poinfo = POInfo.getPOInfo(ctx, table!=null ? table.getAD_Table_ID() : 0); - } else if (cell_title.equalsIgnoreCase("*Save*")) { + } else if (cell_title.equalsIgnoreCase("*Save*") || cell_title.equalsIgnoreCase("*Save*Error*")) { if (i != rows-1) { exception(getCell(i, 1), new Exception("*Save* must be called in last row")); return; } + if (! tableOK) { getCell(i, 1).addToBody("Table " + tableName + " does not exist"); - wrong(i, 1); + boolean value=Util.evaluateError("Table " + tableName + " does not exist", cell_value, error); + if(value) + right(i,1); + else + wrong(i,1); } else { if (columnsOK) { if (!gpo.save()) { @@ -107,9 +118,17 @@ public class CreateRecord extends TableFixture { msg.append("Error: " + vnp.getName()); } getCell(i, 1).addToBody(msg.toString()); - wrong(i, 1); + boolean value=Util.evaluateError(msg.toString(),cell_value,error); + if(value) + right(i,1); + else + wrong(i,1); } else { - right(i, 1); + if(error){ + wrong(i,1); + }else{ + right(i, 1); + } getCell(i, 1).addToBody(gpo.toString()); for (int idx = 0; idx < poinfo.getColumnCount(); idx++) { String colname = poinfo.getColumnName(idx); @@ -126,7 +145,7 @@ public class CreateRecord extends TableFixture { columnName = cell_title; int idxcol = gpo.get_ColumnIndex(columnName); if (idxcol < 0) { - wrong(i, 0); + wrong(i,1); // column does not exist in dictionary - anyways try custom column in case it exists in table gpo.set_CustomColumnReturningBoolean(columnName, cell_value); } else { @@ -175,11 +194,19 @@ public class CreateRecord extends TableFixture { try { if (!gpo.set_ValueOfColumnReturningBoolean(columnName, value)) { columnsOK = false; + boolean value1=Util.evaluateError("Cannot set value of column",cell_value,error); + if(value1) + right(getCell(i, 1)); + else exception(getCell(i, 1), new Exception("Cannot set value of column")); } } catch (Exception e) { - columnsOK = false; - exception(getCell(i, 1), e); + columnsOK = false; + boolean value1=Util.evaluateError("Cannot set value of column",cell_value,error); + if(value1) + right(getCell(i, 1)); + else + exception(getCell(i, 1), e); } } } diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/DeleteRecord.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/DeleteRecord.java new file mode 100644 index 0000000000..734a58376e --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/DeleteRecord.java @@ -0,0 +1,182 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.Properties; + +import org.compiere.model.MTable; +import org.compiere.model.PO; +import org.compiere.util.DB; +import org.idempiere.fitnesse.fixture.Instance; +import org.idempiere.fitnesse.fixture.Static_iDempiereInstance; +import org.idempiere.fitnesse.fixture.Util; + +import fitnesse.fixtures.TableFixture; + + + +/** + * @author juliana + * + */ +public class DeleteRecord extends TableFixture { + + /* (non-Javadoc) + * @see fitnesse.fixtures.TableFixture#doStaticTable(int) + */ + + private volatile static Instance adempiereInstance = null; + + + @Override + protected void doStaticTable(int rows) { + adempiereInstance = Static_iDempiereInstance.getInstance(); + + if (adempiereInstance.getAdempiereService() == null + || !adempiereInstance.getAdempiereService().isLoggedIn()) { + wrong(rows - 1, 1); + getCell(rows - 1, 1).addToBody("not logged in"); + return; + } + Properties ctx = adempiereInstance.getAdempiereService().getCtx(); + int windowNo = adempiereInstance.getAdempiereService().getWindowNo(); + + PO gpo = null; + String tableName = new String(""); + boolean tableOK = false; + MTable table = null; + + boolean alreadyread = false; + StringBuilder whereclause = new StringBuilder(""); + boolean error = false; + String msgerror=null; + + for (int i = 0; i < rows; i++) { + String cell_title = getText(i, 0); + String cell_value = getText(i, 1); + if (cell_title.equalsIgnoreCase("*Table*")) { + if (i > 0) { + exception(getCell(i, 1), new Exception("*Table* must be defined in first row")); + return; + } + tableName = cell_value; + table = MTable.get(ctx, tableName); + if (table == null || table.get_ID() <= 0) { + wrong(i, 1); + tableOK = false; + } else { + tableOK = true; + } + + } else if (cell_title.equalsIgnoreCase("*Where*")) { + if (i != 1) { + exception(getCell(i, 1), new Exception("*Where* must be defined in second row")); + return; + } + whereclause.append(cell_value); + } else if (cell_title.equalsIgnoreCase("*Delete*") || cell_title.equalsIgnoreCase("*Delete*Error*")) { + error = "*Delete*Error*".equalsIgnoreCase(cell_title); + msgerror=cell_value; + if (!tableOK) { + getCell(i, 1).addToBody("Table " + tableName + " does not exist"); + wrong(i, 1); + return; + } + if (whereclause.length() == 0) { + getCell(i, 1).addToBody("No where clause"); + wrong(i, 1); + return; + } + String sql = "SELECT * FROM " + tableName + " WHERE "+ whereclause; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + pstmt = DB.prepareStatement(sql, null); + rs = pstmt.executeQuery(); + if (rs.next()) { + gpo = table.getPO(rs, null); + } else { + getCell(i, 1).addToBody("No record found: " + sql); + boolean value = Util.evaluateError("No record found: ",cell_value, error); + if (value) { + right(i, 1); + return; + } else { + wrong(i, 1); + return; + } + + } + if (rs.next()) { + getCell(i, 1).addToBody("More than one record found: " + sql); + boolean value = Util.evaluateError("More than one record found: ", cell_value,error); + if (value) { + right(i, 1); + return; + } else { + wrong(i, 1); + return; + } + } + + if (gpo != null) { + gpo.deleteEx(true); + } + + } catch (Exception e) { + boolean value = Util.evaluateError(e.getMessage(),msgerror, error); + if (value) { + right(getCell(i, 1)); + return; + } else { + exception(getCell(i, 1), e); + return; + } + } finally { + DB.close(rs, pstmt); + rs = null; + pstmt = null; + } + right(i, 1); + alreadyread = true; + } else { + // columns + if (tableOK) { + String value_evaluated = Util.evaluate(ctx, windowNo,cell_value, getCell(i, 1)); + if (!alreadyread) { + // not read yet - add value to where clause + if (whereclause.length() > 0) + whereclause.append(" AND "); + whereclause.append(cell_title).append("=").append(value_evaluated); + } + } + } + }//end while + + } + +} diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Login.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Login.java index b99424a0ca..42e58caae1 100644 --- a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Login.java +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Login.java @@ -54,6 +54,8 @@ public class Login extends TableFixture { if (adempiereInstance == null) { adempiereInstance = Static_iDempiereInstance.getInstance(); } + boolean error="*Login*Error*".equalsIgnoreCase(getText(rows-1, 0)); + String msgerror=getText(rows-1, 1); for (int i = 0; i < rows; i++) { String cell_title = getText(i, 0); String cell_value = getText(i, 1); @@ -92,7 +94,7 @@ public class Login extends TableFixture { exception(getCell(i, 1), e); continue; } - } else if (cell_title.equalsIgnoreCase("*Login*")) { + } else if (cell_title.equalsIgnoreCase("*Login*") || cell_title.equalsIgnoreCase("*Login*Error*")) { if (i != rows-1) { exception(getCell(i, 1), new Exception("*Login* must be called in last row")); return; @@ -104,17 +106,35 @@ public class Login extends TableFixture { || m_password == null || m_password.length() == 0 || m_role_id < 0 || m_client_id < 0) { - exception(getCell(rows-1, 1), new Exception("Incomplete data to login, needed User|Password|AD_Role_ID|AD_Client_ID")); + + boolean value=Util.evaluateError("Incomplete data to login, needed User|Password|AD_Role_ID|AD_Client_ID", msgerror, error); + if(value) + right(i,1); + else + exception(getCell(rows-1, 1), new Exception("Incomplete data to login, needed User|Password|AD_Role_ID|AD_Client_ID")); } else { String msg = modelLogin(); if (msg == null || msg.length() == 0) { - MSession.get (Env.getCtx(), true); // Start Session - right(rows-1, 0); - right(rows-1, 1); + MSession.get (Env.getCtx(), true);// Start Session + if(error){ + wrong(rows-1, 0); + wrong(rows-1, 1); + }else{ + right(rows-1, 0); + right(rows-1, 1); + } } else { - wrong(rows-1, 0); - exception(getCell(rows-1, 1), new Exception(msg)); + + boolean value=Util.evaluateError(msg, msgerror, error); + if(value){ + right(rows-1, 0); + } + else{ + wrong(rows-1, 0); + exception(getCell(rows-1, 1), new Exception(msg)); + } + } } diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/ReadRecord.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/ReadRecord.java index 7f5dd615ce..9f6cb3d36a 100644 --- a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/ReadRecord.java +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/ReadRecord.java @@ -67,6 +67,7 @@ public class ReadRecord extends TableFixture { POInfo poinfo = null; boolean alreadyread = false; String whereclause = new String(""); + boolean error=false; for (int i = 0; i < rows; i++) { String cell_title = getText(i, 0); String cell_value = getText(i, 1); @@ -88,14 +89,15 @@ public class ReadRecord extends TableFixture { if (i != 1) { exception(getCell(i, 1), new Exception("*Where* must be defined in second row")); return; - } + } whereclause = cell_value; - } else if (cell_title.equalsIgnoreCase("*Read*")) { + } else if (cell_title.equalsIgnoreCase("*Read*") || cell_title.equalsIgnoreCase("*Read*Error*")) { if (! tableOK) { getCell(i, 1).addToBody("Table " + tableName + " does not exist"); wrong(i, 1); return; } + error="*Read*Error*".equalsIgnoreCase(cell_title); if (whereclause.length() == 0) { getCell(i, 1).addToBody("No where clause"); wrong(i, 1); @@ -110,21 +112,42 @@ public class ReadRecord extends TableFixture { rs = pstmt.executeQuery(); if (rs.next()) { gpo = table.getPO(rs, null); + if(error){ + wrong(i,1); + } } else { getCell(i, 1).addToBody("No record found: " + sql); - wrong(i, 1); - return; + boolean value=Util.evaluateError("No record found: ",cell_value,error); + if(value){ + right(i,1); + return; + }else{ + wrong(i,1); + return; + } } if (rs.next()) { getCell(i, 1).addToBody("More than one record found: " + sql); - wrong(i, 1); - return; + boolean value=Util.evaluateError("More than one record found: ",cell_value,error); + if(value){ + right(i,1); + return; + }else{ + wrong(i,1); + return; + } } } catch (SQLException e) { - exception(getCell(i, 1), e); - return; + boolean value=Util.evaluateError(e.getMessage(),cell_value,error); + if(value){ + right(getCell(i, 1)); + return; + }else{ + exception(getCell(i, 1), e); + return; + } } finally { @@ -133,7 +156,9 @@ public class ReadRecord extends TableFixture { pstmt = null; } right(i, 1); - getCell(i, 1).addToBody(gpo.toString()); + if (gpo != null) { + getCell(i, 1).addToBody(gpo.toString()); + } // read - set context variables for (int idx = 0; idx < poinfo.getColumnCount(); idx++) { String colname = poinfo.getColumnName(idx); @@ -153,9 +178,11 @@ public class ReadRecord extends TableFixture { whereclause = whereclause + cell_title + "=" + value_evaluated; } else { // already read, show the value of context variable - Object result = gpo.get_Value(cell_title); - if (result != null) - getCell(i, 1).addToBody(result.toString()); + if (gpo != null) { + Object result = gpo.get_Value(cell_title); + if (result != null) + getCell(i, 1).addToBody(result.toString()); + } } } } diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/RunProcess.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/RunProcess.java index da2b2567fd..7fe5239453 100644 --- a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/RunProcess.java +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/RunProcess.java @@ -83,6 +83,8 @@ public class RunProcess extends TableFixture { HashMap fmap = new HashMap(); int recordID = 0; String docAction = null; + boolean error="*Run*Error*".equalsIgnoreCase(getText(rows-1, 0)); + String msgerror1=getText(rows-1, 1); for (int i = 0; i < rows; i++) { String cell_title = getText(i, 0); String cell_value = getText(i, 1); @@ -93,9 +95,14 @@ public class RunProcess extends TableFixture { } String processValue = cell_value; int processID = MProcess.getProcess_ID(processValue, null); - if (processID <= 0) { - exception(getCell(i, 1), new Exception("Process with Value=" + processValue + " doesn't exist")); - return; + if (processID <= 0 ) { + boolean value=Util.evaluateError(msgerror1,"Process with Value=" + processValue + " doesn't exist", error); + if(value){ + right(getCell(i, 1)); + }else{ + exception(getCell(i, 1), new Exception("Process with Value=" + processValue + " doesn't exist")); + return; + } } process = new MProcess(ctx, processID, null); } else if (cell_title.equalsIgnoreCase("*ProcessID*")) { @@ -106,10 +113,15 @@ public class RunProcess extends TableFixture { int processID = getInt(i, 1); process = new MProcess(ctx, processID, null); if (process == null || process.get_ID() <= 0) { - exception(getCell(i, 1), new Exception("Process with ID=" + processID + " doesn't exist")); - return; + boolean value=Util.evaluateError(msgerror1,"Process with ID=" + processID + " doesn't exist", error); + if(value){ + right(getCell(i, 1)); + }else{ + exception(getCell(i, 1), new Exception("Process with ID=" + processID + " doesn't exist")); + return; + } } - } else if (cell_title.equalsIgnoreCase("*Run*")) { + } else if (cell_title.equalsIgnoreCase("*Run*") || cell_title.equalsIgnoreCase("*Run*Error*") ) { if (i != rows-1) { exception(getCell(i, 1), new Exception("*Run* must be called in last row")); return; @@ -118,8 +130,14 @@ public class RunProcess extends TableFixture { pInstance = new MPInstance (process, 0); MPInstancePara[] iParams = pInstance.getParameters(); String errorMsg = setParams(process, iParams, fmap); - if (errorMsg != null) - exception(getCell(i, 1), new Exception(errorMsg)); + if (errorMsg != null){ + boolean value=Util.evaluateError(msgerror1,errorMsg, error); + if(value){ + + }else{ + exception(getCell(i, 1), new Exception(errorMsg)); + } + } if (recordID > 0) pInstance.setRecord_ID( recordID); pInstance.saveEx(); @@ -141,6 +159,7 @@ public class RunProcess extends TableFixture { po.set_ValueOfColumn("DocAction", docAction); po.saveEx(); } + } } } @@ -157,6 +176,7 @@ public class RunProcess extends TableFixture { // Start if (process.isWorkflow()) { + boolean value=Util.evaluateError(msgerror1,pi.getSummary(), error); try { int AD_Workflow_ID = process.getAD_Workflow_ID(); @@ -166,12 +186,43 @@ public class RunProcess extends TableFixture { { getCell(i, 1).addToBody(Msg.parseTranslation(ctx, pi.getSummary())); addLogInfo(pInstance, i); - right(getCell(i, 1)); + + if (wf.getWorkflowType().equals(MWorkflow.WORKFLOWTYPE_DocumentProcess)) { + MTable table = MTable.get(ctx, wf.getAD_Table_ID()); + if (table != null) { + PO po = table.getPO(recordID, null); + if(!docAction.equals(po.get_Value("DocStatus"))){ + if(value){ + right(getCell(i, 1)); + }else{ + wrong(getCell(i, 1)); + } + } + else { + if (value) { + right(getCell(i, 1)); + } else { + wrong(getCell(i, 1)); + } + } + } + } + else{ + if(value){ + right(getCell(i, 1)); + }else{ + wrong(getCell(i, 1)); + } + } } } catch(Exception ex) { - exception(getCell(i, 1), ex); + if(value){ + right(getCell(i, 1)); + }else{ + exception(getCell(i, 1), ex); + } } //started = wfProcess != null; } @@ -192,14 +243,24 @@ public class RunProcess extends TableFixture { } if (!processOK || pi.isError()) { - exception(getCell(i, 1), new Exception(pi.getSummary())); - processOK = false; + boolean value=Util.evaluateError(msgerror1,pi.getSummary(), error); + if(value){ + right(getCell(i, 1)); + processOK = true; + }else{ + exception(getCell(i, 1), new Exception(pi.getSummary())); + processOK = false; + } } else { - getCell(i, 1).addToBody(Msg.parseTranslation(ctx, pi.getSummary())); - addLogInfo(pInstance, i); - right(getCell(i, 1)); + if(error){ + wrong(getCell(i, 1)); + }else{ + getCell(i, 1).addToBody(Msg.parseTranslation(ctx, pi.getSummary())); + addLogInfo(pInstance, i); + right(getCell(i, 1)); + } } } diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/UpdateRecord.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/UpdateRecord.java new file mode 100644 index 0000000000..b3a492d847 --- /dev/null +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/UpdateRecord.java @@ -0,0 +1,200 @@ +/********************************************************************** +* This file is part of Adempiere ERP Bazaar * +* http://www.adempiere.org * +* * +* * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +***********************************************************************/ + +package org.idempiere.fitnesse.fixture; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Properties; + +import org.compiere.model.MTable; +import org.compiere.model.PO; +import org.compiere.util.DB; + +import fitnesse.fixtures.TableFixture; + +/** + * + * iDempiere Update Record fixture for use with fitnesse framework testing + * @author juliana + * + */ +public class UpdateRecord extends TableFixture { + + /* (non-Javadoc) + * @see fitnesse.fixtures.TableFixture#doStaticTable(int) + */ + + private volatile static Instance adempiereInstance = null; + + @Override + protected void doStaticTable(int rows) { + + if (adempiereInstance == null) { + adempiereInstance = Static_iDempiereInstance.getInstance(); + } + if (adempiereInstance.getAdempiereService() == null + || !adempiereInstance.getAdempiereService().isLoggedIn()) { + wrong(rows - 1, 1); + getCell(rows - 1, 1).addToBody("not logged in"); + return; + } + Properties ctx = adempiereInstance.getAdempiereService().getCtx(); + int windowNo = adempiereInstance.getAdempiereService().getWindowNo(); + + PO gpo = null; + String tableName = new String(""); + boolean tableOK = false; + MTable table = null; + + boolean alreadyread = false; + StringBuilder whereclause = new StringBuilder(""); + boolean error = false; + String msgerror=null; + for (int i = 0; i < rows; i++) { + String cell_title = getText(i, 0); + String cell_value = getText(i, 1); + if (cell_title.equalsIgnoreCase("*Table*")) { + if (i > 0) { + exception(getCell(i, 1), new Exception("*Table* must be defined in first row")); + return; + } + tableName = cell_value; + table = MTable.get(ctx, tableName); + if (table == null || table.get_ID() <= 0) { + wrong(i, 1); + tableOK = false; + } else { + tableOK = true; + } + + } else if (cell_title.equalsIgnoreCase("*Where*")) { + if (i != 1) { + exception(getCell(i, 1), new Exception("*Where* must be defined in second row")); + return; + } + whereclause.append(cell_value); + } else if (cell_title.equalsIgnoreCase("*Update*") || cell_title.equalsIgnoreCase("*Update*Error*")) { + error = "*Update*Error*".equalsIgnoreCase(cell_title); + msgerror=cell_value; + if (!tableOK) { + getCell(i, 1).addToBody("Table " + tableName + " does not exist"); + wrong(i, 1); + return; + } + if (whereclause.length() == 0) { + getCell(i, 1).addToBody("No where clause"); + wrong(i, 1); + return; + } + String sql = "SELECT * FROM " + tableName + " WHERE "+ whereclause; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + pstmt = DB.prepareStatement(sql, null); + rs = pstmt.executeQuery(); + if (rs.next()) { + gpo = table.getPO(rs, null); + } else { + getCell(i, 1).addToBody("No record found: " + sql); + boolean value = Util.evaluateError("No record found: ",cell_value, error); + if (value) { + right(i, 1); + return; + } else { + wrong(i, 1); + return; + } + + } + if (rs.next()) { + getCell(i, 1).addToBody("More than one record found: " + sql); + boolean value = Util.evaluateError("More than one record found: ", cell_value,error); + if (value) { + right(i, 1); + return; + } else { + wrong(i, 1); + return; + } + } + } catch (SQLException e) { + boolean value = Util.evaluateError(e.getMessage(),cell_value, error); + if (value) { + right(getCell(i, 1)); + return; + } else { + exception(getCell(i, 1), e); + return; + } + } finally { + DB.close(rs, pstmt); + rs = null; + pstmt = null; + } + right(i, 1); + if (gpo != null) { + getCell(i, 1).addToBody(gpo.toString()); + } + alreadyread = true; + } else { + // columns + if (tableOK) { + String value_evaluated = Util.evaluate(ctx, windowNo,cell_value, getCell(i, 1)); + if (!alreadyread) { + // not read yet - add value to where clause + if (whereclause.length() > 0) + whereclause.append(" AND "); + whereclause.append(cell_title).append("=").append(value_evaluated); + } else { + if(gpo != null){ + if(gpo.set_ValueOfColumnReturningBoolean(cell_title, cell_value)){ + if(error){ + wrong(getCell(i, 1)); + }else{ + right(getCell(i, 1)); + + } + } + + try { + gpo.saveEx(); + } catch (Exception e) { + boolean value = Util.evaluateError(e.getMessage(),msgerror, error); + if (value) + right(getCell(i, 1)); + else + exception(getCell(i, 1),e); + } + + } + } + } + } + }//end while + + } + +} diff --git a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Util.java b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Util.java index c3712c5d76..f92082b156 100644 --- a/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Util.java +++ b/org.idempiere.fitnesse.fixture/src/org/idempiere/fitnesse/fixture/Util.java @@ -250,4 +250,30 @@ public class Util { return evaluate(ctx, windowNo, expr, null); } + + public static boolean evaluateError(String error, String cell,boolean isError) { + boolean evaluate = false; + + if(error == null) + error=""; + if (cell == null) + cell=""; + + if (isError) { + if (cell.length() > 0) { + if (error.contains(cell)) { + evaluate = true; + } else { + evaluate = false; + } + + } else { + evaluate = true; + } + } else { + evaluate = false; + } + return evaluate; + } + } // AdempiereUtil diff --git a/org.idempiere.fitrecorder/src/org/idempiere/fitrecorder/FitRecorder.java b/org.idempiere.fitrecorder/src/org/idempiere/fitrecorder/FitRecorder.java index 1de13aa38a..04d8564227 100644 --- a/org.idempiere.fitrecorder/src/org/idempiere/fitrecorder/FitRecorder.java +++ b/org.idempiere.fitrecorder/src/org/idempiere/fitrecorder/FitRecorder.java @@ -183,7 +183,7 @@ public class FitRecorder implements ModelValidator { // Ignore records created within a workflow process if (po.get_TrxName().startsWith("WFP_")) return null; - + writeFile("\n"); writeFile("\n"); writeFile("CREATE RECORD"); @@ -205,8 +205,7 @@ public class FitRecorder implements ModelValidator { || colName.equals("AD_Client_ID") || colName.equals(table.getTableName() + "_ID") || colName.equals(PO.getUUIDColumnName(table.getTableName())) - || column.getAD_Reference_ID() == DisplayType.Button - ) + || column.getAD_Reference_ID() == DisplayType.Button) continue; if (po.isActive() && colName.equals("IsActive")) continue; @@ -228,10 +227,11 @@ public class FitRecorder implements ModelValidator { writeFile("\n"); } - - if (po instanceof MPInstance) { - if (type == TYPE_AFTER_CHANGE) { - + + if(type == TYPE_AFTER_CHANGE) + { + if (po instanceof MPInstance) + { MProcess pro = MProcess.get(Env.getCtx(), po.get_ValueAsInt("AD_Process_ID")); MPInstance pint = (MPInstance)po; writeFile("\n"); @@ -294,18 +294,160 @@ public class FitRecorder implements ModelValidator { writeFile("|*Run*|"); writeFile("\n"); - } - } - - if (po instanceof MSession) { - if (type == TYPE_AFTER_CHANGE) { + }else if(po instanceof MSession) + { MSession session = (MSession) po; if (session.isProcessed()) { closefile(); } + } else { + + if (dontLogTables.contains(po.get_TableName().toUpperCase())) + return null; + + // Ignore records created within a process + if (po.get_TrxName().startsWith("SvrProcess_")) + return null; + + // Ignore records created within a workflow process + if (po.get_TrxName().startsWith("WFP_")) + return null; + + MTable table = MTable.get(Env.getCtx(), po.get_Table_ID()); + + MColumn[] columns = table.getColumns(true); + StringBuilder where = new StringBuilder(); + StringBuilder set = new StringBuilder(); + boolean key=false; + for (int i = 0; i < columns.length; i++) + { + MColumn column = columns[i]; + String colName = column.getColumnName(); + String value=null; + if (DisplayType.isLookup(column.getAD_Reference_ID()) && DisplayType.List != column.getAD_Reference_ID()) { + value = resolveValue(po, table, column); + }else{ + value=po.get_ValueAsString(colName); + } + if (column.isAllowLogging()) + { + if (column.isKey()) + { + if (!key) { + where.append("| *Where* | "); + where.append(colName + " = " + value+ " | "); + key=true; + } else { + where.append(" | " + colName + " | "); + where.append(value + " | "); + } + } + if (po.is_ValueChanged(colName)) { + if (colName.equals("Created") + || colName.equals("CreatedBy") + || colName.equals("Updated") + || colName.equals("UpdatedBy") + || colName.equals("AD_Client_ID") + || colName.equals(table.getTableName()+ "_ID") + || colName.equals(PO.getUUIDColumnName(table.getTableName())) + || column.getAD_Reference_ID() == DisplayType.Button) + continue; + + if (po.isActive() && colName.equals("IsActive")) + continue; + + if (value != null && value.length() > 0) { + set.append("\n"); + set.append("| " + colName + " | "); + set.append(value + "|"); + } + + } + } + + }// end while columns + + if (where.length() > 0 && set.length() > 0) { + writeFile("\n"); + writeFile("\n"); + writeFile("UPDATE RECORD"); + writeFile("\n"); + writeFile("!"); + writeFile("| Update Record |"); + writeFile("\n"); + writeFile("| *Table* | "); + writeFile(po.get_TableName() + " |"); + writeFile("\n"); + writeFile(where.toString()); + writeFile("\n"); + writeFile("| *Update* |"); + writeFile(set.toString()); + } } + } + + if(type == TYPE_AFTER_DELETE) + { + if (dontLogTables.contains(po.get_TableName().toUpperCase())) + return null; + + // Ignore records created within a process + if (po.get_TrxName().startsWith("SvrProcess_")) + return null; + + // Ignore records created within a workflow process + if (po.get_TrxName().startsWith("WFP_")) + return null; + + writeFile("\n"); + writeFile("\n"); + writeFile("DELETE RECORD"); + writeFile("\n"); + writeFile("!"); + writeFile("| Delete Record |"); + writeFile("\n"); + writeFile("| *Table* | "); + writeFile(po.get_TableName() + " |"); + writeFile("\n"); + + MTable table = MTable.get(Env.getCtx(), po.get_Table_ID()); + MColumn[] columns = table.getColumns(true); + boolean key=false; + + for (int i = 0; i < columns.length; i++) + { + MColumn column = columns[i]; + String colName = column.getColumnName(); + String value=null; + if (DisplayType.isLookup(column.getAD_Reference_ID()) && DisplayType.List != column.getAD_Reference_ID()) { + value = resolveValue(po, table, column); + }else{ + value=po.get_ValueAsString(colName); + } + + if (column.isAllowLogging()) + { + if (column.isKey()) + { + if (!key) { + writeFile("| *Where* | "); + writeFile(colName + " = " + value+ " | "); + key=true; + } else { + writeFile(" | " + colName + " | "); + writeFile(value + " | "); + } + } + } + }//while columns + + writeFile("\n"); + writeFile("| *Delete* |"); + } + } catch (Exception e) { + if (log.isLoggable(Level.INFO)) log.info(e.getLocalizedMessage()); return e.getLocalizedMessage(); } return null; @@ -375,7 +517,7 @@ public class FitRecorder implements ModelValidator { } else { value = po.get_ValueAsString(column.getColumnName()); } - + return value; } @@ -401,7 +543,7 @@ public class FitRecorder implements ModelValidator { if (action.equals("CO")) { // run process String processValue = DB.getSQLValueString(po.get_TrxName(), - "SELECT p.Value FROM AD_Process p JOIN AD_Workflow w ON (p.AD_Workflow_ID=w.AD_Workflow_ID) WHERE w.AD_Table_ID=?", po.get_Table_ID()); + "SELECT p.Value FROM AD_Process p JOIN AD_Workflow w ON (p.AD_Workflow_ID=w.AD_Workflow_ID) WHERE w.AD_Table_ID=?", po.get_Table_ID()); writeFile("RUN PROCESS"); writeFile("\n"); writeFile("!"); @@ -498,8 +640,7 @@ public class FitRecorder implements ModelValidator { writeFile("|Login|"); writeFile("\n"); writeFile("|User|"); - if (MSysConfig.getBooleanValue(MSysConfig.USE_EMAIL_FOR_LOGIN, - false)) + if (MSysConfig.getBooleanValue(MSysConfig.USE_EMAIL_FOR_LOGIN,false)) writeFile(user.getEMail() + "|"); else if (user.getLDAPUser() != null) writeFile(user.getLDAPUser() + "|");