This is an automated email from the ASF dual-hosted git repository.
arnold 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 7c0c525cd FINERACT-1724: Wrong status (error) code retrieved when
invalid request was provided to Batch API
7c0c525cd is described below
commit 7c0c525cd5cd05433cc70e4ded3c71f17156a298
Author: abraham.menyhart <[email protected]>
AuthorDate: Fri Aug 11 09:33:10 2023 +0200
FINERACT-1724: Wrong status (error) code retrieved when invalid request was
provided to Batch API
---
.../batch/service/BatchApiServiceImpl.java | 1 -
.../exceptionmapper/JsonPathExceptionMapper.java | 52 ++++++++++++++++++++++
.../fineract/integrationtests/BatchApiTest.java | 46 +++++++++++++++++++
3 files changed, 98 insertions(+), 1 deletion(-)
diff --git
a/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java
b/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java
index dfb43a856..2538d1c39 100644
---
a/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java
+++
b/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java
@@ -160,7 +160,6 @@ public class BatchApiServiceImpl implements BatchApiService
{
throw new BatchExecutionException(childNode.getRequest(),
ex, errorHandler.handle(ex));
}
callRequestRecursive(resolvedChildRequest, childNode,
responseList, uriInfo, enclosingTransaction);
-
});
} else {
responseList.addAll(parentRequestFailedRecursive(request,
requestNode));
diff --git
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JsonPathExceptionMapper.java
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JsonPathExceptionMapper.java
new file mode 100644
index 000000000..8316a0818
--- /dev/null
+++
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JsonPathExceptionMapper.java
@@ -0,0 +1,52 @@
+/**
+ * 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.infrastructure.core.exceptionmapper;
+
+import com.jayway.jsonpath.JsonPathException;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.ext.ExceptionMapper;
+import jakarta.ws.rs.ext.Provider;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.fineract.infrastructure.core.data.ApiParameterError;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+@Provider
+@Component
+@Scope("singleton")
+@Slf4j
+public class JsonPathExceptionMapper implements
ExceptionMapper<JsonPathException>, FineractExceptionMapper {
+
+ @Override
+ public Response toResponse(JsonPathException exception) {
+ final String globalisationMessageCode = "error.msg.invalid.json.path";
+ final String defaultUserMessage = "The referenced JSON path is
invalid.";
+ log.warn("Exception: {}, Message: {}", exception.getClass().getName(),
defaultUserMessage);
+
+ final ApiParameterError error =
ApiParameterError.generalError(globalisationMessageCode, defaultUserMessage);
+
+ return
Response.status(Response.Status.BAD_REQUEST).entity(error).type(MediaType.APPLICATION_JSON).build();
+ }
+
+ @Override
+ public int errorCode() {
+ return 4000;
+ }
+}
diff --git
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java
index 471d5bc32..c7d88d714 100644
---
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java
+++
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/BatchApiTest.java
@@ -2109,6 +2109,52 @@ public class BatchApiTest {
Assertions.assertEquals(changes.get(columnName2).getAsString(),
columnValue2 + "1");
}
+ /**
+ * Test when datatable entry was not found by the query API, and the
update fails
+ */
+ @Test
+ public void
shouldNotFindAnyDatatableEntryByQueryAPIAndFailsToUpdateItsColumn() {
+ final String datatableName =
Utils.uniqueRandomStringGenerator(LOAN_APP_TABLE_NAME + "_", 5).toLowerCase();
+
+ // creating datatable with m_loan association
+ final Map<String, Object> columnMap = new HashMap<>();
+ final List<HashMap<String, Object>> datatableColumnsList = new
ArrayList<>();
+
+ final String columnName1 = Utils.randomStringGenerator("COL1_",
5).toLowerCase();
+ final String columnName2 = Utils.randomStringGenerator("COL2_",
5).toLowerCase();
+ columnMap.put("datatableName", datatableName);
+ columnMap.put("apptableName", LOAN_APP_TABLE_NAME);
+ columnMap.put("entitySubType", "PERSON");
+ columnMap.put("multiRow", false);
+ DatatableHelper.addDatatableColumns(datatableColumnsList, columnName1,
"String", true, 15, null);
+ DatatableHelper.addDatatableColumns(datatableColumnsList, columnName2,
"String", false, 15, null);
+ columnMap.put("columns", datatableColumnsList);
+ final String datatableRequestJsonString = new Gson().toJson(columnMap);
+ LOG.info("CreateDataTable map : {}", datatableRequestJsonString);
+
+ this.datatableHelper.createDatatable(datatableRequestJsonString, "");
+
+ final BatchRequest queryDatatableEntriesRequest =
BatchHelper.queryDatatableEntries(datatableName, columnName1, "columnValue1",
+ "loan_id");
+ final BatchRequest updateDatatableEntry =
BatchHelper.updateDatatableEntry(datatableName, "$.[0].loan_id", columnName2,
+ "columnValue2");
+
+ final List<BatchRequest> batchRequestsToQueryAndUpdateDatatableEntries
= Arrays.asList(queryDatatableEntriesRequest,
+ updateDatatableEntry);
+ LOG.info("Batch Request : {}",
BatchHelper.toJsonString(batchRequestsToQueryAndUpdateDatatableEntries));
+
+ final List<BatchResponse> responseOfQueryAndUpdateDatatableBatch =
BatchHelper.postBatchRequestsWithEnclosingTransaction(
+ this.requestSpec, this.responseSpec,
BatchHelper.toJsonString(batchRequestsToQueryAndUpdateDatatableEntries));
+
+ LOG.info("Batch Response : {}", new
Gson().toJson(responseOfQueryAndUpdateDatatableBatch));
+
+ final BatchResponse batchQueryAndUpdateResponse =
responseOfQueryAndUpdateDatatableBatch.get(0);
+
+ Assertions.assertEquals(2L,
batchQueryAndUpdateResponse.getRequestId());
+ Assertions.assertEquals(HttpStatus.SC_BAD_REQUEST,
batchQueryAndUpdateResponse.getStatusCode(),
+ "Verify Status Code 400 for update datatable entry");
+ }
+
/**
* Test for finding datatable entry by the query API and update its value
*/