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
      */

Reply via email to