From 8d12bc04e9c4b4d3280aba64cf8a62b7785f62b6 Mon Sep 17 00:00:00 2001 From: Jose Alberto Hernandez Date: Thu, 28 Nov 2024 13:38:27 -0500 Subject: [PATCH] FINERACT-2081: Retrieving Loan Product details with invalid external-id results in 500 error --- .../LoanProductNotFoundException.java | 3 ++- .../LoanProductReadPlatformServiceImpl.java | 6 +++++- .../LoanProductExternalIdTest.java | 21 +++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/exception/LoanProductNotFoundException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/exception/LoanProductNotFoundException.java index a4f1cbece..149d24f0d 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/exception/LoanProductNotFoundException.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/exception/LoanProductNotFoundException.java @@ -32,7 +32,8 @@ public class LoanProductNotFoundException extends AbstractPlatformResourceNotFou } public LoanProductNotFoundException(final ExternalId externalId) { - super("error.msg.loanproduct.id.invalid", "Loan product with identifier " + externalId + " does not exist", externalId); + super("error.msg.loanproduct.id.invalid", "Loan product with identifier " + externalId.getValue() + " does not exist", + externalId.getValue()); } public LoanProductNotFoundException(Long id, EmptyResultDataAccessException e) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java index 1e88cffea..eccf2f020 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanProductReadPlatformServiceImpl.java @@ -104,7 +104,11 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo @Override public LoanProduct retrieveLoanProductByExternalId(final ExternalId externalId) { - return loanProductRepository.findByExternalId(externalId); + final LoanProduct loanProduct = loanProductRepository.findByExternalId(externalId); + if (loanProduct == null) { + throw new LoanProductNotFoundException(externalId); + } + return loanProduct; } @Override diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductExternalIdTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductExternalIdTest.java index 03d327012..ba8fb0925 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductExternalIdTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanProductExternalIdTest.java @@ -20,6 +20,8 @@ package org.apache.fineract.integrationtests; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import io.restassured.builder.RequestSpecBuilder; import io.restassured.builder.ResponseSpecBuilder; @@ -31,6 +33,7 @@ import java.util.UUID; import org.apache.fineract.client.models.GetLoanProductsProductIdResponse; import org.apache.fineract.client.models.PutLoanProductsProductIdRequest; import org.apache.fineract.client.models.PutLoanProductsProductIdResponse; +import org.apache.fineract.client.util.CallFailedRuntimeException; import org.apache.fineract.integrationtests.common.Utils; import org.apache.fineract.integrationtests.common.loans.LoanProductHelper; import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder; @@ -73,4 +76,22 @@ public class LoanProductExternalIdTest { assertNotNull(putLoanProductsProductIdResponse.getResourceId()); assertEquals(loanProductId, putLoanProductsProductIdResponse.getResourceId().intValue()); } + + @Test + public void testLoanProductWithInvalidExternalId() { + String externalId = UUID.randomUUID().toString(); + HashMap request = new LoanProductTestBuilder().withExternalId(externalId).build(null, null); + Integer loanProductId = loanTransactionHelper.getLoanProductId(Utils.convertToJson(request)); + assertNotNull(loanProductId); + + GetLoanProductsProductIdResponse getLoanProductsProductIdResponse = loanProductHelper.retrieveLoanProductByExternalId(externalId); + assertNotNull(getLoanProductsProductIdResponse.getId()); + assertEquals(loanProductId, getLoanProductsProductIdResponse.getId().intValue()); + + CallFailedRuntimeException exception = assertThrows(CallFailedRuntimeException.class, + () -> loanProductHelper.retrieveLoanProductByExternalId(externalId.substring(2))); + assertEquals(404, exception.getResponse().code()); + assertTrue(exception.getMessage().contains("error.msg.loanproduct.id.invalid")); + } + }