FINERACT-1910 Support Pagination, sorting and filtering for Datatable
This commit is contained in:
+7
@@ -23,6 +23,7 @@ import static org.apache.fineract.integrationtests.common.Utils.TENANT_PARAM_NAM
|
||||
|
||||
import com.google.common.reflect.TypeToken;
|
||||
import com.google.gson.Gson;
|
||||
import io.restassured.path.json.JsonPath;
|
||||
import io.restassured.specification.RequestSpecification;
|
||||
import io.restassured.specification.ResponseSpecification;
|
||||
import jakarta.ws.rs.core.HttpHeaders;
|
||||
@@ -39,6 +40,7 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import org.apache.fineract.client.models.PagedLocalRequestAdvancedQueryRequest;
|
||||
import org.apache.fineract.client.models.SavingsAccountTransactionsSearchResponse;
|
||||
import org.apache.fineract.client.util.JSON;
|
||||
import org.apache.fineract.integrationtests.client.IntegrationTest;
|
||||
@@ -661,6 +663,11 @@ public class SavingsAccountHelper extends IntegrationTest {
|
||||
return GSON.fromJson(response, SavingsAccountTransactionsSearchResponse.class);
|
||||
}
|
||||
|
||||
public Map<String, Object> querySavingsTransactions(Integer savingsId, PagedLocalRequestAdvancedQueryRequest request) {
|
||||
String response = ok(fineract().savingsTransactions.advancedQuery1(savingsId.longValue(), request));
|
||||
return JsonPath.from(response).get("");
|
||||
}
|
||||
|
||||
public List<HashMap> getSavingsTransactions(final Integer savingsID) {
|
||||
final Object get = getSavingsCollectionAttribute(savingsID, "transactions");
|
||||
final String json = new Gson().toJson(get);
|
||||
|
||||
+7
@@ -24,6 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonElement;
|
||||
import io.restassured.path.json.JsonPath;
|
||||
import io.restassured.specification.RequestSpecification;
|
||||
import io.restassured.specification.ResponseSpecification;
|
||||
import java.util.ArrayList;
|
||||
@@ -31,8 +32,10 @@ import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import org.apache.fineract.client.models.GetDataTablesResponse;
|
||||
import org.apache.fineract.client.models.PagedLocalRequestAdvancedQueryData;
|
||||
import org.apache.fineract.client.models.PostDataTablesAppTableIdResponse;
|
||||
import org.apache.fineract.client.models.PostDataTablesRequest;
|
||||
import org.apache.fineract.client.models.PostDataTablesResponse;
|
||||
@@ -294,4 +297,8 @@ public class DatatableHelper extends IntegrationTest {
|
||||
return GSON.fromJson(response, PutDataTablesResponse.class);
|
||||
}
|
||||
|
||||
public Map<String, Object> queryDatatable(String dataTableName, PagedLocalRequestAdvancedQueryData request) {
|
||||
String response = ok(fineract().dataTables.advancedQuery(dataTableName, request));
|
||||
return JsonPath.from(response).get("");
|
||||
}
|
||||
}
|
||||
|
||||
+387
@@ -0,0 +1,387 @@
|
||||
/**
|
||||
* 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.datatable;
|
||||
|
||||
import static org.apache.fineract.client.models.FilterData.OperatorEnum.BTW;
|
||||
import static org.apache.fineract.client.models.FilterData.OperatorEnum.EQ;
|
||||
import static org.apache.fineract.client.models.FilterData.OperatorEnum.GT;
|
||||
import static org.apache.fineract.client.models.FilterData.OperatorEnum.GTE;
|
||||
import static org.apache.fineract.client.models.FilterData.OperatorEnum.IN;
|
||||
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_FIELD_TYPE_BOOLEAN;
|
||||
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_FIELD_TYPE_DATE;
|
||||
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_FIELD_TYPE_DECIMAL;
|
||||
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_FIELD_TYPE_NUMBER;
|
||||
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_FIELD_TYPE_STRING;
|
||||
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_FIELD_TYPE_TEXT;
|
||||
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_PARAM_APPTABLE_NAME;
|
||||
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_PARAM_COLUMNS;
|
||||
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_PARAM_DATATABLE_NAME;
|
||||
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_PARAM_MULTIROW;
|
||||
import static org.apache.fineract.infrastructure.dataqueries.api.DataTableApiConstant.API_PARAM_SUBTYPE;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import io.restassured.builder.RequestSpecBuilder;
|
||||
import io.restassured.builder.ResponseSpecBuilder;
|
||||
import io.restassured.http.ContentType;
|
||||
import io.restassured.specification.RequestSpecification;
|
||||
import io.restassured.specification.ResponseSpecification;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.time.ZoneId;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.apache.fineract.client.models.AdvancedQueryData;
|
||||
import org.apache.fineract.client.models.AdvancedQueryRequest;
|
||||
import org.apache.fineract.client.models.ColumnFilterData;
|
||||
import org.apache.fineract.client.models.FilterData;
|
||||
import org.apache.fineract.client.models.GetDataTablesResponse;
|
||||
import org.apache.fineract.client.models.PagedLocalRequestAdvancedQueryData;
|
||||
import org.apache.fineract.client.models.PagedLocalRequestAdvancedQueryRequest;
|
||||
import org.apache.fineract.client.models.PostDataTablesResponse;
|
||||
import org.apache.fineract.client.models.ResultsetColumnHeaderData;
|
||||
import org.apache.fineract.client.models.SortOrder;
|
||||
import org.apache.fineract.client.models.TableQueryData;
|
||||
import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType;
|
||||
import org.apache.fineract.infrastructure.core.service.DateUtils;
|
||||
import org.apache.fineract.infrastructure.dataqueries.data.EntityTables;
|
||||
import org.apache.fineract.integrationtests.common.BusinessDateHelper;
|
||||
import org.apache.fineract.integrationtests.common.ClientHelper;
|
||||
import org.apache.fineract.integrationtests.common.CommonConstants;
|
||||
import org.apache.fineract.integrationtests.common.GlobalConfigurationHelper;
|
||||
import org.apache.fineract.integrationtests.common.Utils;
|
||||
import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper;
|
||||
import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper;
|
||||
import org.apache.fineract.integrationtests.common.savings.SavingsStatusChecker;
|
||||
import org.apache.fineract.integrationtests.common.system.DatatableHelper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class DatatableAdvancedQueryTest {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(DatatableAdvancedQueryTest.class);
|
||||
|
||||
private static final String SAVINGS_TRANSACTION_APP_TABLE_NAME = EntityTables.SAVINGS_TRANSACTION.getName();
|
||||
public static final String ACCOUNT_TYPE_INDIVIDUAL = "INDIVIDUAL";
|
||||
public static final String SAVINGS_DATE_FORMAT = "dd MMM yyyy";
|
||||
|
||||
private static final String COLUMN_STRING = "aString";
|
||||
private static final String COLUMN_TEXT = "aText";
|
||||
private static final String COLUMN_DATE = "aDate";
|
||||
private static final String COLUMN_BOOLEAN = "aBoolean";
|
||||
private static final String COLUMN_INTEGER = "aNumber";
|
||||
private static final String COLUMN_DECIMAL = "aDecimal";
|
||||
private static final String COLUMN_TRANSACTION_ID = "savings_transaction_id";
|
||||
private static final String COLUMN_ID = "id";
|
||||
private static final String COLUMN_SUBMITTED_DATE = "submitted_on_date";
|
||||
private static final String COLUMN_AMOUNT = "amount";
|
||||
|
||||
private RequestSpecification requestSpec;
|
||||
private ResponseSpecification responseSpec;
|
||||
private DatatableHelper datatableHelper;
|
||||
private SavingsProductHelper savingsProductHelper;
|
||||
private SavingsAccountHelper savingsAccountHelper;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
Utils.initializeRESTAssured();
|
||||
requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
|
||||
requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
|
||||
responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build();
|
||||
datatableHelper = new DatatableHelper(requestSpec, responseSpec);
|
||||
savingsAccountHelper = new SavingsAccountHelper(requestSpec, responseSpec);
|
||||
savingsProductHelper = new SavingsProductHelper();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDatatableAdvancedQuery() {
|
||||
String datatable = createAndVerifyDatatable(SAVINGS_TRANSACTION_APP_TABLE_NAME, null, false);
|
||||
|
||||
LocalDate today = LocalDate.now(ZoneId.systemDefault());
|
||||
String todayS = DateUtils.format(today, SAVINGS_DATE_FORMAT);
|
||||
LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
|
||||
String yesterdayS = DateUtils.format(yesterday, SAVINGS_DATE_FORMAT);
|
||||
try {
|
||||
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, true);
|
||||
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, today);
|
||||
|
||||
final Integer clientId = ClientHelper.createClient(requestSpec, responseSpec, yesterdayS);
|
||||
assertNotNull(clientId);
|
||||
final Integer savingsId = createSavingsAccountDailyPosting(clientId, yesterdayS);
|
||||
assertNotNull(savingsId);
|
||||
|
||||
final Integer transactionIdD1 = (Integer) savingsAccountHelper.depositToSavingsAccount(savingsId, "100", yesterdayS,
|
||||
CommonConstants.RESPONSE_RESOURCE_ID);
|
||||
assertNotNull(transactionIdD1);
|
||||
BigDecimal decValue1 = new BigDecimal("1.111");
|
||||
createDatatableEntry(datatable, transactionIdD1, yesterday, true, 1, decValue1);
|
||||
final Integer transactionIdD2 = (Integer) savingsAccountHelper.depositToSavingsAccount(savingsId, "300", yesterdayS,
|
||||
CommonConstants.RESPONSE_RESOURCE_ID);
|
||||
assertNotNull(transactionIdD2);
|
||||
createDatatableEntry(datatable, transactionIdD2, yesterday, false, 2, new BigDecimal("2.2"));
|
||||
final Integer transactionIdW1 = (Integer) savingsAccountHelper.withdrawalFromSavingsAccount(savingsId, "100", todayS,
|
||||
CommonConstants.RESPONSE_RESOURCE_ID);
|
||||
assertNotNull(transactionIdW1);
|
||||
createDatatableEntry(datatable, transactionIdW1, today, true, 3, new BigDecimal("3"));
|
||||
|
||||
String yesterdayIsoS = DateUtils.format(yesterday, DateUtils.DEFAULT_DATE_FORMAT);
|
||||
String todayIsoS = DateUtils.format(today, DateUtils.DEFAULT_DATE_FORMAT);
|
||||
AdvancedQueryData query = new AdvancedQueryData()
|
||||
.resultColumns(List.of(COLUMN_TRANSACTION_ID, COLUMN_STRING, COLUMN_TEXT, COLUMN_DATE, COLUMN_BOOLEAN, COLUMN_INTEGER,
|
||||
COLUMN_DECIMAL))
|
||||
.addColumnFiltersItem(new ColumnFilterData().column(COLUMN_TEXT)
|
||||
.addFiltersItem(new FilterData().operator(EQ).values(List.of(transactionIdD1.toString()))))
|
||||
.addColumnFiltersItem(new ColumnFilterData().column(COLUMN_DATE)
|
||||
.addFiltersItem(new FilterData().operator(BTW).values(List.of(yesterdayIsoS, yesterdayIsoS))));
|
||||
PagedLocalRequestAdvancedQueryData pagedQuery = new PagedLocalRequestAdvancedQueryData().page(0).size(3)
|
||||
.addSortsItem(new SortOrder().property("created_at").direction(SortOrder.DirectionEnum.DESC))
|
||||
.addSortsItem(new SortOrder().property(COLUMN_TRANSACTION_ID).direction(SortOrder.DirectionEnum.DESC)).request(query);
|
||||
Map<String, Object> response = datatableHelper.queryDatatable(datatable, pagedQuery);
|
||||
|
||||
assertEquals(1, response.get("total"));
|
||||
List content = (List) response.get("content");
|
||||
assertNotNull(content);
|
||||
assertEquals(1, content.size());
|
||||
Map<String, Object> first = (Map<String, Object>) content.get(0);
|
||||
assertEquals(transactionIdD1, first.get(COLUMN_TRANSACTION_ID));
|
||||
assertEquals(transactionIdD1.toString(), first.get(COLUMN_TEXT));
|
||||
assertEquals(yesterdayIsoS, first.get(COLUMN_DATE));
|
||||
assertTrue((Boolean) first.get(COLUMN_BOOLEAN));
|
||||
assertEquals(1, first.get(COLUMN_INTEGER));
|
||||
assertEquals(decValue1.floatValue(), first.get(COLUMN_DECIMAL));
|
||||
|
||||
query.resultColumns(List.of(COLUMN_TRANSACTION_ID));
|
||||
query.columnFilters(List.of(
|
||||
new ColumnFilterData().column(COLUMN_INTEGER).addFiltersItem(new FilterData().operator(GTE).values(List.of("1"))),
|
||||
new ColumnFilterData().column(COLUMN_DATE)
|
||||
.addFiltersItem(new FilterData().operator(BTW).values(List.of(yesterdayIsoS, todayIsoS)))));
|
||||
response = datatableHelper.queryDatatable(datatable, pagedQuery);
|
||||
|
||||
assertEquals(3, response.get("total"));
|
||||
content = (List) response.get("content");
|
||||
assertNotNull(content);
|
||||
assertEquals(3, content.size());
|
||||
first = (Map) content.get(0);
|
||||
assertEquals(transactionIdW1, first.get(COLUMN_TRANSACTION_ID));
|
||||
assertNull(first.get(COLUMN_TEXT));
|
||||
assertNull(first.get(COLUMN_DATE));
|
||||
assertNull(first.get(COLUMN_BOOLEAN));
|
||||
assertNull(first.get(COLUMN_INTEGER));
|
||||
assertNull(first.get(COLUMN_DECIMAL));
|
||||
assertEquals(transactionIdD2, ((Map) content.get(1)).get(COLUMN_TRANSACTION_ID));
|
||||
|
||||
deleteDatatable(datatable, transactionIdD1, transactionIdD2, transactionIdW1);
|
||||
|
||||
} finally {
|
||||
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, false);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testApptableWithDatatableAdvancedQuery() {
|
||||
String datatable = createAndVerifyDatatable(SAVINGS_TRANSACTION_APP_TABLE_NAME, null, false);
|
||||
|
||||
LocalDate today = LocalDate.now(ZoneId.systemDefault());
|
||||
String todayS = DateUtils.format(today, SAVINGS_DATE_FORMAT);
|
||||
LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
|
||||
String yesterdayS = DateUtils.format(yesterday, SAVINGS_DATE_FORMAT);
|
||||
try {
|
||||
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, true);
|
||||
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, today);
|
||||
|
||||
final Integer clientId = ClientHelper.createClient(requestSpec, responseSpec, yesterdayS);
|
||||
assertNotNull(clientId);
|
||||
final Integer savingsId = createSavingsAccountDailyPosting(clientId, yesterdayS);
|
||||
assertNotNull(savingsId);
|
||||
|
||||
final Integer transactionIdD1 = (Integer) savingsAccountHelper.depositToSavingsAccount(savingsId, "100", yesterdayS,
|
||||
CommonConstants.RESPONSE_RESOURCE_ID);
|
||||
assertNotNull(transactionIdD1);
|
||||
BigDecimal decValue1 = new BigDecimal("1.111");
|
||||
createDatatableEntry(datatable, transactionIdD1, yesterday, true, 1, decValue1);
|
||||
final Integer transactionIdD2 = (Integer) savingsAccountHelper.depositToSavingsAccount(savingsId, "300", yesterdayS,
|
||||
CommonConstants.RESPONSE_RESOURCE_ID);
|
||||
assertNotNull(transactionIdD2);
|
||||
BigDecimal decValue2 = new BigDecimal("2.2");
|
||||
createDatatableEntry(datatable, transactionIdD2, yesterday, false, 2, decValue2);
|
||||
final Integer transactionIdW1 = (Integer) savingsAccountHelper.withdrawalFromSavingsAccount(savingsId, "100", todayS,
|
||||
CommonConstants.RESPONSE_RESOURCE_ID);
|
||||
assertNotNull(transactionIdW1);
|
||||
createDatatableEntry(datatable, transactionIdW1, today, true, 3, new BigDecimal("3"));
|
||||
|
||||
String yesterdayIsoS = DateUtils.format(yesterday, DateUtils.DEFAULT_DATE_FORMAT);
|
||||
String todayIsoS = DateUtils.format(today, DateUtils.DEFAULT_DATE_FORMAT);
|
||||
|
||||
AdvancedQueryData baseQuery = new AdvancedQueryData().resultColumns(List.of(COLUMN_ID, COLUMN_SUBMITTED_DATE))
|
||||
.addColumnFiltersItem(new ColumnFilterData().column(COLUMN_AMOUNT)
|
||||
.addFiltersItem(new FilterData().operator(GT).values(List.of("100"))))
|
||||
.addColumnFiltersItem(new ColumnFilterData().column(COLUMN_SUBMITTED_DATE)
|
||||
.addFiltersItem(new FilterData().operator(BTW).values(List.of(todayIsoS, todayIsoS))));
|
||||
AdvancedQueryData dataQuery = new AdvancedQueryData()
|
||||
.resultColumns(List.of(COLUMN_TRANSACTION_ID, COLUMN_STRING, COLUMN_TEXT, COLUMN_DATE, COLUMN_BOOLEAN, COLUMN_INTEGER,
|
||||
COLUMN_DECIMAL))
|
||||
.addColumnFiltersItem(new ColumnFilterData().column(COLUMN_TEXT).addFiltersItem(
|
||||
new FilterData().operator(IN).values(List.of(transactionIdD1.toString(), transactionIdD2.toString()))))
|
||||
.addColumnFiltersItem(new ColumnFilterData().column(COLUMN_DATE)
|
||||
.addFiltersItem(new FilterData().operator(BTW).values(List.of(yesterdayIsoS, yesterdayIsoS))));
|
||||
AdvancedQueryRequest queryRequest = new AdvancedQueryRequest().baseQuery(baseQuery)
|
||||
.datatableQueries(List.of(new TableQueryData().table(datatable).query(dataQuery)));
|
||||
PagedLocalRequestAdvancedQueryRequest pagedRequest = new PagedLocalRequestAdvancedQueryRequest().page(0).size(2)
|
||||
.addSortsItem(new SortOrder().property(COLUMN_SUBMITTED_DATE).direction(SortOrder.DirectionEnum.DESC))
|
||||
.addSortsItem(new SortOrder().property(COLUMN_ID).direction(SortOrder.DirectionEnum.DESC)).request(queryRequest);
|
||||
Map<String, Object> response = savingsAccountHelper.querySavingsTransactions(savingsId, pagedRequest);
|
||||
|
||||
assertEquals(1, response.get("total"));
|
||||
List content = (List) response.get("content");
|
||||
assertNotNull(content);
|
||||
assertEquals(1, content.size());
|
||||
Map<String, Object> first = (Map<String, Object>) content.get(0);
|
||||
assertEquals(transactionIdD2, first.get(COLUMN_ID));
|
||||
assertEquals(todayIsoS, first.get(COLUMN_SUBMITTED_DATE));
|
||||
assertEquals(transactionIdD2, first.get(COLUMN_TRANSACTION_ID));
|
||||
assertEquals(transactionIdD2.toString(), first.get(COLUMN_TEXT));
|
||||
assertEquals(yesterdayIsoS, first.get(COLUMN_DATE));
|
||||
assertFalse((Boolean) first.get(COLUMN_BOOLEAN));
|
||||
assertEquals(2, first.get(COLUMN_INTEGER));
|
||||
assertEquals(decValue2.floatValue(), first.get(COLUMN_DECIMAL));
|
||||
|
||||
baseQuery.columnFilters(List.of(
|
||||
new ColumnFilterData().column(COLUMN_AMOUNT).addFiltersItem(new FilterData().operator(GTE).values(List.of("100"))),
|
||||
new ColumnFilterData().column(COLUMN_SUBMITTED_DATE)
|
||||
.addFiltersItem(new FilterData().operator(BTW).values(List.of(todayIsoS, todayIsoS)))));
|
||||
dataQuery.resultColumns(List.of(COLUMN_TRANSACTION_ID));
|
||||
dataQuery.columnFilters(List.of(
|
||||
new ColumnFilterData().column(COLUMN_INTEGER).addFiltersItem(new FilterData().operator(GTE).values(List.of("1"))),
|
||||
new ColumnFilterData().column(COLUMN_DATE)
|
||||
.addFiltersItem(new FilterData().operator(BTW).values(List.of(yesterdayIsoS, todayIsoS)))));
|
||||
response = savingsAccountHelper.querySavingsTransactions(savingsId, pagedRequest);
|
||||
|
||||
assertEquals(3, response.get("total"));
|
||||
content = (List) response.get("content");
|
||||
assertNotNull(content);
|
||||
assertEquals(2, content.size()); // page size 2
|
||||
first = (Map) content.get(0);
|
||||
assertEquals(transactionIdW1, first.get(COLUMN_ID));
|
||||
assertEquals(todayIsoS, first.get(COLUMN_SUBMITTED_DATE));
|
||||
assertEquals(transactionIdW1, first.get(COLUMN_TRANSACTION_ID));
|
||||
assertNull(first.get(COLUMN_TEXT));
|
||||
assertNull(first.get(COLUMN_DATE));
|
||||
assertNull(first.get(COLUMN_BOOLEAN));
|
||||
assertNull(first.get(COLUMN_INTEGER));
|
||||
assertNull(first.get(COLUMN_DECIMAL));
|
||||
assertEquals(transactionIdD2, ((Map) content.get(1)).get(COLUMN_TRANSACTION_ID));
|
||||
|
||||
deleteDatatable(datatable, transactionIdD1, transactionIdD2, transactionIdW1);
|
||||
|
||||
} finally {
|
||||
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, false);
|
||||
}
|
||||
}
|
||||
|
||||
private String createAndVerifyDatatable(String apptable, String subType, boolean multiRow) {
|
||||
// creating datatable for apptable entity
|
||||
final HashMap<String, Object> request = new HashMap<>();
|
||||
request.put(API_PARAM_DATATABLE_NAME, Utils.uniqueRandomStringGenerator("dt_" + apptable + "_", 5));
|
||||
request.put(API_PARAM_APPTABLE_NAME, apptable);
|
||||
if (subType != null) {
|
||||
request.put(API_PARAM_SUBTYPE, subType);
|
||||
}
|
||||
request.put(API_PARAM_MULTIROW, multiRow);
|
||||
|
||||
final List<HashMap<String, Object>> datatableColumns = new ArrayList<>();
|
||||
DatatableHelper.addDatatableColumnsWithUniqueAndIndex(datatableColumns, COLUMN_STRING, API_FIELD_TYPE_STRING, true, 50, null,
|
||||
!multiRow, true);
|
||||
DatatableHelper.addDatatableColumns(datatableColumns, COLUMN_TEXT, API_FIELD_TYPE_TEXT, false, null, null);
|
||||
DatatableHelper.addDatatableColumns(datatableColumns, COLUMN_DATE, API_FIELD_TYPE_DATE, true, null, null);
|
||||
DatatableHelper.addDatatableColumns(datatableColumns, COLUMN_BOOLEAN, API_FIELD_TYPE_BOOLEAN, false, null, null);
|
||||
DatatableHelper.addDatatableColumns(datatableColumns, COLUMN_INTEGER, API_FIELD_TYPE_NUMBER, false, null, null);
|
||||
DatatableHelper.addDatatableColumns(datatableColumns, COLUMN_DECIMAL, API_FIELD_TYPE_DECIMAL, false, null, null);
|
||||
request.put(API_PARAM_COLUMNS, datatableColumns);
|
||||
|
||||
String requestJson = new Gson().toJson(request);
|
||||
LOG.info("map : {}", requestJson);
|
||||
|
||||
PostDataTablesResponse response = datatableHelper.createDatatable(requestJson);
|
||||
String datatable = response.getResourceIdentifier();
|
||||
assertNotNull(datatable);
|
||||
GetDataTablesResponse dataTable = datatableHelper.getDataTableDetails(datatable);
|
||||
List<ResultsetColumnHeaderData> columnHeaderData = dataTable.getColumnHeaderData();
|
||||
assertNotNull(columnHeaderData);
|
||||
// pk column and 2 audit columns were added automatically
|
||||
assertEquals(9, columnHeaderData.size());
|
||||
return datatable;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private HashMap<String, Object> createDatatableEntry(String datatable, Integer apptableId, LocalDate dateValue, Boolean boolValue,
|
||||
Integer intValue, BigDecimal decValue) {
|
||||
final HashMap<String, Object> request = new HashMap<>();
|
||||
request.put(COLUMN_STRING, Utils.uniqueRandomStringGenerator(apptableId.toString() + "_", 5));
|
||||
request.put(COLUMN_TEXT, apptableId);
|
||||
request.put(COLUMN_DATE, DateUtils.format(dateValue, SAVINGS_DATE_FORMAT));
|
||||
request.put(COLUMN_BOOLEAN, boolValue);
|
||||
request.put(COLUMN_INTEGER, intValue == null ? null : intValue.toString());
|
||||
request.put(COLUMN_DECIMAL, decValue == null ? null : decValue.toString());
|
||||
request.put("locale", "en");
|
||||
request.put("dateFormat", SAVINGS_DATE_FORMAT);
|
||||
|
||||
String requestJson = new Gson().toJson(request);
|
||||
HashMap<String, Object> response = datatableHelper.createDatatableEntry(datatable, apptableId, true, requestJson);
|
||||
assertNotNull(response.get("resourceId"));
|
||||
return response;
|
||||
}
|
||||
|
||||
private void deleteDatatable(String datatable, Integer... apptableIds) {
|
||||
for (Integer apptableId : apptableIds) {
|
||||
Integer deletedId = this.datatableHelper.deleteDatatableEntries(datatable, apptableId, "resourceId");
|
||||
assertEquals(apptableId, deletedId, "ERROR IN DELETING THE DATATABLE ENTRY");
|
||||
}
|
||||
String deletedDatatable = this.datatableHelper.deleteDatatable(datatable);
|
||||
assertEquals(datatable, deletedDatatable, "ERROR IN DELETING THE DATATABLE");
|
||||
}
|
||||
|
||||
private Integer createSavingsProductDailyPosting() {
|
||||
final String savingsProductJSON = savingsProductHelper.withInterestCompoundingPeriodTypeAsDaily()
|
||||
.withInterestPostingPeriodTypeAsDaily().withInterestCalculationPeriodTypeAsDailyBalance().build();
|
||||
return SavingsProductHelper.createSavingsProduct(savingsProductJSON, requestSpec, responseSpec);
|
||||
}
|
||||
|
||||
private Integer createSavingsAccountDailyPosting(final Integer clientID, final String startDate) {
|
||||
final Integer savingsProductID = createSavingsProductDailyPosting();
|
||||
assertNotNull(savingsProductID);
|
||||
final Integer savingsId = savingsAccountHelper.applyForSavingsApplicationOnDate(clientID, savingsProductID, ACCOUNT_TYPE_INDIVIDUAL,
|
||||
startDate);
|
||||
assertNotNull(savingsId);
|
||||
HashMap savingsStatusHashMap = savingsAccountHelper.approveSavingsOnDate(savingsId, startDate);
|
||||
SavingsStatusChecker.verifySavingsIsApproved(savingsStatusHashMap);
|
||||
savingsStatusHashMap = savingsAccountHelper.activateSavingsAccount(savingsId, startDate);
|
||||
SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
|
||||
return savingsId;
|
||||
}
|
||||
}
|
||||
+65
-62
@@ -456,83 +456,86 @@ public class DatatableIntegrationTest extends IntegrationTest {
|
||||
// creating new client datatable entry
|
||||
final boolean genericResultSet = true;
|
||||
|
||||
HashMap<String, Object> datatableEntryMap = new HashMap<>();
|
||||
datatableEntryMap.put("itsABoolean", null);
|
||||
datatableEntryMap.put("itsADate", null);
|
||||
datatableEntryMap.put("itsADatetime", null);
|
||||
datatableEntryMap.put("itsADecimal", null);
|
||||
datatableEntryMap.put("TST_TST_TST_cd_itsADropdown", null);
|
||||
datatableEntryMap.put("itsANumber", null);
|
||||
datatableEntryMap.put("itsAString", null);
|
||||
datatableEntryMap.put("itsAText", null);
|
||||
HashMap<String, Object> firstEntryMap = new HashMap<>();
|
||||
firstEntryMap.put("itsABoolean", null);
|
||||
firstEntryMap.put("itsADate", null);
|
||||
firstEntryMap.put("itsADatetime", null);
|
||||
firstEntryMap.put("itsADecimal", null);
|
||||
firstEntryMap.put("TST_TST_TST_cd_itsADropdown", null);
|
||||
firstEntryMap.put("itsANumber", null);
|
||||
firstEntryMap.put("itsAString", null);
|
||||
firstEntryMap.put("itsAText", null);
|
||||
|
||||
datatableEntryMap.put("locale", "en");
|
||||
datatableEntryMap.put("dateFormat", "yyyy-MM-dd");
|
||||
firstEntryMap.put("locale", "en");
|
||||
firstEntryMap.put("dateFormat", "yyyy-MM-dd");
|
||||
|
||||
String datatableEntryRequestJsonString = new GsonBuilder().serializeNulls().create().toJson(datatableEntryMap);
|
||||
LOG.info("map : {}", datatableEntryRequestJsonString);
|
||||
String firstEntryRequestJsonString = new GsonBuilder().serializeNulls().create().toJson(firstEntryMap);
|
||||
LOG.info("map : {}", firstEntryRequestJsonString);
|
||||
|
||||
HashMap<String, Object> datatableEntryResponseFirst = this.datatableHelper.createDatatableEntry(datatableName, loanID,
|
||||
genericResultSet, datatableEntryRequestJsonString);
|
||||
HashMap<String, Object> firstEntryResponse = this.datatableHelper.createDatatableEntry(datatableName, loanID, genericResultSet,
|
||||
firstEntryRequestJsonString);
|
||||
assertNotNull(firstEntryResponse.get("resourceId"), "ERROR IN CREATING THE ENTITY DATATABLE RECORD");
|
||||
|
||||
datatableEntryMap = new HashMap<>();
|
||||
datatableEntryMap.put("itsABoolean", "");
|
||||
datatableEntryMap.put("itsADate", "");
|
||||
datatableEntryMap.put("itsADatetime", "");
|
||||
datatableEntryMap.put("itsADecimal", "");
|
||||
datatableEntryMap.put("TST_TST_TST_cd_itsADropdown", "");
|
||||
datatableEntryMap.put("itsANumber", "");
|
||||
datatableEntryMap.put("itsAString", "");
|
||||
datatableEntryMap.put("itsAText", "");
|
||||
HashMap<String, Object> secondEntryMap = new HashMap<>();
|
||||
secondEntryMap.put("itsABoolean", "");
|
||||
secondEntryMap.put("itsADate", "");
|
||||
secondEntryMap.put("itsADatetime", "");
|
||||
secondEntryMap.put("itsADecimal", "");
|
||||
secondEntryMap.put("TST_TST_TST_cd_itsADropdown", "");
|
||||
secondEntryMap.put("itsANumber", "");
|
||||
secondEntryMap.put("itsAString", "");
|
||||
secondEntryMap.put("itsAText", "");
|
||||
|
||||
datatableEntryMap.put("locale", "en");
|
||||
datatableEntryMap.put("dateFormat", "yyyy-MM-dd");
|
||||
secondEntryMap.put("locale", "en");
|
||||
secondEntryMap.put("dateFormat", "yyyy-MM-dd");
|
||||
|
||||
datatableEntryRequestJsonString = new GsonBuilder().serializeNulls().create().toJson(datatableEntryMap);
|
||||
HashMap<String, Object> datatableEntryResponseSecond = this.datatableHelper.createDatatableEntry(datatableName, loanID,
|
||||
genericResultSet, datatableEntryRequestJsonString);
|
||||
assertNotNull(datatableEntryResponseFirst.get("resourceId"), "ERROR IN CREATING THE ENTITY DATATABLE RECORD");
|
||||
assertNotNull(datatableEntryResponseSecond.get("resourceId"), "ERROR IN CREATING THE ENTITY DATATABLE RECORD");
|
||||
String secondEntryRequestJsonString = new GsonBuilder().serializeNulls().create().toJson(secondEntryMap);
|
||||
HashMap<String, Object> secondEntryResponse = this.datatableHelper.createDatatableEntry(datatableName, loanID, genericResultSet,
|
||||
secondEntryRequestJsonString);
|
||||
assertNotNull(secondEntryResponse.get("resourceId"), "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, loanID, genericResultSet, null, "");
|
||||
assertNotNull(items);
|
||||
assertEquals(2, ((List) items.get("data")).size());
|
||||
|
||||
assertEquals("id", ((Map) ((List) items.get("columnHeaders")).get(0)).get("columnName"));
|
||||
assertEquals(1, ((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(0));
|
||||
assertEquals("loan_id", ((Map) ((List) items.get("columnHeaders")).get(1)).get("columnName"));
|
||||
assertEquals(loanID, ((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(1));
|
||||
assertEquals("itsABoolean", ((Map) ((List) items.get("columnHeaders")).get(2)).get("columnName"));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(2));
|
||||
assertEquals("itsADate", ((Map) ((List) items.get("columnHeaders")).get(3)).get("columnName"));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(3));
|
||||
assertEquals("itsADatetime", ((Map) ((List) items.get("columnHeaders")).get(4)).get("columnName"));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(4));
|
||||
assertEquals("itsADecimal", ((Map) ((List) items.get("columnHeaders")).get(5)).get("columnName"));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(5));
|
||||
assertEquals("TST_TST_TST_cd_itsADropdown", ((Map) ((List) items.get("columnHeaders")).get(6)).get("columnName"));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(6));
|
||||
assertEquals("itsANumber", ((Map) ((List) items.get("columnHeaders")).get(7)).get("columnName"));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(7));
|
||||
assertEquals("itsAString", ((Map) ((List) items.get("columnHeaders")).get(8)).get("columnName"));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(8));
|
||||
assertEquals("itsAText", ((Map) ((List) items.get("columnHeaders")).get(9)).get("columnName"));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(0)).get("row")).get(9));
|
||||
List headers = (List) items.get("columnHeaders");
|
||||
List firstEntryValues = (List) ((Map) ((List) items.get("data")).get(0)).get("row");
|
||||
assertEquals("id", ((Map) headers.get(0)).get("columnName"));
|
||||
assertEquals(1, firstEntryValues.get(0));
|
||||
assertEquals("loan_id", ((Map) headers.get(1)).get("columnName"));
|
||||
assertEquals(loanID, firstEntryValues.get(1));
|
||||
assertEquals("itsABoolean", ((Map) headers.get(2)).get("columnName"));
|
||||
assertNull(firstEntryValues.get(2));
|
||||
assertEquals("itsADate", ((Map) headers.get(3)).get("columnName"));
|
||||
assertNull(firstEntryValues.get(3));
|
||||
assertEquals("itsADatetime", ((Map) headers.get(4)).get("columnName"));
|
||||
assertNull(firstEntryValues.get(4));
|
||||
assertEquals("itsADecimal", ((Map) headers.get(5)).get("columnName"));
|
||||
assertNull(firstEntryValues.get(5));
|
||||
assertEquals("TST_TST_TST_cd_itsADropdown", ((Map) headers.get(6)).get("columnName"));
|
||||
assertNull(firstEntryValues.get(6));
|
||||
assertEquals("itsANumber", ((Map) headers.get(7)).get("columnName"));
|
||||
assertNull(firstEntryValues.get(7));
|
||||
assertEquals("itsAString", ((Map) headers.get(8)).get("columnName"));
|
||||
assertNull(firstEntryValues.get(8));
|
||||
assertEquals("itsAText", ((Map) headers.get(9)).get("columnName"));
|
||||
assertNull(firstEntryValues.get(9));
|
||||
|
||||
assertEquals(2, ((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(0));
|
||||
assertEquals(loanID, ((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(1));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(2));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(3));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(4));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(5));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(6));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(7));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(8));
|
||||
assertNull(((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(9));
|
||||
List secondEntryValues = (List) ((Map) ((List) items.get("data")).get(1)).get("row");
|
||||
assertEquals(2, secondEntryValues.get(0));
|
||||
assertEquals(loanID, secondEntryValues.get(1));
|
||||
assertNull(secondEntryValues.get(2));
|
||||
assertNull(secondEntryValues.get(3));
|
||||
assertNull(secondEntryValues.get(4));
|
||||
assertNull(secondEntryValues.get(5));
|
||||
assertNull(secondEntryValues.get(6));
|
||||
assertNull(secondEntryValues.get(7));
|
||||
assertNull(secondEntryValues.get(8));
|
||||
assertNull(secondEntryValues.get(9));
|
||||
|
||||
PutDataTablesAppTableIdDatatableIdResponse updatedDatatableEntryResponse = this.datatableHelper.updateDatatableEntry(datatableName,
|
||||
loanID, 1, datatableEntryRequestJsonString);
|
||||
loanID, 1, secondEntryRequestJsonString);
|
||||
assertNotNull(updatedDatatableEntryResponse);
|
||||
assertEquals(0, updatedDatatableEntryResponse.getChanges().size());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user