This is an automated email from the ASF dual-hosted git repository.
adamsaghy 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 588b831f8f FINERACT-176: fixed missing throw exception in Teller module
588b831f8f is described below
commit 588b831f8f8c5a849bf6a6d5ec01113f79ea54e8
Author: edk12564 <[email protected]>
AuthorDate: Tue Feb 10 17:59:52 2026 -0600
FINERACT-176: fixed missing throw exception in Teller module
- Fixed missing throw exception for validation errors in Teller Module
- added unit tests to confirm changes to
TellerCommandFromApiJsonDeserializer
ReportedBy: subramanyasn
---
.../TellerCommandFromApiJsonDeserializer.java | 2 +
.../TellerCommandFromApiJsonDeserializerTest.java | 113 +++++++++++++++++++++
2 files changed, 115 insertions(+)
diff --git
a/fineract-branch/src/main/java/org/apache/fineract/organisation/teller/serialization/TellerCommandFromApiJsonDeserializer.java
b/fineract-branch/src/main/java/org/apache/fineract/organisation/teller/serialization/TellerCommandFromApiJsonDeserializer.java
index 5123699c17..5b6f3f5704 100644
---
a/fineract-branch/src/main/java/org/apache/fineract/organisation/teller/serialization/TellerCommandFromApiJsonDeserializer.java
+++
b/fineract-branch/src/main/java/org/apache/fineract/organisation/teller/serialization/TellerCommandFromApiJsonDeserializer.java
@@ -199,5 +199,7 @@ public final class TellerCommandFromApiJsonDeserializer {
final String currencyCode =
this.fromApiJsonHelper.extractStringNamed(CURRENCY_CODE, element);
baseDataValidator.reset().parameter(CURRENCY_CODE).value(currencyCode).notExceedingLengthOf(3);
+
+ throwExceptionIfValidationWarningsExist(dataValidationErrors);
}
}
diff --git
a/fineract-branch/src/test/java/org/apache/fineract/organisation/teller/serialization/TellerCommandFromApiJsonDeserializerTest.java
b/fineract-branch/src/test/java/org/apache/fineract/organisation/teller/serialization/TellerCommandFromApiJsonDeserializerTest.java
new file mode 100644
index 0000000000..d883a0b4d4
--- /dev/null
+++
b/fineract-branch/src/test/java/org/apache/fineract/organisation/teller/serialization/TellerCommandFromApiJsonDeserializerTest.java
@@ -0,0 +1,113 @@
+/**
+ * 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.organisation.teller.serialization;
+
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import org.apache.fineract.infrastructure.core.exception.InvalidJsonException;
+import
org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
+import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.function.Executable;
+import org.springframework.lang.NonNull;
+import org.springframework.lang.Nullable;
+
+class TellerCommandFromApiJsonDeserializerTest {
+
+ private final FromJsonHelper fromJsonHelper = new FromJsonHelper();
+ private final TellerCommandFromApiJsonDeserializer underTest = new
TellerCommandFromApiJsonDeserializer(fromJsonHelper);
+
+ @Test
+ public void testCashTxnValidJsonPassesValidation() throws
JsonProcessingException {
+ String json = cashTxnJson(BigDecimal.valueOf(1000), "10 September
2022", "Test note", "USD");
+ assertDoesNotThrow(() -> underTest.validateForCashTxnForCashier(json));
+ }
+
+ @Test
+ public void testCashTxnBlankOrNullJsonThrowsInvalidJsonException() {
+ String whitespaceOnly = " ";
+ assertThrows(InvalidJsonException.class, () ->
underTest.validateForCashTxnForCashier(null));
+ assertThrows(InvalidJsonException.class, () ->
underTest.validateForCashTxnForCashier(""));
+ assertThrows(InvalidJsonException.class, () ->
underTest.validateForCashTxnForCashier(whitespaceOnly));
+ }
+
+ @Test
+ public void testCashTxnMissingTxnAmountThrowsValidationException() {
+ assertPlatformValidationException("The parameter `txnAmount` is
mandatory.", "validation.msg.teller.txnAmount.cannot.be.blank",
+ () -> underTest.validateForCashTxnForCashier(cashTxnJson(null,
"10 September 2022", "Test note", "USD")));
+ }
+
+ @Test
+ public void testCashTxnMissingTxnDateThrowsValidationException() {
+ assertPlatformValidationException("The parameter `txnDate` is
mandatory.", "validation.msg.teller.txnDate.cannot.be.blank",
+ () ->
underTest.validateForCashTxnForCashier(cashTxnJson(BigDecimal.valueOf(1000),
null, "Test note", "USD")));
+ }
+
+ @Test
+ public void
testCashTxnTxnNoteExceedingMaxLengthThrowsValidationException() {
+ assertPlatformValidationException("The parameter `txnNote` exceeds max
length of 200.",
+ "validation.msg.teller.txnNote.exceeds.max.length", () ->
underTest
+
.validateForCashTxnForCashier(cashTxnJson(BigDecimal.valueOf(1000), "10
September 2022", "A".repeat(201), "USD")));
+ }
+
+ @Test
+ public void
testCashTxnCurrencyCodeExceedingMaxLengthThrowsValidationException() {
+ assertPlatformValidationException("The parameter `currencyCode`
exceeds max length of 3.",
+ "validation.msg.teller.currencyCode.exceeds.max.length", () ->
underTest
+
.validateForCashTxnForCashier(cashTxnJson(BigDecimal.valueOf(1000), "10
September 2022", "Test note", "ABCD")));
+ }
+
+ @NonNull
+ private String cashTxnJson(@Nullable BigDecimal txnAmount, @Nullable
String txnDate, @Nullable String txnNote,
+ @Nullable String currencyCode) throws JsonProcessingException {
+ Map<String, Object> map = new HashMap<>();
+ map.put("dateFormat", "dd MMMM yyyy");
+ map.put("locale", "en");
+ Optional.ofNullable(txnAmount).ifPresent(a -> map.put("txnAmount", a));
+ Optional.ofNullable(txnDate).ifPresent(d -> map.put("txnDate", d));
+ Optional.ofNullable(txnNote).ifPresent(n -> map.put("txnNote", n));
+ Optional.ofNullable(currencyCode).ifPresent(c ->
map.put("currencyCode", c));
+ return createJsonCommand(map);
+ }
+
+ @NonNull
+ private String createJsonCommand(Map<String, Object> jsonMap) throws
JsonProcessingException {
+ ObjectMapper objectMapper = new ObjectMapper();
+ return
objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonMap);
+ }
+
+ private void assertPlatformValidationException(String message, String
code, Executable executable) {
+ PlatformApiDataValidationException validationException =
assertThrows(PlatformApiDataValidationException.class, executable);
+ assertPlatformException(message, code, validationException);
+ }
+
+ private void assertPlatformException(String expectedMessage, String
expectedCode,
+ PlatformApiDataValidationException
platformApiDataValidationException) {
+ Assertions.assertEquals(expectedMessage,
platformApiDataValidationException.getErrors().get(0).getDefaultUserMessage());
+ Assertions.assertEquals(expectedCode,
platformApiDataValidationException.getErrors().get(0).getUserMessageGlobalisationCode());
+ }
+}