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() + "|");