You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by na...@apache.org on 2016/12/22 12:53:34 UTC

incubator-fineract git commit: Integration test cases for Entity-Datatable Check

Repository: incubator-fineract
Updated Branches:
  refs/heads/develop 9cc60c9b7 -> c8cedfc70


Integration test cases for Entity-Datatable Check


Project: http://git-wip-us.apache.org/repos/asf/incubator-fineract/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-fineract/commit/c8cedfc7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-fineract/tree/c8cedfc7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-fineract/diff/c8cedfc7

Branch: refs/heads/develop
Commit: c8cedfc70d3ecc18d1efd24798280ecfcd198233
Parents: 9cc60c9
Author: Satish <sa...@confluxtechnologies.com>
Authored: Tue Dec 20 16:53:31 2016 +0530
Committer: Satish <sa...@confluxtechnologies.com>
Committed: Tue Dec 20 16:53:31 2016 +0530

----------------------------------------------------------------------
 .../integrationtests/common/ClientHelper.java   |  58 ++-
 .../integrationtests/common/GroupHelper.java    |  54 ++
 .../loans/LoanApplicationTestBuilder.java       |   9 +
 .../common/loans/LoanTransactionHelper.java     |  22 +
 .../EntityDatatableChecksHelper.java            |  68 +++
 .../EntityDatatableChecksIntegrationTest.java   | 509 +++++++++++++++++++
 .../common/savings/SavingsAccountHelper.java    |  38 ++
 .../savings/SavingsApplicationTestBuilder.java  |  30 +-
 .../common/system/DatatableHelper.java          | 101 ++++
 9 files changed, 870 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/c8cedfc7/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/ClientHelper.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/ClientHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/ClientHelper.java
index ec6ea52..e79820b 100755
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/ClientHelper.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/ClientHelper.java
@@ -22,8 +22,8 @@ import static org.junit.Assert.assertEquals;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 
-import org.apache.fineract.infrastructure.codes.domain.CodeValue;
 import org.apache.fineract.integrationtests.common.system.CodeHelper;
 
 import com.google.gson.Gson;
@@ -53,7 +53,7 @@ public class ClientHelper {
     public static final String TRANSACTION_DATE = "01 March 2013";
     public static final String LAST_TRANSACTION_DATE = "01 March 2013";
     public static final String DATE_FORMAT = "dd MMMM yyyy";
-    
+    public static final String DATE_TIME_FORMAT = "dd MMMM yyyy HH:mm";
 
     public ClientHelper(final RequestSpecification requestSpec, final ResponseSpecification responseSpec) {
         this.requestSpec = requestSpec;
@@ -93,9 +93,20 @@ public class ClientHelper {
         return Utils.performServerPost(requestSpec, responseSpec, CREATE_CLIENT_URL, getTestClientAsJSONPending(submittedOnDate, officeId),
                 "clientId");
     }
-   
-    
-    
+
+    public Object createClientPendingWithError(final String jsonAttributeToGetBack) {
+        System.out.println("---------------------------------CREATING A CLIENT IN PENDING WITH ERROR---------------------------------------------");
+        return Utils.performServerPost(this.requestSpec, this.responseSpec, CREATE_CLIENT_URL,
+                getTestClientAsJSONPending("04 March 2014", "1"), jsonAttributeToGetBack);
+    }
+
+    public static Integer createClientPendingWithDatatable(final RequestSpecification requestSpec,
+            final ResponseSpecification responseSpec, final String registeredTableName) {
+        System.out.println("-------------------------- CREATING A CLIENT IN PENDING WITH DATATABLES --------------------------------");
+        return Utils.performServerPost(requestSpec, responseSpec, CREATE_CLIENT_URL,
+                getTestPendingClientWithDatatableAsJson(registeredTableName), "clientId");
+    }
+
     public static Integer createClientAsPerson(final RequestSpecification requestSpec, final ResponseSpecification responseSpec) {
         return createClientAsPerson(requestSpec, responseSpec, "04 March 2011");
     }
@@ -184,10 +195,39 @@ public class ClientHelper {
 		System.out.println("map : " + map);
 		return new Gson().toJson(map);
     }
-    
-    
-    
-    
+
+    public static String getTestPendingClientWithDatatableAsJson(final String registeredTableName) {
+        final HashMap<String, Object> map = new HashMap<>();
+        map.put("officeId", "1");
+        map.put("firstname", Utils.randomNameGenerator("Client_FirstName_", 5));
+        map.put("lastname", Utils.randomNameGenerator("Client_LastName_", 4));
+        map.put("externalId", randomIDGenerator("ID_", 7));
+        map.put("dateFormat", DATE_FORMAT);
+        map.put("locale", "en");
+        map.put("active", "false");
+        map.put("submittedOnDate", "04 March 2014");
+        String requestJson = getTestDatatableAsJson(map, registeredTableName);
+        System.out.println("map : " + requestJson);
+        return requestJson;
+    }
+
+    public static String getTestDatatableAsJson(HashMap<String, Object> map, final String registeredTableName) {
+        List<HashMap<String, Object>> datatablesListMap = new ArrayList<>();
+        HashMap<String, Object> datatableMap = new HashMap<>();
+        HashMap<String, Object> dataMap = new HashMap<>();
+        dataMap.put("locale", "en");
+        dataMap.put("Spouse Name", Utils.randomNameGenerator("Spouse_name", 4));
+        dataMap.put("Number of Dependents", 5);
+        dataMap.put("Time of Visit", "01 December 2016 04:03");
+        dataMap.put("dateFormat", DATE_TIME_FORMAT);
+        dataMap.put("Date of Approval", "02 December 2016 00:00");
+        datatableMap.put("registeredTableName", registeredTableName);
+        datatableMap.put("data", dataMap);
+        datatablesListMap.add(datatableMap);
+        map.put("datatables", datatablesListMap);
+        return new Gson().toJson(map);
+    }
+
     public static String getTestPersonClientAsJSON(final String dateOfJoining, final String officeId) {
         final HashMap<String, Object> map = new HashMap<>();
         map.put("officeId", officeId);

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/c8cedfc7/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/GroupHelper.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/GroupHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/GroupHelper.java
index f8a3af0..ab2a9eb 100755
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/GroupHelper.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/GroupHelper.java
@@ -34,7 +34,17 @@ import com.jayway.restassured.specification.ResponseSpecification;
 
 public class GroupHelper {
 
+    private final RequestSpecification requestSpec;
+    private final ResponseSpecification responseSpec;
+
     private static final String CREATE_GROUP_URL = "/fineract-provider/api/v1/groups?" + Utils.TENANT_IDENTIFIER;
+    public static final String DATE_FORMAT = "dd MMMM yyyy";
+    public static final String DATE_TIME_FORMAT = "dd MMMM yyyy HH:mm";
+
+    public GroupHelper(final RequestSpecification requestSpec, final ResponseSpecification responseSpec) {
+        this.requestSpec = requestSpec;
+        this.responseSpec = responseSpec;
+    }
 
     public static Integer createGroup(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
             @SuppressWarnings("unused") final boolean active) {
@@ -53,6 +63,19 @@ public class GroupHelper {
         return Utils.performServerPost(requestSpec, responseSpec, CREATE_GROUP_URL, getTestGroupAsJSON(false, ""), "groupId");
     }
 
+    public Object createGroupWithError(final String jsonAttributeToGetBack) {
+        System.out.println("---------------------------------CREATING A GROUP WITH ERROR---------------------------------------------");
+        return Utils.performServerPost(this.requestSpec, this.responseSpec, CREATE_GROUP_URL, getTestGroupAsJSON(false, ""),
+                jsonAttributeToGetBack);
+    }
+
+    public static Integer createGroupPendingWithDatatable(final RequestSpecification requestSpec,
+            final ResponseSpecification responseSpec, final String registeredTableName) {
+        System.out.println("-------------------------- CREATING A GROUP WITH DATATABLES --------------------------------");
+        return Utils.performServerPost(requestSpec, responseSpec, CREATE_GROUP_URL,
+                getTestGroupWithDatatableAsJson(registeredTableName), "groupId");
+    }
+
     public static Integer associateClient(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
             final String groupId, final String clientMember) {
         final String GROUP_ASSOCIATE_URL = "/fineract-provider/api/v1/groups/" + groupId
@@ -227,4 +250,35 @@ public class GroupHelper {
     private static String randomIDGenerator(final String prefix, final int lenOfRandomSuffix) {
         return Utils.randomStringGenerator(prefix, lenOfRandomSuffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
     }
+
+    public static String getTestGroupWithDatatableAsJson(final String registeredTableName) {
+        final HashMap<String, Object> map = new HashMap<>();
+        map.put("officeId", "1");
+        map.put("name", randomNameGenerator("Group_Name_", 5));
+        map.put("externalId", randomIDGenerator("ID_", 7));
+        map.put("dateFormat", "dd MMMM yyyy");
+        map.put("locale", "en");
+        map.put("active", "false");
+        map.put("submittedOnDate", "04 March 2011");
+        String requestJson = getTestDatatableAsJson(map, registeredTableName);
+        System.out.println("map : " + requestJson);
+        return requestJson;
+    }
+
+    public static String getTestDatatableAsJson(HashMap<String, Object> map, final String registeredTableName) {
+        List<HashMap<String, Object>> datatablesListMap = new ArrayList<>();
+        HashMap<String, Object> datatableMap = new HashMap<>();
+        HashMap<String, Object> dataMap = new HashMap<>();
+        dataMap.put("locale", "en");
+        dataMap.put("Spouse Name", Utils.randomNameGenerator("Spouse_name", 4));
+        dataMap.put("Number of Dependents", 5);
+        dataMap.put("Time of Visit", "01 December 2016 04:03");
+        dataMap.put("dateFormat", DATE_TIME_FORMAT);
+        dataMap.put("Date of Approval", "02 December 2016 00:00");
+        datatableMap.put("registeredTableName", registeredTableName);
+        datatableMap.put("data", dataMap);
+        datatablesListMap.add(datatableMap);
+        map.put("datatables", datatablesListMap);
+        return new Gson().toJson(map);
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/c8cedfc7/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanApplicationTestBuilder.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanApplicationTestBuilder.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanApplicationTestBuilder.java
index 50d9cc9..e51b2ca 100644
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanApplicationTestBuilder.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanApplicationTestBuilder.java
@@ -65,6 +65,7 @@ public class LoanApplicationTestBuilder {
 
     private String calendarId;
     private boolean syncDisbursementWithMeeting = false;
+    private List<HashMap<String, Object>> datatables = null;
 
     public String build(final String clientID, final String groupID, final String loanProductId, final String savingsID) {
         final HashMap<String, Object> map = new HashMap<>();
@@ -134,6 +135,9 @@ public class LoanApplicationTestBuilder {
 
         }
 
+        if (datatables != null) {
+            map.put("datatables", this.datatables);
+        }
         System.out.println("Loan Application request : " + map);
         return new Gson().toJson(map);
     }
@@ -311,4 +315,9 @@ public class LoanApplicationTestBuilder {
         this.fixedEmiAmount = installmentAmount;
         return this;
     }
+
+    public LoanApplicationTestBuilder withDatatables(final List<HashMap<String, Object>> datatables) {
+        this.datatables = datatables;
+        return this;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/c8cedfc7/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
index 65cf2b6..57fc343 100755
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/loans/LoanTransactionHelper.java
@@ -55,6 +55,8 @@ public class LoanTransactionHelper {
     private static final String MAKE_REFUND_BY_CASH_COMMAND = "refundByCash";
     private static final String FORECLOSURE_COMMAND = "foreclosure";
 
+    public static final String DATE_TIME_FORMAT = "dd MMMM yyyy HH:mm";
+
     public LoanTransactionHelper(final RequestSpecification requestSpec, final ResponseSpecification responseSpec) {
         this.requestSpec = requestSpec;
         this.responseSpec = responseSpec;
@@ -68,6 +70,10 @@ public class LoanTransactionHelper {
         return Utils.performServerPost(this.requestSpec, this.responseSpec, APPLY_LOAN_URL, loanApplicationJSON, "loanId");
     }
 
+    public Object getLoanError(final String loanApplicationJSON, final String responseAttribute) {
+        return Utils.performServerPost(this.requestSpec, this.responseSpec, APPLY_LOAN_URL, loanApplicationJSON, responseAttribute);
+    }
+
     public Integer getLoanOfficerId(final String loanId) {
         final String GET_LOAN_URL = "/fineract-provider/api/v1/loans/" + loanId + "?" + Utils.TENANT_IDENTIFIER;
         return Utils.performServerGet(this.requestSpec, this.responseSpec, GET_LOAN_URL, "loanOfficerId");
@@ -672,4 +678,20 @@ public class LoanTransactionHelper {
         System.out.println(json);
         return json;
     }
+
+    public static List<HashMap<String, Object>> getTestDatatableAsJson(final String registeredTableName) {
+        List<HashMap<String, Object>> datatablesListMap = new ArrayList<>();
+        HashMap<String, Object> datatableMap = new HashMap<>();
+        HashMap<String, Object> dataMap = new HashMap<>();
+        dataMap.put("locale", "en");
+        dataMap.put("Spouse Name", Utils.randomNameGenerator("Spouse_name", 4));
+        dataMap.put("Number of Dependents", 5);
+        dataMap.put("Time of Visit", "01 December 2016 04:03");
+        dataMap.put("dateFormat", DATE_TIME_FORMAT);
+        dataMap.put("Date of Approval", "02 December 2016 00:00");
+        datatableMap.put("registeredTableName", registeredTableName);
+        datatableMap.put("data", dataMap);
+        datatablesListMap.add(datatableMap);
+        return datatablesListMap;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/c8cedfc7/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksHelper.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksHelper.java
new file mode 100644
index 0000000..80d774a
--- /dev/null
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksHelper.java
@@ -0,0 +1,68 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.integrationtests.common.organisation;
+
+import java.util.HashMap;
+
+import org.apache.fineract.integrationtests.common.Utils;
+
+import com.google.gson.Gson;
+import com.jayway.restassured.specification.RequestSpecification;
+import com.jayway.restassured.specification.ResponseSpecification;
+
+public class EntityDatatableChecksHelper {
+
+    private final RequestSpecification requestSpec;
+    private final ResponseSpecification responseSpec;
+
+    private static final String DATATABLE_CHECK_URL = "/fineract-provider/api/v1/entityDatatableChecks";
+
+    public EntityDatatableChecksHelper(final RequestSpecification requestSpec, final ResponseSpecification responseSpec) {
+        this.requestSpec = requestSpec;
+        this.responseSpec = responseSpec;
+    }
+
+    public Integer createEntityDatatableCheck(final String apptableName, final String datatableName, final int status, final Integer productId) {
+        return Utils.performServerPost(this.requestSpec, this.responseSpec, DATATABLE_CHECK_URL + "?" + Utils.TENANT_IDENTIFIER,
+                getTestEdcAsJSON(apptableName, datatableName, status, productId), "resourceId");
+    }
+
+    public Integer deleteEntityDatatableCheck(final Integer entityDatatableCheckId) {
+        return Utils.performServerDelete(requestSpec, responseSpec, DATATABLE_CHECK_URL + "/" + entityDatatableCheckId + "?"
+                + Utils.TENANT_IDENTIFIER, "resourceId");
+    }
+
+    public String retrieveEntityDatatableCheck() {
+        return Utils.performServerGet(requestSpec, responseSpec, DATATABLE_CHECK_URL + "?" + Utils.TENANT_IDENTIFIER, null);
+    }
+
+    public static String getTestEdcAsJSON(final String apptableName, final String datatableName, final int status, final Integer productId) {
+        final HashMap<String, Object> map = new HashMap<>();
+        map.put("entity", apptableName);
+        map.put("status", status);
+        map.put("datatableName", datatableName);
+        if (productId != null) {
+            map.put("productId", productId);
+        }
+        String requestJsonString = new Gson().toJson(map);
+        System.out.println("map : " + requestJsonString);
+        return requestJsonString;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/c8cedfc7/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksIntegrationTest.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksIntegrationTest.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksIntegrationTest.java
new file mode 100644
index 0000000..cb17289
--- /dev/null
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksIntegrationTest.java
@@ -0,0 +1,509 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.integrationtests.common.organisation;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.fineract.integrationtests.common.ClientHelper;
+import org.apache.fineract.integrationtests.common.CommonConstants;
+import org.apache.fineract.integrationtests.common.GroupHelper;
+import org.apache.fineract.integrationtests.common.Utils;
+import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder;
+import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder;
+import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper;
+import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper;
+import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper;
+import org.apache.fineract.integrationtests.common.system.DatatableHelper;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.jayway.restassured.builder.RequestSpecBuilder;
+import com.jayway.restassured.builder.ResponseSpecBuilder;
+import com.jayway.restassured.http.ContentType;
+import com.jayway.restassured.specification.RequestSpecification;
+import com.jayway.restassured.specification.ResponseSpecification;
+
+/**
+ * Entity Datatable Checks Integration Test for checking Creation, Deletion and
+ * Retrieval of Entity-Datatable Check
+ */
+
+public class EntityDatatableChecksIntegrationTest {
+
+    private RequestSpecification requestSpec;
+    private ResponseSpecification responseSpec;
+    private EntityDatatableChecksHelper entityDatatableChecksHelper;
+    private DatatableHelper datatableHelper;
+    private SavingsAccountHelper savingsAccountHelper;
+    private LoanTransactionHelper loanTransactionHelper;
+    private LoanTransactionHelper validationErrorHelper;
+
+    private static final String CLIENT_APP_TABLE_NAME = "m_client";
+    private static final String GROUP_APP_TABLE_NAME = "m_group";
+    private static final String SAVINGS_APP_TABLE_NAME = "m_savings_account";
+    private static final String LOAN_APP_TABLE_NAME = "m_loan";
+
+    public static final String MINIMUM_OPENING_BALANCE = "1000.0";
+    public static final String ACCOUNT_TYPE_INDIVIDUAL = "INDIVIDUAL";
+
+    public static final String DATE_TIME_FORMAT = "dd MMMM yyyy HH:mm";
+
+    public EntityDatatableChecksIntegrationTest() {
+        // TODO Auto-generated constructor stub
+    }
+
+    @Before
+    public void setup() {
+        Utils.initializeRESTAssured();
+        this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
+        this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
+        this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build();
+        this.entityDatatableChecksHelper = new EntityDatatableChecksHelper(this.requestSpec, this.responseSpec);
+        this.datatableHelper = new DatatableHelper(this.requestSpec, this.responseSpec);
+    }
+
+    @Test
+    public void validateCreateDeleteEntityDatatableCheck() {
+        // creating datatable
+        String datatableName = this.datatableHelper.createDatatable(CLIENT_APP_TABLE_NAME, false);
+        DatatableHelper.verifyDatatableCreatedOnServer(this.requestSpec, this.responseSpec, datatableName);
+
+        // creating new entity datatable check
+        Integer entityDatatableCheckId = this.entityDatatableChecksHelper.createEntityDatatableCheck(CLIENT_APP_TABLE_NAME, datatableName,
+                100, null);
+        assertNotNull("ERROR IN CREATING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // deleting entity datatable check
+        entityDatatableCheckId = this.entityDatatableChecksHelper.deleteEntityDatatableCheck(entityDatatableCheckId);
+        assertNotNull("ERROR IN DELETING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // deleting the datatable
+        String deletedDataTableName = this.datatableHelper.deleteDatatable(datatableName);
+        assertEquals("ERROR IN DELETING THE DATATABLE", datatableName, deletedDataTableName);
+    }
+
+    @Test
+    public void validateRetriveEntityDatatableChecksList() {
+        // retrieving entity datatable check
+        String entityDatatableChecksList = this.entityDatatableChecksHelper.retrieveEntityDatatableCheck();
+        assertNotNull("ERROR IN RETRIEVING THE ENTITY DATATABLE CHECKS", entityDatatableChecksList);
+    }
+
+    @Test
+    public void validateCreateClientWithEntityDatatableCheck() {
+
+        // creating datatable
+        String registeredTableName = this.datatableHelper.createDatatable(CLIENT_APP_TABLE_NAME, false);
+        DatatableHelper.verifyDatatableCreatedOnServer(this.requestSpec, this.responseSpec, registeredTableName);
+
+        // creating new entity datatable check
+        Integer entityDatatableCheckId = this.entityDatatableChecksHelper.createEntityDatatableCheck(CLIENT_APP_TABLE_NAME,
+                registeredTableName, 100, null);
+        assertNotNull("ERROR IN CREATING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // creating client with datatables
+        final Integer clientID = ClientHelper.createClientPendingWithDatatable(requestSpec, responseSpec, registeredTableName);
+        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);
+
+        // deleting entity datatable check
+        entityDatatableCheckId = this.entityDatatableChecksHelper.deleteEntityDatatableCheck(entityDatatableCheckId);
+        assertNotNull("ERROR IN DELETING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // deleting datatable entries
+        Integer appTableId = this.datatableHelper.deleteDatatableEntries(registeredTableName, clientID, "clientId");
+        assertEquals("ERROR IN DELETING THE DATATABLE ENTRIES", clientID, appTableId);
+
+        // deleting the datatable
+        String deletedDataTableName = this.datatableHelper.deleteDatatable(registeredTableName);
+        assertEquals("ERROR IN DELETING THE DATATABLE", registeredTableName, deletedDataTableName);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void validateCreateClientWithEntityDatatableCheckWithFailure() {
+        // building error response with status code 403
+        final ResponseSpecification errorResponse = new ResponseSpecBuilder().expectStatusCode(403).build();
+        final ClientHelper validationErrorHelper = new ClientHelper(this.requestSpec, errorResponse);
+
+        // creating datatable
+        String registeredTableName = this.datatableHelper.createDatatable(CLIENT_APP_TABLE_NAME, false);
+        DatatableHelper.verifyDatatableCreatedOnServer(this.requestSpec, this.responseSpec, registeredTableName);
+
+        // creating new entity datatable check
+        Integer entityDatatableCheckId = this.entityDatatableChecksHelper.createEntityDatatableCheck(CLIENT_APP_TABLE_NAME,
+                registeredTableName, 100, null);
+        assertNotNull("ERROR IN CREATING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // creating client with datatables with error
+        ArrayList<HashMap<Object, Object>> clientErrorData = (ArrayList<HashMap<Object, Object>>) validationErrorHelper
+                .createClientPendingWithError(CommonConstants.RESPONSE_ERROR);
+        assertEquals("error.msg.entry.required.in.datatable.[" + registeredTableName + "]",
+                clientErrorData.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE));
+
+        // deleting entity datatable check
+        entityDatatableCheckId = this.entityDatatableChecksHelper.deleteEntityDatatableCheck(entityDatatableCheckId);
+        assertNotNull("ERROR IN DELETING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // deleting the datatable
+        String deletedDataTableName = this.datatableHelper.deleteDatatable(registeredTableName);
+        assertEquals("ERROR IN DELETING THE DATATABLE", registeredTableName, deletedDataTableName);
+    }
+
+    @Test
+    public void validateCreateGroupWithEntityDatatableCheck() {
+
+        // creating datatable
+        String registeredTableName = this.datatableHelper.createDatatable(GROUP_APP_TABLE_NAME, false);
+        DatatableHelper.verifyDatatableCreatedOnServer(this.requestSpec, this.responseSpec, registeredTableName);
+
+        // creating new entity datatable check
+        Integer entityDatatableCheckId = this.entityDatatableChecksHelper.createEntityDatatableCheck(GROUP_APP_TABLE_NAME,
+                registeredTableName, 100, null);
+        assertNotNull("ERROR IN CREATING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // creating group with datatables
+        final Integer groupId = GroupHelper.createGroupPendingWithDatatable(this.requestSpec, this.responseSpec, registeredTableName);
+        GroupHelper.verifyGroupCreatedOnServer(this.requestSpec, this.responseSpec, groupId);
+
+        // deleting entity datatable check
+        entityDatatableCheckId = this.entityDatatableChecksHelper.deleteEntityDatatableCheck(entityDatatableCheckId);
+        assertNotNull("ERROR IN DELETING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // deleting datatable entries
+        Integer appTableId = this.datatableHelper.deleteDatatableEntries(registeredTableName, groupId, "groupId");
+        assertEquals("ERROR IN DELETING THE DATATABLE ENTRIES", groupId, appTableId);
+
+        // deleting the datatable
+        String deletedDataTableName = this.datatableHelper.deleteDatatable(registeredTableName);
+        assertEquals("ERROR IN DELETING THE DATATABLE", registeredTableName, deletedDataTableName);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void validateCreateGroupWithEntityDatatableCheckWithFailure() {
+        // building error response with status code 403
+        final ResponseSpecification errorResponse = new ResponseSpecBuilder().expectStatusCode(403).build();
+        final GroupHelper validationErrorHelper = new GroupHelper(this.requestSpec, errorResponse);
+
+        // creating datatable
+        String registeredTableName = this.datatableHelper.createDatatable(GROUP_APP_TABLE_NAME, false);
+        DatatableHelper.verifyDatatableCreatedOnServer(this.requestSpec, this.responseSpec, registeredTableName);
+
+        // creating new entity datatable check
+        Integer entityDatatableCheckId = this.entityDatatableChecksHelper.createEntityDatatableCheck(GROUP_APP_TABLE_NAME,
+                registeredTableName, 100, null);
+        assertNotNull("ERROR IN CREATING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // creating group with datatables with error
+        ArrayList<HashMap<Object, Object>> groupErrorData = (ArrayList<HashMap<Object, Object>>) validationErrorHelper
+                .createGroupWithError(CommonConstants.RESPONSE_ERROR);
+        assertEquals("error.msg.entry.required.in.datatable.[" + registeredTableName + "]",
+                groupErrorData.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE));
+
+        // deleting entity datatable check
+        entityDatatableCheckId = this.entityDatatableChecksHelper.deleteEntityDatatableCheck(entityDatatableCheckId);
+        assertNotNull("ERROR IN DELETING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // deleting the datatable
+        String deletedDataTableName = this.datatableHelper.deleteDatatable(registeredTableName);
+        assertEquals("ERROR IN DELETING THE DATATABLE", registeredTableName, deletedDataTableName);
+    }
+
+    @Test
+    public void validateCreateSavingsWithEntityDatatableCheck() {
+
+        this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
+
+        final String minBalanceForInterestCalculation = null;
+        final String minRequiredBalance = null;
+        final String enforceMinRequiredBalance = "false";
+        final boolean allowOverdraft = false;
+
+        // creating datatable
+        String registeredTableName = this.datatableHelper.createDatatable(SAVINGS_APP_TABLE_NAME, false);
+        DatatableHelper.verifyDatatableCreatedOnServer(this.requestSpec, this.responseSpec, registeredTableName);
+
+        // creating new entity datatable check
+        Integer entityDatatableCheckId = this.entityDatatableChecksHelper.createEntityDatatableCheck(SAVINGS_APP_TABLE_NAME,
+                registeredTableName, 100, null);
+        assertNotNull("ERROR IN CREATING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);
+
+        final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, MINIMUM_OPENING_BALANCE,
+                minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft);
+        Assert.assertNotNull(savingsProductID);
+
+        // creating savings with datatables
+        final Integer savingsId = this.savingsAccountHelper.applyForSavingsApplicationWithDatatables(clientID, savingsProductID,
+                ACCOUNT_TYPE_INDIVIDUAL, "01 December 2016", registeredTableName);
+        Assert.assertNotNull(savingsId);
+
+        // deleting entity datatable check
+        entityDatatableCheckId = this.entityDatatableChecksHelper.deleteEntityDatatableCheck(entityDatatableCheckId);
+        assertNotNull("ERROR IN DELETING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // deleting datatable entries
+        Integer appTableId = this.datatableHelper.deleteDatatableEntries(registeredTableName, savingsId, "savingsId");
+        assertEquals("ERROR IN DELETING THE DATATABLE ENTRIES", savingsId, appTableId);
+
+        // deleting the datatable
+        String deletedDataTableName = this.datatableHelper.deleteDatatable(registeredTableName);
+        assertEquals("ERROR IN DELETING THE DATATABLE", registeredTableName, deletedDataTableName);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void validateCreateSavingsWithEntityDatatableCheckWithFailure() {
+        // building error response with status code 403
+        final ResponseSpecification errorResponse = new ResponseSpecBuilder().expectStatusCode(403).build();
+        final SavingsAccountHelper validationErrorHelper = new SavingsAccountHelper(this.requestSpec, errorResponse);
+
+        final String minBalanceForInterestCalculation = null;
+        final String minRequiredBalance = null;
+        final String enforceMinRequiredBalance = "false";
+        final boolean allowOverdraft = false;
+
+        // creating datatable
+        String registeredTableName = this.datatableHelper.createDatatable(SAVINGS_APP_TABLE_NAME, false);
+        DatatableHelper.verifyDatatableCreatedOnServer(this.requestSpec, this.responseSpec, registeredTableName);
+
+        // creating new entity datatable check
+        Integer entityDatatableCheckId = this.entityDatatableChecksHelper.createEntityDatatableCheck(SAVINGS_APP_TABLE_NAME,
+                registeredTableName, 100, null);
+        assertNotNull("ERROR IN CREATING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);
+
+        final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, MINIMUM_OPENING_BALANCE,
+                minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft);
+        Assert.assertNotNull(savingsProductID);
+
+        // creating savings with datatables with error
+        ArrayList<HashMap<Object, Object>> groupErrorData = (ArrayList<HashMap<Object, Object>>) validationErrorHelper
+                .applyForSavingsApplicationWithFailure(clientID, savingsProductID, ACCOUNT_TYPE_INDIVIDUAL, "01 December 2016",
+                        CommonConstants.RESPONSE_ERROR);
+        assertEquals("error.msg.entry.required.in.datatable.[" + registeredTableName + "]",
+                groupErrorData.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE));
+
+        // deleting entity datatable check
+        entityDatatableCheckId = this.entityDatatableChecksHelper.deleteEntityDatatableCheck(entityDatatableCheckId);
+        assertNotNull("ERROR IN DELETING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // deleting the datatable
+        String deletedDataTableName = this.datatableHelper.deleteDatatable(registeredTableName);
+        assertEquals("ERROR IN DELETING THE DATATABLE", registeredTableName, deletedDataTableName);
+    }
+
+    @Test
+    public void validateCreateLoanWithEntityDatatableCheck() {
+        this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec);
+
+        // creating client
+        final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);
+
+        // creating loan product
+        final Integer loanProductID = createLoanProduct("100", "0", LoanProductTestBuilder.DEFAULT_STRATEGY);
+        Assert.assertNotNull(loanProductID);
+
+        // creating datatable
+        String registeredTableName = this.datatableHelper.createDatatable(LOAN_APP_TABLE_NAME, false);
+        DatatableHelper.verifyDatatableCreatedOnServer(this.requestSpec, this.responseSpec, registeredTableName);
+
+        // creating new entity datatable check
+        Integer entityDatatableCheckId = this.entityDatatableChecksHelper.createEntityDatatableCheck(LOAN_APP_TABLE_NAME,
+                registeredTableName, 100, loanProductID);
+        assertNotNull("ERROR IN CREATING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // creating new loan application
+        final Integer loanID = applyForLoanApplication(clientID, loanProductID, "5", registeredTableName);
+        Assert.assertNotNull(loanID);
+
+        // deleting entity datatable check
+        entityDatatableCheckId = this.entityDatatableChecksHelper.deleteEntityDatatableCheck(entityDatatableCheckId);
+        assertNotNull("ERROR IN DELETING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // deleting datatable entries
+        Integer appTableId = this.datatableHelper.deleteDatatableEntries(registeredTableName, loanID, "loanId");
+        assertEquals("ERROR IN DELETING THE DATATABLE ENTRIES", loanID, appTableId);
+
+        // deleting the datatable
+        String deletedDataTableName = this.datatableHelper.deleteDatatable(registeredTableName);
+        assertEquals("ERROR IN DELETING THE DATATABLE", registeredTableName, deletedDataTableName);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void validateCreateLoanWithEntityDatatableCheckWithFailure() {
+        this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec);
+
+        // building error response with status code 403
+        final ResponseSpecification errorResponse = new ResponseSpecBuilder().expectStatusCode(403).build();
+        this.validationErrorHelper = new LoanTransactionHelper(this.requestSpec, errorResponse);
+
+        // creating client
+        final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
+        ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);
+
+        // creating loan product
+        final Integer loanProductID = createLoanProduct("100", "0", LoanProductTestBuilder.DEFAULT_STRATEGY);
+        Assert.assertNotNull(loanProductID);
+
+        // creating datatable
+        String registeredTableName = this.datatableHelper.createDatatable(LOAN_APP_TABLE_NAME, false);
+        DatatableHelper.verifyDatatableCreatedOnServer(this.requestSpec, this.responseSpec, registeredTableName);
+
+        // creating new entity datatable check
+        Integer entityDatatableCheckId = this.entityDatatableChecksHelper.createEntityDatatableCheck(LOAN_APP_TABLE_NAME,
+                registeredTableName, 100, loanProductID);
+        assertNotNull("ERROR IN CREATING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // creating new loan application with error
+        ArrayList<HashMap<Object, Object>> loanErrorData = (ArrayList<HashMap<Object, Object>>) applyForLoanApplicationWithError(clientID,
+                loanProductID, "5", CommonConstants.RESPONSE_ERROR);
+        assertEquals("error.msg.entry.required.in.datatable.[" + registeredTableName + "]",
+                loanErrorData.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE));
+
+        // deleting entity datatable check
+        entityDatatableCheckId = this.entityDatatableChecksHelper.deleteEntityDatatableCheck(entityDatatableCheckId);
+        assertNotNull("ERROR IN DELETING THE ENTITY DATATABLE CHECK", entityDatatableCheckId);
+
+        // deleting the datatable
+        String deletedDataTableName = this.datatableHelper.deleteDatatable(registeredTableName);
+        assertEquals("ERROR IN DELETING THE DATATABLE", registeredTableName, deletedDataTableName);
+    }
+
+    private Integer createSavingsProduct(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
+            final String minOpenningBalance, String minBalanceForInterestCalculation, String minRequiredBalance,
+            String enforceMinRequiredBalance, final boolean allowOverdraft) {
+        final String taxGroupId = null;
+        return createSavingsProduct(requestSpec, responseSpec, minOpenningBalance, minBalanceForInterestCalculation, minRequiredBalance,
+                enforceMinRequiredBalance, allowOverdraft, taxGroupId, false);
+    }
+
+    private Integer createSavingsProduct(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
+            final String minOpenningBalance, String minBalanceForInterestCalculation, String minRequiredBalance,
+            String enforceMinRequiredBalance, final boolean allowOverdraft, final String taxGroupId, boolean withDormancy) {
+        System.out.println("------------------------------CREATING NEW SAVINGS PRODUCT ---------------------------------------");
+        SavingsProductHelper savingsProductHelper = new SavingsProductHelper();
+        if (allowOverdraft) {
+            final String overDraftLimit = "2000.0";
+            savingsProductHelper = savingsProductHelper.withOverDraft(overDraftLimit);
+        }
+        if (withDormancy) {
+            savingsProductHelper = savingsProductHelper.withDormancy();
+        }
+
+        final String savingsProductJSON = savingsProductHelper
+                //
+                .withInterestCompoundingPeriodTypeAsDaily()
+                //
+                .withInterestPostingPeriodTypeAsMonthly()
+                //
+                .withInterestCalculationPeriodTypeAsDailyBalance()
+                //
+                .withMinBalanceForInterestCalculation(minBalanceForInterestCalculation)
+                //
+                .withMinRequiredBalance(minRequiredBalance).withEnforceMinRequiredBalance(enforceMinRequiredBalance)
+                .withMinimumOpenningBalance(minOpenningBalance).withWithHoldTax(taxGroupId).build();
+        return SavingsProductHelper.createSavingsProduct(savingsProductJSON, requestSpec, responseSpec);
+    }
+
+    private Integer createLoanProduct(final String inMultiplesOf, final String digitsAfterDecimal, final String repaymentStrategy) {
+        System.out.println("------------------------------CREATING NEW LOAN PRODUCT ---------------------------------------");
+        final String loanProductJSON = new LoanProductTestBuilder() //
+                .withPrincipal("10000000.00") //
+                .withNumberOfRepayments("24") //
+                .withRepaymentAfterEvery("1") //
+                .withRepaymentTypeAsMonth() //
+                .withinterestRatePerPeriod("2") //
+                .withInterestRateFrequencyTypeAsMonths() //
+                .withRepaymentStrategy(repaymentStrategy) //
+                .withAmortizationTypeAsEqualPrincipalPayment() //
+                .withInterestTypeAsDecliningBalance() //
+                .currencyDetails(digitsAfterDecimal, inMultiplesOf).build(null);
+        return this.loanTransactionHelper.getLoanProductId(loanProductJSON);
+    }
+
+    private Integer applyForLoanApplication(final Integer clientID, final Integer loanProductID, String graceOnPrincipalPayment,
+            final String registeredTableName) {
+        System.out.println("--------------------------------APPLYING FOR LOAN APPLICATION--------------------------------");
+        final String loanApplicationJSON = new LoanApplicationTestBuilder() //
+                .withPrincipal("10000000.00") //
+                .withLoanTermFrequency("24") //
+                .withLoanTermFrequencyAsMonths() //
+                .withNumberOfRepayments("24") //
+                .withRepaymentEveryAfter("1") //
+                .withRepaymentFrequencyTypeAsMonths() //
+                .withInterestRatePerPeriod("2") //
+                .withAmortizationTypeAsEqualPrincipalPayments() //
+                .withInterestTypeAsDecliningBalance() //
+                .withInterestCalculationPeriodTypeSameAsRepaymentPeriod() //
+                .withPrincipalGrace(graceOnPrincipalPayment).withExpectedDisbursementDate("2 June 2014") //
+                .withSubmittedOnDate("2 June 2014") //
+                .withDatatables(getTestDatatableAsJson(registeredTableName)) //
+                .build(clientID.toString(), loanProductID.toString(), null);
+        return this.loanTransactionHelper.getLoanId(loanApplicationJSON);
+    }
+
+    private Object applyForLoanApplicationWithError(final Integer clientID, final Integer loanProductID, String graceOnPrincipalPayment,
+            final String responseAttribute) {
+        System.out.println("--------------------------------APPLYING FOR LOAN APPLICATION--------------------------------");
+        final String loanApplicationJSON = new LoanApplicationTestBuilder() //
+                .withPrincipal("10000000.00") //
+                .withLoanTermFrequency("24") //
+                .withLoanTermFrequencyAsMonths() //
+                .withNumberOfRepayments("24") //
+                .withRepaymentEveryAfter("1") //
+                .withRepaymentFrequencyTypeAsMonths() //
+                .withInterestRatePerPeriod("2") //
+                .withAmortizationTypeAsEqualPrincipalPayments() //
+                .withInterestTypeAsDecliningBalance() //
+                .withInterestCalculationPeriodTypeSameAsRepaymentPeriod() //
+                .withPrincipalGrace(graceOnPrincipalPayment).withExpectedDisbursementDate("2 June 2014") //
+                .withSubmittedOnDate("2 June 2014") //
+                .build(clientID.toString(), loanProductID.toString(), null);
+        return this.validationErrorHelper.getLoanError(loanApplicationJSON, responseAttribute);
+    }
+
+    public static List<HashMap<String, Object>> getTestDatatableAsJson(final String registeredTableName) {
+        List<HashMap<String, Object>> datatablesListMap = new ArrayList<>();
+        HashMap<String, Object> datatableMap = new HashMap<>();
+        HashMap<String, Object> dataMap = new HashMap<>();
+        dataMap.put("locale", "en");
+        dataMap.put("Spouse Name", Utils.randomNameGenerator("Spouse_name", 4));
+        dataMap.put("Number of Dependents", 5);
+        dataMap.put("Time of Visit", "01 December 2016 04:03");
+        dataMap.put("dateFormat", DATE_TIME_FORMAT);
+        dataMap.put("Date of Approval", "02 December 2016 00:00");
+        datatableMap.put("registeredTableName", registeredTableName);
+        datatableMap.put("data", dataMap);
+        datatablesListMap.add(datatableMap);
+        return datatablesListMap;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/c8cedfc7/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/savings/SavingsAccountHelper.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/savings/SavingsAccountHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/savings/SavingsAccountHelper.java
index 325d23e..0b24cb8 100644
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/savings/SavingsAccountHelper.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/savings/SavingsAccountHelper.java
@@ -63,6 +63,8 @@ public class SavingsAccountHelper {
     public static final String LAST_TRANSACTION_DATE = "01 March 2013";
     public static final String ACCOUNT_TYPE_INDIVIDUAL = "INDIVIDUAL";
 
+    public static final String DATE_TIME_FORMAT = "dd MMMM yyyy HH:mm";
+
     public SavingsAccountHelper(final RequestSpecification requestSpec, final ResponseSpecification responseSpec) {
         this.requestSpec = requestSpec;
         this.responseSpec = responseSpec;
@@ -89,6 +91,27 @@ public class SavingsAccountHelper {
                 savingsApplicationJSON, "savingsId");
     }
 
+    public Integer applyForSavingsApplicationWithDatatables(final Integer ID, final Integer savingsProductID, final String accountType,
+            final String submittedOnDate, final String datatableName) {
+        System.out.println("----------------------------APPLYING FOR SAVINGS APPLICATION WITH DATATABLES----------------------------");
+        final String savingsApplicationJSON = new SavingsApplicationTestBuilder() //
+                .withSubmittedOnDate(submittedOnDate) //
+                .withDatatables(getTestDatatableAsJson(datatableName)) //
+                .build(ID.toString(), savingsProductID.toString(), accountType);
+        return Utils.performServerPost(this.requestSpec, this.responseSpec, SAVINGS_ACCOUNT_URL + "?" + Utils.TENANT_IDENTIFIER,
+                savingsApplicationJSON, "savingsId");
+    }
+
+    public Object applyForSavingsApplicationWithFailure(final Integer ID, final Integer savingsProductID, final String accountType,
+            final String submittedOnDate, final String responseAttribute) {
+        System.out.println("----------------------------APPLYING FOR SAVINGS APPLICATION WITH ERROR----------------------------");
+        final String savingsApplicationJSON = new SavingsApplicationTestBuilder() //
+                .withSubmittedOnDate(submittedOnDate) //
+                .build(ID.toString(), savingsProductID.toString(), accountType);
+        return Utils.performServerPost(this.requestSpec, this.responseSpec, SAVINGS_ACCOUNT_URL + "?" + Utils.TENANT_IDENTIFIER,
+                savingsApplicationJSON, responseAttribute);
+    }
+
     public HashMap updateSavingsAccount(final Integer ID, final Integer savingsProductID, final Integer savingsId, final String accountType) {
         final String savingsApplicationJSON = new SavingsApplicationTestBuilder() //
                 .withSubmittedOnDate(CREATED_DATE_PLUS_ONE) //
@@ -536,4 +559,19 @@ public class SavingsAccountHelper {
         return SavingsProductHelper.createSavingsProduct(savingsProductJSON, requestSpec, responseSpec);
     }
 
+    public static List<HashMap<String, Object>> getTestDatatableAsJson(final String registeredTableName) {
+        List<HashMap<String, Object>> datatablesListMap = new ArrayList<>();
+        HashMap<String, Object> datatableMap = new HashMap<>();
+        HashMap<String, Object> dataMap = new HashMap<>();
+        dataMap.put("locale", "en");
+        dataMap.put("Spouse Name", Utils.randomNameGenerator("Spouse_name", 4));
+        dataMap.put("Number of Dependents", 5);
+        dataMap.put("Time of Visit", "01 December 2016 04:03");
+        dataMap.put("dateFormat", DATE_TIME_FORMAT);
+        dataMap.put("Date of Approval", "02 December 2016 00:00");
+        datatableMap.put("registeredTableName", registeredTableName);
+        datatableMap.put("data", dataMap);
+        datatablesListMap.add(datatableMap);
+        return datatablesListMap;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/c8cedfc7/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/savings/SavingsApplicationTestBuilder.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/savings/SavingsApplicationTestBuilder.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/savings/SavingsApplicationTestBuilder.java
index 7fbceca..1ce4842 100755
--- a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/savings/SavingsApplicationTestBuilder.java
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/savings/SavingsApplicationTestBuilder.java
@@ -19,6 +19,7 @@
 package org.apache.fineract.integrationtests.common.savings;
 
 import java.util.HashMap;
+import java.util.List;
 
 import com.google.gson.Gson;
 
@@ -27,23 +28,28 @@ public class SavingsApplicationTestBuilder {
     private static final String LOCALE = "en_GB";
 
     private String submittedOnDate = "";
-    
+
     private HashMap<String, String> addParams = null;
 
+    private List<HashMap<String, Object>> datatables = null;
+
     public String build(final String ID, final String savingsProductId, final String accountType) {
 
-        final HashMap<String, String> map = new HashMap<>();
+        final HashMap<String, Object> map = new HashMap<>();
         map.put("dateFormat", "dd MMMM yyyy");
         if (accountType == "GROUP") {
             map.put("groupId", ID);
         } else {
             map.put("clientId", ID);
-        }        
+        }
         map.put("productId", savingsProductId);
         map.put("locale", LOCALE);
         map.put("submittedOnDate", this.submittedOnDate);
-        if(addParams!=null && addParams.size() > 0){
-        	map.putAll(addParams);
+        if (addParams != null && addParams.size() > 0) {
+            map.putAll(addParams);
+        }
+        if (datatables != null) {
+            map.put("datatables", this.datatables);
         }
         String savingsApplicationJSON = new Gson().toJson(map);
         System.out.println(savingsApplicationJSON);
@@ -55,9 +61,13 @@ public class SavingsApplicationTestBuilder {
         return this;
     }
 
-	public SavingsApplicationTestBuilder withParams(
-			HashMap<String, String> params) {
-		this.addParams = params;
-		return this;
-	}
+    public SavingsApplicationTestBuilder withParams(HashMap<String, String> params) {
+        this.addParams = params;
+        return this;
+    }
+
+    public SavingsApplicationTestBuilder withDatatables(final List<HashMap<String, Object>> datatables) {
+        this.datatables = datatables;
+        return this;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/c8cedfc7/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/system/DatatableHelper.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/system/DatatableHelper.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/system/DatatableHelper.java
new file mode 100644
index 0000000..b9494e1
--- /dev/null
+++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/common/system/DatatableHelper.java
@@ -0,0 +1,101 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.integrationtests.common.system;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.fineract.integrationtests.common.Utils;
+
+import com.google.gson.Gson;
+import com.jayway.restassured.specification.RequestSpecification;
+import com.jayway.restassured.specification.ResponseSpecification;
+
+public class DatatableHelper {
+
+    private final RequestSpecification requestSpec;
+    private final ResponseSpecification responseSpec;
+
+    private static final String DATATABLE_URL = "/fineract-provider/api/v1/datatables";
+
+    public DatatableHelper(final RequestSpecification requestSpec, final ResponseSpecification responseSpec) {
+        this.requestSpec = requestSpec;
+        this.responseSpec = responseSpec;
+    }
+
+    public String createDatatable(final String apptableName, final boolean multiRow) {
+        return Utils.performServerPost(this.requestSpec, this.responseSpec, DATATABLE_URL + "?" + Utils.TENANT_IDENTIFIER,
+                getTestDatatableAsJSON(apptableName, multiRow), "resourceIdentifier");
+    }
+
+    public String deleteDatatable(final String datatableName) {
+        return Utils.performServerDelete(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "?" + Utils.TENANT_IDENTIFIER,
+                "resourceIdentifier");
+    }
+
+    public Integer deleteDatatableEntries(final String datatableName, final Integer apptableId, String jsonAttributeToGetBack) {
+        final String deleteEntryUrl = DATATABLE_URL + "/" + datatableName + "/" + apptableId + "?genericResultSet=true" + "&"
+                + Utils.TENANT_IDENTIFIER;
+        return Utils.performServerDelete(this.requestSpec, this.responseSpec, deleteEntryUrl, jsonAttributeToGetBack);
+    }
+
+    public static void verifyDatatableCreatedOnServer(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
+            final String generatedDatatableName) {
+        System.out.println("------------------------------CHECK DATATABLE DETAILS------------------------------------\n");
+        final String responseRegisteredTableName = Utils.performServerGet(requestSpec, responseSpec, DATATABLE_URL + "/"
+                + generatedDatatableName + "?" + Utils.TENANT_IDENTIFIER, "registeredTableName");
+        assertEquals("ERROR IN CREATING THE DATATABLE", generatedDatatableName, responseRegisteredTableName);
+    }
+
+    public static String getTestDatatableAsJSON(final String apptableName, final boolean multiRow) {
+        final HashMap<String, Object> map = new HashMap<>();
+        final List<HashMap<String, Object>> datatableColumnsList = new ArrayList<>();
+        map.put("datatableName", Utils.randomNameGenerator(apptableName + "_", 5));
+        map.put("apptableName", apptableName);
+        map.put("multiRow", multiRow);
+        addDatatableColumns(datatableColumnsList, "Spouse Name", "String", true, 25);
+        addDatatableColumns(datatableColumnsList, "Number of Dependents", "Number", true, null);
+        addDatatableColumns(datatableColumnsList, "Time of Visit", "DateTime", false, null);
+        addDatatableColumns(datatableColumnsList, "Date of Approval", "Date", false, null);
+        map.put("columns", datatableColumnsList);
+        String requestJsonString = new Gson().toJson(map);
+        System.out.println("map : " + requestJsonString);
+        return requestJsonString;
+    }
+
+    public static List<HashMap<String, Object>> addDatatableColumns(List<HashMap<String, Object>> datatableColumnsList, String columnName,
+            String columnType, boolean isMandatory, Integer length) {
+
+        final HashMap<String, Object> datatableColumnMap = new HashMap<>();
+
+        datatableColumnMap.put("name", columnName);
+        datatableColumnMap.put("type", columnType);
+        datatableColumnMap.put("mandatory", isMandatory);
+        if (length != null) {
+            datatableColumnMap.put("length", length);
+        }
+
+        datatableColumnsList.add(datatableColumnMap);
+        return datatableColumnsList;
+    }
+
+}