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 <alberto@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); + } + }