You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by ad...@apache.org on 2023/01/17 08:15:53 UTC

[fineract] branch develop updated: FINERACT-1856: Fix to update datatable entry is failing after column added lately

This is an automated email from the ASF dual-hosted git repository.

adamsaghy pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new 09a91bba0 FINERACT-1856: Fix to update datatable entry is failing after column added lately
09a91bba0 is described below

commit 09a91bba01b6a8261578d2a4eb840ff4b93af0e0
Author: Jose Alberto Hernandez <al...@MacBook-Pro.local>
AuthorDate: Fri Jan 13 02:40:02 2023 -0600

    FINERACT-1856: Fix to update datatable entry is failing after column added lately
---
 .../service/ReadWriteNonCoreDataServiceImpl.java   |  8 +-
 .../integrationtests/DatatableIntegrationTest.java | 93 ++++++++++++++++++++++
 .../common/system/DatatableHelper.java             | 27 +++++++
 3 files changed, 127 insertions(+), 1 deletion(-)

diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java
index c716cc21f..850e30122 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java
@@ -2059,7 +2059,13 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
                 sql += sqlGenerator.escape(key) + " = " + pValueWrite;
             } else {
                 if (key.equalsIgnoreCase(DataTableApiConstant.UPDATEDAT_FIELD_NAME)) {
-                    sql += ", " + sqlGenerator.escape(key) + " = " + sqlGenerator.currentTenantDateTime();
+                    if (firstColumn) {
+                        sql += " set ";
+                        firstColumn = false;
+                    } else {
+                        sql += ", ";
+                    }
+                    sql += sqlGenerator.escape(key) + " = " + sqlGenerator.currentTenantDateTime();
                 }
             }
         }
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DatatableIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DatatableIntegrationTest.java
index 14b221b2e..781064021 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DatatableIntegrationTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DatatableIntegrationTest.java
@@ -41,7 +41,10 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.fineract.client.models.PostDataTablesAppTableIdResponse;
+import org.apache.fineract.client.models.PostDataTablesResponse;
 import org.apache.fineract.client.models.PutDataTablesAppTableIdDatatableIdResponse;
+import org.apache.fineract.client.models.PutDataTablesResponse;
 import org.apache.fineract.client.util.Calls;
 import org.apache.fineract.integrationtests.client.IntegrationTest;
 import org.apache.fineract.integrationtests.common.ClientHelper;
@@ -61,6 +64,7 @@ public class DatatableIntegrationTest extends IntegrationTest {
     private static final Logger LOG = LoggerFactory.getLogger(DatatableIntegrationTest.class);
 
     private static final String CLIENT_APP_TABLE_NAME = "m_client";
+    private static final String CLIENT_PERSON_SUBTYPE_NAME = "Person";
     private static final String LOAN_APP_TABLE_NAME = "m_loan";
 
     private static final Float LP_PRINCIPAL = 10000.0f;
@@ -426,6 +430,95 @@ public class DatatableIntegrationTest extends IntegrationTest {
         assertEquals(0, updatedDatatableEntryResponse.getChanges().size());
     }
 
+    @Test
+    public void validateCreateAndEditDatatable() {
+        // Creating client
+        final Integer clientId = ClientHelper.createClientAsPerson(requestSpec, responseSpec);
+        final Integer randomNumber = Utils.randomNumberGenerator(3);
+
+        // Creating datatable for Client Person
+        final String datatableName = Utils.randomNameGenerator(CLIENT_APP_TABLE_NAME + "_", 5);
+        final boolean genericResultSet = true;
+
+        HashMap<String, Object> columnMap = new HashMap<>();
+        List<HashMap<String, Object>> datatableColumnsList = new ArrayList<>();
+        columnMap.put("datatableName", datatableName);
+        columnMap.put("apptableName", CLIENT_APP_TABLE_NAME);
+        columnMap.put("entitySubType", CLIENT_PERSON_SUBTYPE_NAME);
+        columnMap.put("multiRow", false);
+        DatatableHelper.addDatatableColumns(datatableColumnsList, "itsANumber", "Number", false, null, null);
+        DatatableHelper.addDatatableColumns(datatableColumnsList, "itsAString", "String", false, 10, null);
+        columnMap.put("columns", datatableColumnsList);
+        String datatabelRequestJsonString = new Gson().toJson(columnMap);
+        LOG.info("map : {}", datatabelRequestJsonString);
+
+        PostDataTablesResponse datatableCreateResponse = this.datatableHelper.createDatatable(datatabelRequestJsonString);
+        assertEquals(datatableName, datatableCreateResponse.getResourceIdentifier());
+        DatatableHelper.verifyDatatableCreatedOnServer(this.requestSpec, this.responseSpec, datatableName);
+
+        // Insert first values
+        final String value = Utils.randomStringGenerator("Q", 8);
+        HashMap<String, Object> datatableEntryMap = new HashMap<>();
+        datatableEntryMap.put("itsANumber", randomNumber);
+        datatableEntryMap.put("itsAString", value);
+
+        datatableEntryMap.put("locale", "en");
+        datatableEntryMap.put("dateFormat", "yyyy-MM-dd");
+
+        String datatableEntryRequestJsonString = new GsonBuilder().serializeNulls().create().toJson(datatableEntryMap);
+        PostDataTablesAppTableIdResponse datatableEntryResponse = this.datatableHelper.addDatatableEntry(datatableName, clientId,
+                genericResultSet, datatableEntryRequestJsonString);
+        assertNotNull(datatableEntryResponse.getResourceId(), "ERROR IN CREATING THE ENTITY DATATABLE RECORD");
+
+        // Read the Datatable entry generated with genericResultSet in true (default)
+        HashMap<String, Object> items = this.datatableHelper.readDatatableEntry(datatableName, clientId, genericResultSet, null, "");
+        assertNotNull(items);
+        assertEquals(1, ((List) items.get("data")).size());
+        LOG.info("Record created at {}", ((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(3));
+        LOG.info("Record updated at {}", ((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(4));
+
+        assertEquals(clientId, ((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(0));
+        assertEquals(value, ((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(2));
+
+        // Update DataTable
+        columnMap = new HashMap<>();
+        columnMap.put("apptableName", CLIENT_APP_TABLE_NAME);
+        columnMap.put("entitySubType", CLIENT_PERSON_SUBTYPE_NAME);
+        datatableColumnsList = new ArrayList<>();
+        DatatableHelper.addDatatableColumns(datatableColumnsList, "itsAText", "Text", false, null, null);
+        columnMap.put("addColumns", datatableColumnsList);
+        datatabelRequestJsonString = new Gson().toJson(columnMap);
+        LOG.info("map to update : {}", datatabelRequestJsonString);
+        PutDataTablesResponse datatableUpdateResponse = this.datatableHelper.updateDatatable(datatableName, datatabelRequestJsonString);
+        assertNotNull(datatableUpdateResponse);
+        assertEquals(datatableName, datatableUpdateResponse.getResourceIdentifier());
+
+        // Update DataTable Entry after Update DataTable schema
+        datatableEntryMap = new HashMap<>();
+        final String textValue = Utils.randomStringGenerator(value, 120);
+        datatableEntryMap.put("itsAText", textValue);
+        datatableEntryMap.put("locale", "en");
+        datatableEntryMap.put("dateFormat", "yyyy-MM-dd");
+
+        datatableEntryRequestJsonString = new GsonBuilder().serializeNulls().create().toJson(datatableEntryMap);
+        LOG.info("map to update : {}", datatableEntryRequestJsonString);
+        PutDataTablesAppTableIdDatatableIdResponse updatedDatatableEntryResponse = this.datatableHelper.updateDatatableEntry(datatableName,
+                clientId, datatableEntryRequestJsonString);
+        assertNotNull(updatedDatatableEntryResponse);
+        assertEquals(1, updatedDatatableEntryResponse.getChanges().size());
+
+        // Read the Datatable entry generated with genericResultSet in true (default)
+        items = this.datatableHelper.readDatatableEntry(datatableName, clientId, genericResultSet, null, "");
+        assertNotNull(items);
+        assertEquals(1, ((List) items.get("data")).size());
+        LOG.info("Record created at {}", ((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(3));
+        LOG.info("Record updated at {}", ((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(4));
+
+        assertEquals(clientId, ((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(0));
+        assertEquals(value, ((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(2));
+        assertEquals(textValue, ((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(5));
+    }
+
     @Test
     public void validateReadDatatableMultirow() {
         // Fetch / Create TST code
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/system/DatatableHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/system/DatatableHelper.java
index cf771a2cc..ab3e3fc89 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/system/DatatableHelper.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/system/DatatableHelper.java
@@ -31,6 +31,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Objects;
 import org.apache.fineract.client.models.GetDataTablesResponse;
+import org.apache.fineract.client.models.PostDataTablesAppTableIdResponse;
 import org.apache.fineract.client.models.PostDataTablesRequest;
 import org.apache.fineract.client.models.PostDataTablesResponse;
 import org.apache.fineract.client.models.PutDataTablesAppTableIdDatatableIdResponse;
@@ -73,6 +74,13 @@ public class DatatableHelper extends IntegrationTest {
                 + "?genericResultSet=" + genericResultSet + "&" + Utils.TENANT_IDENTIFIER, json, "");
     }
 
+    public PostDataTablesAppTableIdResponse addDatatableEntry(final String datatableName, final Integer apptableId,
+            final boolean genericResultSet, final String json) {
+        final String response = Utils.performServerPost(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/"
+                + apptableId + "?genericResultSet=" + genericResultSet + "&" + Utils.TENANT_IDENTIFIER, json);
+        return GSON.fromJson(response, PostDataTablesAppTableIdResponse.class);
+    }
+
     public <T> T updateDatatableEntry(final String datatableName, final Integer apptableId, final boolean genericResultSet,
             final String json) {
         return Utils.performServerPut(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + apptableId
@@ -92,6 +100,13 @@ public class DatatableHelper extends IntegrationTest {
         return GSON.fromJson(response, PutDataTablesAppTableIdDatatableIdResponse.class);
     }
 
+    public PutDataTablesAppTableIdDatatableIdResponse updateDatatableEntry(final String datatableName, final Integer apptableId,
+            final String json) {
+        final String response = Utils.performServerPut(this.requestSpec, this.responseSpec,
+                DATATABLE_URL + "/" + datatableName + "/" + apptableId + "?genericResultSet=false&" + Utils.TENANT_IDENTIFIER, json, null);
+        return GSON.fromJson(response, PutDataTablesAppTableIdDatatableIdResponse.class);
+    }
+
     public Integer createDatatableEntry(final String apptableName, final String datatableName, final Integer apptableId,
             final boolean genericResultSet, final String dateFormat, final String jsonAttributeToGetBack) {
         return Utils.performServerPost(
@@ -253,4 +268,16 @@ public class DatatableHelper extends IntegrationTest {
         return ok(fineract().dataTables.updateDatatable(dataTableName, request));
     }
 
+    public PostDataTablesResponse createDatatable(final String json) {
+        final String response = Utils.performServerPost(this.requestSpec, this.responseSpec, DATATABLE_URL + "?" + Utils.TENANT_IDENTIFIER,
+                json);
+        return GSON.fromJson(response, PostDataTablesResponse.class);
+    }
+
+    public PutDataTablesResponse updateDatatable(String dataTableName, final String json) {
+        final String response = Utils.performServerPut(this.requestSpec, this.responseSpec,
+                DATATABLE_URL + "/" + dataTableName + "?" + Utils.TENANT_IDENTIFIER, json);
+        return GSON.fromJson(response, PutDataTablesResponse.class);
+    }
+
 }