Datatable integration test
This commit is contained in:
committed by
Arnold Gálovics
parent
6849f45bb8
commit
64bfe33766
+1
-1
@@ -117,7 +117,7 @@ allprojects {
|
||||
spotless {
|
||||
format 'misc', {
|
||||
target '**/*.md', '**/*.properties', '**/.gitignore', '**/.openapi-generator-ignore', '**/*.yml', '**/*.xml', '**/**.json', '**/*.sql'
|
||||
targetExclude '**/build/**', '**/bin/**', '**/.settings/**', '**/.idea/**', '**/.gradle/**', '**/gradlew.bat', '**/licenses/**', '**/banner.txt'
|
||||
targetExclude '**/build/**', '**/bin/**', '**/.settings/**', '**/.idea/**', '**/.gradle/**', '**/gradlew.bat', '**/licenses/**', '**/banner.txt', '.vscode/**'
|
||||
indentWithSpaces(4)
|
||||
endWithNewline()
|
||||
trimTrailingWhitespace()
|
||||
|
||||
+3
@@ -37,6 +37,9 @@ import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidati
|
||||
|
||||
public final class DateUtils {
|
||||
|
||||
public static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
||||
public static final DateTimeFormatter DEFAULT_DATETIME_FORMATER = DateTimeFormatter.ofPattern(DEFAULT_DATETIME_FORMAT);
|
||||
|
||||
private DateUtils() {
|
||||
|
||||
}
|
||||
|
||||
-4
@@ -53,7 +53,6 @@ import org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData;
|
||||
import org.apache.fineract.infrastructure.dataqueries.service.GenericDataService;
|
||||
import org.apache.fineract.infrastructure.dataqueries.service.ReadWriteNonCoreDataService;
|
||||
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
@@ -71,7 +70,6 @@ public class DatatablesApiResource {
|
||||
private final ReadWriteNonCoreDataService readWriteNonCoreDataService;
|
||||
private final ToApiJsonSerializer<GenericResultsetData> toApiJsonSerializer;
|
||||
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
|
||||
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(DatatablesApiResource.class);
|
||||
|
||||
@Autowired
|
||||
public DatatablesApiResource(final PlatformSecurityContext context, final GenericDataService genericDataService,
|
||||
@@ -259,8 +257,6 @@ public class DatatablesApiResource {
|
||||
public String getDatatableManyEntry(@PathParam("datatable") final String datatable, @PathParam("apptableId") final Long apptableId,
|
||||
@PathParam("datatableId") final Long datatableId, @QueryParam("order") final String order, @Context final UriInfo uriInfo) {
|
||||
|
||||
LOG.debug("::1 we came in the getDatatbleManyEntry apiRessource method");
|
||||
|
||||
this.context.authenticatedUser().validateHasDatatableReadPermission(datatable);
|
||||
|
||||
final GenericResultsetData results = this.readWriteNonCoreDataService.retrieveDataTableGenericResultSet(datatable, apptableId,
|
||||
|
||||
+14
-5
@@ -25,6 +25,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javax.sql.DataSource;
|
||||
import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException;
|
||||
import org.apache.fineract.infrastructure.core.service.DateUtils;
|
||||
import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
|
||||
import org.apache.fineract.infrastructure.core.service.database.DatabaseIndependentQueryService;
|
||||
import org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData;
|
||||
@@ -32,8 +33,6 @@ import org.apache.fineract.infrastructure.dataqueries.data.ResultsetColumnHeader
|
||||
import org.apache.fineract.infrastructure.dataqueries.data.ResultsetColumnValueData;
|
||||
import org.apache.fineract.infrastructure.dataqueries.data.ResultsetRowData;
|
||||
import org.apache.fineract.infrastructure.dataqueries.exception.DatatableNotFoundException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.dao.DataAccessException;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
@@ -47,7 +46,6 @@ public class GenericDataServiceImpl implements GenericDataService {
|
||||
private final JdbcTemplate jdbcTemplate;
|
||||
private final DataSource dataSource;
|
||||
private final DatabaseIndependentQueryService databaseIndependentQueryService;
|
||||
private static final Logger LOG = LoggerFactory.getLogger(GenericDataServiceImpl.class);
|
||||
|
||||
@Autowired
|
||||
public GenericDataServiceImpl(final RoutingDataSource dataSource, final JdbcTemplate jdbcTemplate,
|
||||
@@ -169,9 +167,10 @@ public class GenericDataServiceImpl implements GenericDataService {
|
||||
writer.append(
|
||||
"[" + localDate.getYear() + ", " + localDate.getMonthValue() + ", " + localDate.getDayOfMonth() + "]");
|
||||
} else if (currColType.equals("DATETIME")) {
|
||||
final LocalDateTime localDateTime = LocalDateTime.parse(currVal);
|
||||
final LocalDateTime localDateTime = LocalDateTime.parse(formatDateTimeValue(currVal),
|
||||
DateUtils.DEFAULT_DATETIME_FORMATER);
|
||||
writer.append("[" + localDateTime.getYear() + ", " + localDateTime.getMonthValue() + ", "
|
||||
+ localDateTime.getDayOfMonth() + " " + localDateTime.getHour() + ", " + localDateTime.getMinute()
|
||||
+ localDateTime.getDayOfMonth() + ", " + localDateTime.getHour() + ", " + localDateTime.getMinute()
|
||||
+ ", " + localDateTime.getSecond() + ", " + localDateTime.get(ChronoField.MILLI_OF_SECOND) + "]");
|
||||
} else {
|
||||
writer.append(doubleQuote + replace(currVal, doubleQuote, slashDoubleQuote) + doubleQuote);
|
||||
@@ -262,4 +261,14 @@ public class GenericDataServiceImpl implements GenericDataService {
|
||||
throw new DatatableNotFoundException(datatable);
|
||||
}
|
||||
}
|
||||
|
||||
private String formatDateTimeValue(String dateTimeValue) {
|
||||
if (dateTimeValue.length() > 19) {
|
||||
dateTimeValue = dateTimeValue.substring(0, 19);
|
||||
}
|
||||
if (dateTimeValue.contains("T")) {
|
||||
dateTimeValue = dateTimeValue.replace("T", " ");
|
||||
}
|
||||
return dateTimeValue;
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -1710,7 +1710,8 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
// ignores id and foreign key fields
|
||||
// also ignores locale and dateformat fields that are used for
|
||||
// validating numeric and date data
|
||||
if (!(key.equalsIgnoreCase("id") || key.equalsIgnoreCase(keyFieldName) || key.equals("locale") || key.equals("dateFormat"))) {
|
||||
if (!(key.equalsIgnoreCase("id") || key.equalsIgnoreCase(keyFieldName) || key.equals("locale") || key.equals("dateFormat")
|
||||
|| key.equals(DataTableApiConstant.CREATEDAT_FIELD_NAME) || key.equals(DataTableApiConstant.UPDATEDAT_FIELD_NAME))) {
|
||||
notFound = true;
|
||||
// matches incoming fields with and without underscores (spaces
|
||||
// and underscores considered the same)
|
||||
|
||||
+46
@@ -23,6 +23,9 @@ import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||
import io.restassured.RestAssured;
|
||||
import io.restassured.http.ContentType;
|
||||
@@ -37,8 +40,12 @@ import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDate;
|
||||
import java.time.ZoneId;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.TimeZone;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.fineract.infrastructure.core.service.DateUtils;
|
||||
@@ -59,6 +66,7 @@ public final class Utils {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(Utils.class);
|
||||
private static final SecureRandom random = new SecureRandom();
|
||||
private static final Gson gson = new Gson();
|
||||
|
||||
public static final String TENANT_PARAM_NAME = "tenantIdentifier";
|
||||
public static final String DEFAULT_TENANT = "default";
|
||||
@@ -157,6 +165,20 @@ public final class Utils {
|
||||
return (T) JsonPath.from(json).get(jsonAttributeToGetBack);
|
||||
}
|
||||
|
||||
public static List<String> performServerGetList(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
|
||||
final String getURL, final String jsonAttributeToGetBack) {
|
||||
final JsonPath jsonPath = given().spec(requestSpec).expect().spec(responseSpec).log().ifError().when().get(getURL).jsonPath();
|
||||
List<String> items = jsonPath.getList(jsonAttributeToGetBack);
|
||||
return items;
|
||||
}
|
||||
|
||||
public static JsonElement performServerGetArray(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
|
||||
final String getURL, final int position, final String jsonAttributeToGetBack) {
|
||||
final JsonPath jsonPath = given().spec(requestSpec).expect().spec(responseSpec).log().ifError().when().get(getURL).jsonPath();
|
||||
List<Map<String, Object>> items = jsonPath.getList("$");
|
||||
return gson.fromJson(((ArrayList) items.get(position).get(jsonAttributeToGetBack)).toString(), JsonArray.class);
|
||||
}
|
||||
|
||||
public static String performGetTextResponse(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
|
||||
final String getURL) {
|
||||
return given().spec(requestSpec).expect().spec(responseSpec).log().ifError().when().get(getURL).andReturn().asString();
|
||||
@@ -251,6 +273,12 @@ public final class Utils {
|
||||
return dateFormat.format(dateToBeConvert.getTime());
|
||||
}
|
||||
|
||||
public static String convertDateToURLFormat(final Calendar dateToBeConvert, final String dateGormat) {
|
||||
DateFormat dateFormat = new SimpleDateFormat(dateGormat);
|
||||
dateFormat.setTimeZone(Utils.getTimeZoneOfTenant());
|
||||
return dateFormat.format(dateToBeConvert.getTime());
|
||||
}
|
||||
|
||||
public static LocalDate getLocalDateOfTenant() {
|
||||
LocalDate today = LocalDate.now(DateUtils.getDateTimeZoneOfTenant());
|
||||
final ZoneId zone = ZoneId.of(TENANT_TIME_ZONE);
|
||||
@@ -264,6 +292,24 @@ public final class Utils {
|
||||
return TimeZone.getTimeZone(TENANT_TIME_ZONE);
|
||||
}
|
||||
|
||||
public static Date convertJsonElementAsDate(JsonElement jsonElement) {
|
||||
if (jsonElement.isJsonArray()) {
|
||||
JsonArray jsonArray = jsonElement.getAsJsonArray();
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
calendar.set(Calendar.YEAR, jsonArray.get(0).getAsInt());
|
||||
calendar.set(Calendar.MONTH, jsonArray.get(1).getAsInt() - 1);
|
||||
calendar.set(Calendar.DATE, jsonArray.get(2).getAsInt());
|
||||
// If the Array includes Time
|
||||
if (jsonArray.size() > 3) {
|
||||
calendar.set(Calendar.HOUR, jsonArray.get(3).getAsInt());
|
||||
calendar.set(Calendar.MINUTE, jsonArray.get(4).getAsInt());
|
||||
calendar.set(Calendar.SECOND, jsonArray.get(5).getAsInt());
|
||||
}
|
||||
return calendar.getTime();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String performServerTemplatePost(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
|
||||
final String postURL, final String legalFormType, final File file, final String locale, final String dateFormat) {
|
||||
|
||||
|
||||
+20
@@ -81,6 +81,26 @@ public class EntityDatatableChecksIntegrationTest {
|
||||
this.datatableHelper = new DatatableHelper(this.requestSpec, this.responseSpec);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateCreateDeleteDatatableCheck() {
|
||||
// creating datatable
|
||||
String datatableName = this.datatableHelper.createDatatable(CLIENT_APP_TABLE_NAME, false);
|
||||
DatatableHelper.verifyDatatableCreatedOnServer(this.requestSpec, this.responseSpec, datatableName);
|
||||
|
||||
// creating new entity datatable check
|
||||
Integer entityDatatableCheckId = this.entityDatatableChecksHelper.createEntityDatatableCheck(CLIENT_APP_TABLE_NAME, datatableName,
|
||||
100, null);
|
||||
assertNotNull(entityDatatableCheckId, "ERROR IN CREATING THE ENTITY DATATABLE CHECK");
|
||||
|
||||
// deleting entity datatable check
|
||||
entityDatatableCheckId = this.entityDatatableChecksHelper.deleteEntityDatatableCheck(entityDatatableCheckId);
|
||||
assertNotNull(entityDatatableCheckId, "ERROR IN DELETING THE ENTITY DATATABLE CHECK");
|
||||
|
||||
// deleting the datatable
|
||||
String deletedDataTableName = this.datatableHelper.deleteDatatable(datatableName);
|
||||
assertEquals(datatableName, deletedDataTableName, "ERROR IN DELETING THE DATATABLE");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateCreateDeleteEntityDatatableCheck() {
|
||||
// creating datatable
|
||||
|
||||
+43
@@ -21,9 +21,12 @@ package org.apache.fineract.integrationtests.common.system;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonElement;
|
||||
import io.restassured.specification.RequestSpecification;
|
||||
import io.restassured.specification.ResponseSpecification;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import org.apache.fineract.integrationtests.common.Utils;
|
||||
@@ -48,6 +51,33 @@ public class DatatableHelper {
|
||||
getTestDatatableAsJSON(apptableName, multiRow), "resourceIdentifier");
|
||||
}
|
||||
|
||||
public Integer createDatatableEntry(final String apptableName, final String datatableName, final Integer apptableId,
|
||||
final boolean genericResultSet, final String dateFormat) {
|
||||
return Utils.performServerPost(
|
||||
this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + apptableId + "?genericResultSet="
|
||||
+ Boolean.toString(genericResultSet) + "&" + Utils.TENANT_IDENTIFIER,
|
||||
getTestDatatableEntryAsJSON(dateFormat), "resourceId");
|
||||
}
|
||||
|
||||
public String readDatatableEntry(final String datatableName, final Integer resourceId, final boolean genericResultset) {
|
||||
return Utils.performServerGet(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + resourceId
|
||||
+ "?genericResultSet=" + String.valueOf(genericResultset) + "&" + Utils.TENANT_IDENTIFIER);
|
||||
}
|
||||
|
||||
public List<String> readDatatableEntry(final String datatableName, final Integer resourceId, final boolean genericResultset,
|
||||
final String jsonAttributeToGetBack) {
|
||||
return Utils.performServerGetList(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + resourceId
|
||||
+ "?genericResultSet=" + String.valueOf(genericResultset) + "&" + Utils.TENANT_IDENTIFIER, jsonAttributeToGetBack);
|
||||
}
|
||||
|
||||
public Date readDatatableEntry(final String datatableName, final Integer resourceId, final boolean genericResultset, final int position,
|
||||
final String jsonAttributeToGetBack) {
|
||||
final JsonElement jsonElement = Utils.performServerGetArray(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName
|
||||
+ "/" + resourceId + "?genericResultSet=" + String.valueOf(genericResultset) + "&" + Utils.TENANT_IDENTIFIER, position,
|
||||
jsonAttributeToGetBack);
|
||||
return Utils.convertJsonElementAsDate(jsonElement);
|
||||
}
|
||||
|
||||
public String deleteDatatable(final String datatableName) {
|
||||
return Utils.performServerDelete(this.requestSpec, this.responseSpec,
|
||||
DATATABLE_URL + "/" + datatableName + "?" + Utils.TENANT_IDENTIFIER, "resourceIdentifier");
|
||||
@@ -84,6 +114,19 @@ public class DatatableHelper {
|
||||
return requestJsonString;
|
||||
}
|
||||
|
||||
public static String getTestDatatableEntryAsJSON(final String dateFormat) {
|
||||
final HashMap<String, Object> map = new HashMap<>();
|
||||
map.put("Spouse Name", Utils.randomNameGenerator("Spouse_Name_", 5));
|
||||
map.put("Number of Dependents", Utils.randomNumberGenerator(1));
|
||||
map.put("Date of Approval", Utils.convertDateToURLFormat(Calendar.getInstance(), dateFormat));
|
||||
map.put("locale", "en");
|
||||
map.put("dateFormat", dateFormat);
|
||||
|
||||
String requestJsonString = new Gson().toJson(map);
|
||||
LOG.info("map : {}", requestJsonString);
|
||||
return requestJsonString;
|
||||
}
|
||||
|
||||
public static List<HashMap<String, Object>> addDatatableColumns(List<HashMap<String, Object>> datatableColumnsList, String columnName,
|
||||
String columnType, boolean isMandatory, Integer length) {
|
||||
|
||||
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
/**
|
||||
* 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.common.system;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
|
||||
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.util.Date;
|
||||
import java.util.List;
|
||||
import org.apache.fineract.integrationtests.common.ClientHelper;
|
||||
import org.apache.fineract.integrationtests.common.Utils;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class DatatableIntegrationTest {
|
||||
|
||||
private RequestSpecification requestSpec;
|
||||
private ResponseSpecification responseSpec;
|
||||
private DatatableHelper datatableHelper;
|
||||
|
||||
private static final String CLIENT_APP_TABLE_NAME = "m_client";
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
Utils.initializeRESTAssured();
|
||||
this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
|
||||
this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
|
||||
this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build();
|
||||
this.datatableHelper = new DatatableHelper(this.requestSpec, this.responseSpec);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateCreateReadDeleteDatatable() {
|
||||
// creating datatable for client entity
|
||||
String datatableName = this.datatableHelper.createDatatable(CLIENT_APP_TABLE_NAME, false);
|
||||
DatatableHelper.verifyDatatableCreatedOnServer(this.requestSpec, this.responseSpec, datatableName);
|
||||
|
||||
// creating client with datatables
|
||||
final Integer clientID = ClientHelper.createClientAsPerson(requestSpec, responseSpec);
|
||||
|
||||
// creating new client datatable entry
|
||||
final boolean genericResultSet = true;
|
||||
Integer datatableResourceID = this.datatableHelper.createDatatableEntry(CLIENT_APP_TABLE_NAME, datatableName, clientID,
|
||||
genericResultSet, "yyyy-MM-dd");
|
||||
assertNotNull(datatableResourceID, "ERROR IN CREATING THE ENTITY DATATABLE RECORD");
|
||||
|
||||
// Read the Datatable entry generated with genericResultSet in true (default)
|
||||
final List<String> items = this.datatableHelper.readDatatableEntry(datatableName, clientID, genericResultSet, "data");
|
||||
assertEquals(1, items.size());
|
||||
|
||||
// Read the Datatable entry generated with genericResultSet in false
|
||||
final Date valueDate = this.datatableHelper.readDatatableEntry(datatableName, clientID, !genericResultSet, 0, "Date of Approval");
|
||||
assertNotNull(valueDate, "ERROR IN GETTING THE DATE VALUE FROM DATATABLE RECORD");
|
||||
assertInstanceOf(Date.class, valueDate);
|
||||
|
||||
// deleting datatable entries
|
||||
Integer appTableId = this.datatableHelper.deleteDatatableEntries(datatableName, clientID, "clientId");
|
||||
assertEquals(clientID, appTableId, "ERROR IN DELETING THE DATATABLE ENTRIES");
|
||||
|
||||
// deleting the datatable
|
||||
String deletedDataTableName = this.datatableHelper.deleteDatatable(datatableName);
|
||||
assertEquals(datatableName, deletedDataTableName, "ERROR IN DELETING THE DATATABLE");
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user