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