FINERACT-1856: Fix to update datatable entry is failing after column added lately

This commit is contained in:
Jose Alberto Hernandez
2023-01-17 09:15:45 +01:00
committed by Adam Saghy
parent 894ff15aec
commit 09a91bba01
3 changed files with 127 additions and 1 deletions
@@ -2059,7 +2059,13 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
sql += sqlGenerator.escape(key) + " = " + pValueWrite; sql += sqlGenerator.escape(key) + " = " + pValueWrite;
} else { } else {
if (key.equalsIgnoreCase(DataTableApiConstant.UPDATEDAT_FIELD_NAME)) { 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();
} }
} }
} }
@@ -41,7 +41,10 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; 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.PutDataTablesAppTableIdDatatableIdResponse;
import org.apache.fineract.client.models.PutDataTablesResponse;
import org.apache.fineract.client.util.Calls; import org.apache.fineract.client.util.Calls;
import org.apache.fineract.integrationtests.client.IntegrationTest; import org.apache.fineract.integrationtests.client.IntegrationTest;
import org.apache.fineract.integrationtests.common.ClientHelper; 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 Logger LOG = LoggerFactory.getLogger(DatatableIntegrationTest.class);
private static final String CLIENT_APP_TABLE_NAME = "m_client"; 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 String LOAN_APP_TABLE_NAME = "m_loan";
private static final Float LP_PRINCIPAL = 10000.0f; private static final Float LP_PRINCIPAL = 10000.0f;
@@ -426,6 +430,95 @@ public class DatatableIntegrationTest extends IntegrationTest {
assertEquals(0, updatedDatatableEntryResponse.getChanges().size()); 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 @Test
public void validateReadDatatableMultirow() { public void validateReadDatatableMultirow() {
// Fetch / Create TST code // Fetch / Create TST code
@@ -31,6 +31,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import org.apache.fineract.client.models.GetDataTablesResponse; 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.PostDataTablesRequest;
import org.apache.fineract.client.models.PostDataTablesResponse; import org.apache.fineract.client.models.PostDataTablesResponse;
import org.apache.fineract.client.models.PutDataTablesAppTableIdDatatableIdResponse; import org.apache.fineract.client.models.PutDataTablesAppTableIdDatatableIdResponse;
@@ -73,6 +74,13 @@ public class DatatableHelper extends IntegrationTest {
+ "?genericResultSet=" + genericResultSet + "&" + Utils.TENANT_IDENTIFIER, json, ""); + "?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, public <T> T updateDatatableEntry(final String datatableName, final Integer apptableId, final boolean genericResultSet,
final String json) { final String json) {
return Utils.performServerPut(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + apptableId 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); 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, public Integer createDatatableEntry(final String apptableName, final String datatableName, final Integer apptableId,
final boolean genericResultSet, final String dateFormat, final String jsonAttributeToGetBack) { final boolean genericResultSet, final String dateFormat, final String jsonAttributeToGetBack) {
return Utils.performServerPost( return Utils.performServerPost(
@@ -253,4 +268,16 @@ public class DatatableHelper extends IntegrationTest {
return ok(fineract().dataTables.updateDatatable(dataTableName, request)); 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);
}
} }