Skip to content

Commit 7b91227

Browse files
committed
FINERACT-2649: Standardize BigDecimal precision assertions in migrated Feign tests
Signed-off-by: DeathGun44 <krishnamewara841@gmail.com>
1 parent e34e686 commit 7b91227

29 files changed

Lines changed: 380 additions & 372 deletions

integration-tests/src/test/java/org/apache/fineract/integrationtests/BlockTransactionsOnClosedOverpaidLoansTest.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,16 @@
3636
import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder;
3737
import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder;
3838
import org.apache.fineract.integrationtests.common.loans.LoanStatusChecker;
39+
import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension;
3940
import org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper;
4041
import org.junit.jupiter.api.AfterEach;
4142
import org.junit.jupiter.api.Assertions;
4243
import org.junit.jupiter.api.BeforeEach;
4344
import org.junit.jupiter.api.Test;
45+
import org.junit.jupiter.api.extension.ExtendWith;
4446

4547
@Slf4j
48+
@ExtendWith(LoanTestLifecycleExtension.class)
4649
public class BlockTransactionsOnClosedOverpaidLoansTest {
4750

4851
private ResponseSpecification responseSpec;
@@ -79,7 +82,7 @@ public void testTransactionsOnOverpaidLoan() {
7982
ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientID);
8083

8184
final Integer loanProductID = createLoanProduct();
82-
final Integer loanID = applyForLoanApplication(clientID, loanProductID, "1000", "01 January 2024");
85+
final Integer loanID = createLoanApplication(clientID, loanProductID, "1000", "01 January 2024");
8386

8487
this.loanTransactionHelper.approveLoan("01 January 2024", loanID);
8588
this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount("01 January 2024", loanID, "1000");
@@ -116,7 +119,7 @@ public void testTransactionsOnClosedLoan() {
116119

117120
final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
118121
final Integer loanProductID = createLoanProduct();
119-
final Integer loanID = applyForLoanApplication(clientID, loanProductID, "1000", "01 January 2024");
122+
final Integer loanID = createLoanApplication(clientID, loanProductID, "1000", "01 January 2024");
120123

121124
this.loanTransactionHelper.approveLoan("01 January 2024", loanID);
122125
this.loanTransactionHelper.disburseLoanWithNetDisbursalAmount("01 January 2024", loanID, "1000");
@@ -165,7 +168,7 @@ private Integer createLoanProduct() {
165168
return this.loanTransactionHelper.getLoanProductId(loanProductJSON);
166169
}
167170

168-
private Integer applyForLoanApplication(final Integer clientID, final Integer loanProductID, String principal, String submitDate) {
171+
private Integer createLoanApplication(final Integer clientID, final Integer loanProductID, String principal, String submitDate) {
169172
final String loanApplicationJSON = new LoanApplicationTestBuilder() //
170173
.withPrincipal(principal) //
171174
.withLoanTermFrequency("4") //

integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanChargeExternalIntegrationTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,11 @@ public void checkNewClientLoanChargeFindsDuplicateExternalId() {
8181
.amount(1.0).dueDate("22 September 2011").externalId(externalId).dateFormat("dd MMMM yyyy").locale("en"));
8282
assertNotNull(chargeResponse);
8383

84-
assertThrows(CallFailedRuntimeException.class,
84+
CallFailedRuntimeException exception = assertThrows(CallFailedRuntimeException.class,
8585
() -> addLoanCharge(loanId, new PostLoansLoanIdChargesRequest().chargeId(chargeDefId).amount(2.0)
8686
.dueDate("23 September 2011").externalId(externalId).dateFormat("dd MMMM yyyy").locale("en")));
87+
assertEquals(403, exception.getStatus());
88+
assertErrorGlobalisationCode(exception, "error.msg.loan.charge.duplicate.externalId");
8789
}
8890

8991
private Long createLoanProduct(final boolean multiDisburseLoan, final String accountingRule) {

integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanChargeRefundIntegrationTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.util.HashMap;
3535
import java.util.List;
3636
import java.util.Locale;
37+
import org.apache.fineract.integrationtests.client.feign.FeignLoanTestBase;
3738
import org.apache.fineract.integrationtests.common.ClientHelper;
3839
import org.apache.fineract.integrationtests.common.CommonConstants;
3940
import org.apache.fineract.integrationtests.common.Utils;
@@ -56,7 +57,7 @@
5657

5758
@SuppressWarnings({ "rawtypes", "unchecked" })
5859
@ExtendWith(LoanTestLifecycleExtension.class)
59-
public class ClientLoanChargeRefundIntegrationTest {
60+
public class ClientLoanChargeRefundIntegrationTest extends FeignLoanTestBase {
6061

6162
private static final Logger LOG = LoggerFactory.getLogger(ClientLoanChargeRefundIntegrationTest.class);
6263

integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanMultipleDisbursementsIntegrationTest.java

Lines changed: 49 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,20 @@
1919
package org.apache.fineract.integrationtests;
2020

2121
import static org.junit.jupiter.api.Assertions.assertEquals;
22+
import static org.junit.jupiter.api.Assertions.assertTrue;
2223

24+
import com.google.gson.JsonArray;
25+
import com.google.gson.JsonElement;
26+
import com.google.gson.JsonObject;
27+
import com.google.gson.JsonParser;
2328
import java.math.BigDecimal;
2429
import java.util.ArrayList;
2530
import java.util.HashMap;
2631
import java.util.List;
2732
import org.apache.fineract.client.models.GetLoansLoanIdRepaymentPeriod;
2833
import org.apache.fineract.client.models.GetLoansLoanIdResponse;
2934
import org.apache.fineract.integrationtests.client.feign.FeignLoanTestBase;
35+
import org.apache.fineract.integrationtests.client.feign.helpers.FeignRawHttpHelper;
3036
import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder;
3137
import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder;
3238
import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
@@ -100,6 +106,26 @@ private HashMap createTrancheDetail(final String date, final String amount) {
100106
return detail;
101107
}
102108

109+
/**
110+
* Sums the per-disbursement {@code principalDisbursed} across the schedule's disbursement rows (those without a
111+
* {@code period} number). The generated Feign {@code GetLoansLoanIdRepaymentPeriod} model does not expose
112+
* {@code principalDisbursed}, so read it from the raw loan JSON.
113+
*/
114+
private BigDecimal sumDisbursedPrincipal(final Long loanId) {
115+
String loanJson = FeignRawHttpHelper.get("/loans/" + loanId + "?associations=all&exclude=guarantors,futureSchedule");
116+
JsonArray periods = JsonParser.parseString(loanJson).getAsJsonObject().getAsJsonObject("repaymentSchedule")
117+
.getAsJsonArray("periods");
118+
BigDecimal total = BigDecimal.ZERO;
119+
for (JsonElement element : periods) {
120+
JsonObject period = element.getAsJsonObject();
121+
boolean isDisbursement = !period.has("period") || period.get("period").isJsonNull();
122+
if (isDisbursement && period.has("principalDisbursed")) {
123+
total = total.add(period.get("principalDisbursed").getAsBigDecimal());
124+
}
125+
}
126+
return total;
127+
}
128+
103129
/***
104130
* Test case to verify repayment schedule shows all disbursals for tranche loans
105131
*/
@@ -163,27 +189,22 @@ public void checkThatAllMultiDisbursalsAppearOnLoanScheduleAndOutStandingBalance
163189
assertEquals(expectedLoanScheduleLineCount, loanScheduleLineCount, "Checking nine lines in schedule");
164190

165191
int disbursalCount = 0;
166-
BigDecimal totalPrincipalDisbursed = BigDecimal.ZERO;
167192
// First 8 lines should be disbursals
168193
for (int i = 0; i < loanScheduleLineCount - 1; i++) {
169-
final Integer period = loanSchedule.get(i).getPeriod();
170-
final BigDecimal principalDisbursed = loanSchedule.get(i).getPrincipalLoanBalanceOutstanding();
171-
172-
if (period == null && principalDisbursed != null) {
194+
if (loanSchedule.get(i).getPeriod() == null) {
173195
disbursalCount += 1;
174-
totalPrincipalDisbursed = totalPrincipalDisbursed.add(principalDisbursed);
175196
}
176197
}
177198
assertEquals(expectedDisbursals, disbursalCount, "Checking for eight disbursals");
178-
assertEquals(expectedTotalPrincipalDisbursed, totalPrincipalDisbursed, "Checking Principal Disburse is 255");
199+
final BigDecimal totalPrincipalDisbursed = sumDisbursedPrincipal(loanID);
200+
assertTrue(expectedTotalPrincipalDisbursed.compareTo(totalPrincipalDisbursed) == 0, "Checking Principal Disburse is 255");
179201

180202
GetLoansLoanIdRepaymentPeriod lastPeriod = loanSchedule.get(8);
181203
final BigDecimal principalDue = lastPeriod.getPrincipalDue();
182-
assertEquals(expectedPrincipalDue, principalDue, "Checking Principal Due is 255");
204+
assertTrue(expectedPrincipalDue.compareTo(principalDue) == 0, "Checking Principal Due is 255");
183205

184206
final BigDecimal principalLoanBalanceOutstanding = lastPeriod.getPrincipalLoanBalanceOutstanding();
185-
assertEquals(expectedPrincipalLoanBalanceOutstanding, principalLoanBalanceOutstanding,
186-
"Checking Principal Loan Balance Outstanding is zero");
207+
assertTrue(expectedPrincipalLoanBalanceOutstanding.compareTo(principalLoanBalanceOutstanding) == 0, "Checking Principal Loan Balance Outstanding is zero");
187208
}
188209

189210
@Test
@@ -214,7 +235,8 @@ public void checkThatAllMultiDisbursalsAppearOnLoanScheduleAndOutStandingBalance
214235
approveLoan(loanID, approveLoanRequest(12000.0, "01 January 2021"));
215236
verifyLoanStatus(loanID, LoanStatus.APPROVED);
216237

217-
LOG.info("-------------------------------DISBURSE 1, repay fully, disburse again LOANS -------------------------------------------");
238+
LOG.info(
239+
"-------------------------------DISBURSE 1, repay fully, disburse again LOANS -------------------------------------------");
218240
disburseLoanWithAmount(loanID, "12 January 2021", 1);
219241
verifyLoanStatus(loanID, LoanStatus.ACTIVE);
220242
makeLoanRepayment(loanID, "Repayment", "13 January 2021", 1.0);
@@ -236,30 +258,25 @@ public void checkThatAllMultiDisbursalsAppearOnLoanScheduleAndOutStandingBalance
236258
assertEquals(expectedLoanScheduleLineCount, loanScheduleLineCount, "Checking 3 lines in schedule");
237259

238260
int disbursalCount = 0;
239-
BigDecimal totalPrincipalDisbursed = BigDecimal.ZERO;
240261
for (int i = 0; i < loanScheduleLineCount - 1; i++) {
241-
final Integer period = loanSchedule.get(i).getPeriod();
242-
final BigDecimal principalDisbursed = loanSchedule.get(i).getPrincipalLoanBalanceOutstanding();
243-
244-
if (period == null && principalDisbursed != null) {
262+
if (loanSchedule.get(i).getPeriod() == null) {
245263
disbursalCount += 1;
246-
totalPrincipalDisbursed = totalPrincipalDisbursed.add(principalDisbursed);
247264
}
248265
}
249266
assertEquals(expectedDisbursals, disbursalCount, "Checking for 2 disbursals");
250-
assertEquals(expectedTotalPrincipalDisbursed, totalPrincipalDisbursed, "Checking Principal Disburse is 3");
267+
final BigDecimal totalPrincipalDisbursed = sumDisbursedPrincipal(loanID);
268+
assertTrue(expectedTotalPrincipalDisbursed.compareTo(totalPrincipalDisbursed) == 0, "Checking Principal Disburse is 3");
251269

252270
GetLoansLoanIdRepaymentPeriod lastPeriod = loanSchedule.get(2);
253271
final BigDecimal principalDue = lastPeriod.getPrincipalDue();
254-
assertEquals(expectedPrincipalDue, principalDue, "Checking Principal Due is 3");
272+
assertTrue(expectedPrincipalDue.compareTo(principalDue) == 0, "Checking Principal Due is 3");
255273
final BigDecimal principalPaid = lastPeriod.getPrincipalPaid();
256-
assertEquals(expectedPrincipalPaid, principalPaid, "Checking Principal Paid is 1");
274+
assertTrue(expectedPrincipalPaid.compareTo(principalPaid) == 0, "Checking Principal Paid is 1");
257275
final BigDecimal principalOutstanding = lastPeriod.getPrincipalOutstanding();
258-
assertEquals(expectedPrincipalOutstanding, principalOutstanding, "Checking Principal Due is 2");
276+
assertTrue(expectedPrincipalOutstanding.compareTo(principalOutstanding) == 0, "Checking Principal Due is 2");
259277

260278
final BigDecimal principalLoanBalanceOutstanding = lastPeriod.getPrincipalLoanBalanceOutstanding();
261-
assertEquals(expectedPrincipalLoanBalanceOutstanding, principalLoanBalanceOutstanding,
262-
"Checking Principal Loan Balance Outstanding is zero");
279+
assertTrue(expectedPrincipalLoanBalanceOutstanding.compareTo(principalLoanBalanceOutstanding) == 0, "Checking Principal Loan Balance Outstanding is zero");
263280
}
264281

265282
@Test
@@ -290,7 +307,8 @@ public void checkThatAllMultiDisbursalsAppearOnLoanScheduleAndOutStandingBalance
290307
approveLoan(loanID, approveLoanRequest(12000.0, "01 January 2021"));
291308
verifyLoanStatus(loanID, LoanStatus.APPROVED);
292309

293-
LOG.info("-------------------------------DISBURSE 1, repay fully, disburse again LOANS -------------------------------------------");
310+
LOG.info(
311+
"-------------------------------DISBURSE 1, repay fully, disburse again LOANS -------------------------------------------");
294312
disburseLoanWithAmount(loanID, "12 January 2021", 1);
295313
verifyLoanStatus(loanID, LoanStatus.ACTIVE);
296314
makeLoanRepayment(loanID, "Repayment", "13 January 2021", 2.0);
@@ -312,29 +330,24 @@ public void checkThatAllMultiDisbursalsAppearOnLoanScheduleAndOutStandingBalance
312330
assertEquals(expectedLoanScheduleLineCount, loanScheduleLineCount, "Checking nine lines in schedule");
313331

314332
int disbursalCount = 0;
315-
BigDecimal totalPrincipalDisbursed = BigDecimal.ZERO;
316333
for (int i = 0; i < loanScheduleLineCount - 1; i++) {
317-
final Integer period = loanSchedule.get(i).getPeriod();
318-
final BigDecimal principalDisbursed = loanSchedule.get(i).getPrincipalLoanBalanceOutstanding();
319-
320-
if (period == null && principalDisbursed != null) {
334+
if (loanSchedule.get(i).getPeriod() == null) {
321335
disbursalCount += 1;
322-
totalPrincipalDisbursed = totalPrincipalDisbursed.add(principalDisbursed);
323336
}
324337
}
325338
assertEquals(expectedDisbursals, disbursalCount, "Checking for 2 disbursals");
326-
assertEquals(expectedTotalPrincipalDisbursed, totalPrincipalDisbursed, "Checking Principal Disburse is 3");
339+
final BigDecimal totalPrincipalDisbursed = sumDisbursedPrincipal(loanID);
340+
assertTrue(expectedTotalPrincipalDisbursed.compareTo(totalPrincipalDisbursed) == 0, "Checking Principal Disburse is 3");
327341

328342
GetLoansLoanIdRepaymentPeriod lastPeriod = loanSchedule.get(2);
329343
final BigDecimal principalDue = lastPeriod.getPrincipalDue();
330-
assertEquals(expectedPrincipalDue, principalDue, "Checking Principal Due is 3");
344+
assertTrue(expectedPrincipalDue.compareTo(principalDue) == 0, "Checking Principal Due is 3");
331345
final BigDecimal principalPaid = lastPeriod.getPrincipalPaid();
332-
assertEquals(expectedPrincipalPaid, principalPaid, "Checking Principal Paid is 1");
346+
assertTrue(expectedPrincipalPaid.compareTo(principalPaid) == 0, "Checking Principal Paid is 1");
333347
final BigDecimal principalOutstanding = lastPeriod.getPrincipalOutstanding();
334-
assertEquals(expectedPrincipalOutstanding, principalOutstanding, "Checking Principal Due is 2");
348+
assertTrue(expectedPrincipalOutstanding.compareTo(principalOutstanding) == 0, "Checking Principal Due is 2");
335349

336350
final BigDecimal principalLoanBalanceOutstanding = lastPeriod.getPrincipalLoanBalanceOutstanding();
337-
assertEquals(expectedPrincipalLoanBalanceOutstanding, principalLoanBalanceOutstanding,
338-
"Checking Principal Loan Balance Outstanding is zero");
351+
assertTrue(expectedPrincipalLoanBalanceOutstanding.compareTo(principalLoanBalanceOutstanding) == 0, "Checking Principal Loan Balance Outstanding is zero");
339352
}
340353
}

integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientLoanNonTrancheMultipleDisbursementsIntegrationTest.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.apache.fineract.integrationtests;
2020

21+
import java.math.BigDecimal;
2122
import java.util.List;
2223
import org.apache.fineract.client.models.GetLoansLoanIdRepaymentPeriod;
2324
import org.apache.fineract.client.models.GetLoansLoanIdResponse;
@@ -147,12 +148,12 @@ public void checkThatNonTrancheMultiDisbursalsCreateAScheduleOnFirstDisbursalTes
147148
long repaymentPeriodCount = schedule.stream().filter(p -> p.getPeriod() != null).count();
148149
Assertions.assertEquals(repaymentsNo.longValue(), repaymentPeriodCount);
149150

150-
Assertions.assertEquals(approved, loanDetails.getSummary().getPrincipalDisbursed());
151-
Assertions.assertEquals(approved, loanDetails.getSummary().getPrincipalOutstanding());
151+
Assertions.assertTrue(BigDecimal.valueOf(approved).compareTo(loanDetails.getSummary().getPrincipalDisbursed()) == 0);
152+
Assertions.assertTrue(BigDecimal.valueOf(approved).compareTo(loanDetails.getSummary().getPrincipalOutstanding()) == 0);
152153

153154
LOG.info("------------------------------- 2nd DISBURSE non-tranch multi-disbursal loan ----------");
154155
final Double anotherDisbursalAmount = 900.00;
155-
disburseLoanWithNetDisbursalAmount(loanID, submitDate, anotherDisbursalAmount.toString());
156+
disburseLoan(loanID, submitDate, anotherDisbursalAmount);
156157
verifyLoanStatus(loanID, LoanStatus.ACTIVE);
157158

158159
loanDetails = getLoanDetails(loanID);
@@ -161,13 +162,13 @@ public void checkThatNonTrancheMultiDisbursalsCreateAScheduleOnFirstDisbursalTes
161162
Assertions.assertEquals(repaymentsNo.longValue(), repaymentPeriodCount);
162163

163164
Double disbursedSum = approved + anotherDisbursalAmount;
164-
Assertions.assertEquals(disbursedSum, loanDetails.getSummary().getPrincipalDisbursed());
165-
Assertions.assertEquals(disbursedSum, loanDetails.getSummary().getPrincipalOutstanding());
165+
Assertions.assertTrue(BigDecimal.valueOf(disbursedSum).compareTo(loanDetails.getSummary().getPrincipalDisbursed()) == 0);
166+
Assertions.assertTrue(BigDecimal.valueOf(disbursedSum).compareTo(loanDetails.getSummary().getPrincipalOutstanding()) == 0);
166167

167168
LOG.info("------------------------------- 3rd DISBURSE non-tranch multi-disbursal loan ----------");
168169
final Double thirdDisbursalAmount = 500.00;
169170
String thirdDisbursalDate = "03 February 2021";
170-
disburseLoanWithNetDisbursalAmount(loanID, thirdDisbursalDate, thirdDisbursalAmount.toString());
171+
disburseLoan(loanID, thirdDisbursalDate, thirdDisbursalAmount);
171172
verifyLoanStatus(loanID, LoanStatus.ACTIVE);
172173

173174
loanDetails = getLoanDetails(loanID);
@@ -176,8 +177,8 @@ public void checkThatNonTrancheMultiDisbursalsCreateAScheduleOnFirstDisbursalTes
176177
Assertions.assertEquals(repaymentsNo.longValue(), repaymentPeriodCount);
177178

178179
disbursedSum = disbursedSum + thirdDisbursalAmount;
179-
Assertions.assertEquals(disbursedSum, loanDetails.getSummary().getPrincipalDisbursed());
180-
Assertions.assertEquals(disbursedSum, loanDetails.getSummary().getPrincipalOutstanding());
180+
Assertions.assertTrue(BigDecimal.valueOf(disbursedSum).compareTo(loanDetails.getSummary().getPrincipalDisbursed()) == 0);
181+
Assertions.assertTrue(BigDecimal.valueOf(disbursedSum).compareTo(loanDetails.getSummary().getPrincipalOutstanding()) == 0);
181182
}
182183

183184
@Test

integration-tests/src/test/java/org/apache/fineract/integrationtests/DelinquencyAndChargebackIntegrationTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import org.apache.fineract.integrationtests.common.Utils;
5050
import org.apache.fineract.integrationtests.common.products.DelinquencyBucketsHelper;
5151
import org.apache.fineract.portfolio.loanaccount.domain.LoanStatus;
52-
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType;
5352
import org.junit.jupiter.api.Named;
5453
import org.junit.jupiter.params.ParameterizedTest;
5554
import org.junit.jupiter.params.provider.Arguments;
@@ -271,7 +270,8 @@ private Long createLoanProduct(String strategyCode, boolean advancedAllocation,
271270
private Long createLoanAccount(final Long clientId, final Long loanProductId, final String operationDate, final String periods,
272271
String repaymentStrategy) {
273272
PostLoansRequest request = applyLoanRequest(clientId, loanProductId, operationDate, Double.valueOf(principalAmount),
274-
Integer.valueOf(periods), req -> req.repaymentEvery(1).repaymentFrequencyType(LoanTestData.RepaymentFrequencyType.MONTHS)
273+
Integer.valueOf(periods),
274+
req -> req.repaymentEvery(1).repaymentFrequencyType(LoanTestData.RepaymentFrequencyType.MONTHS)
275275
.loanTermFrequency(Integer.valueOf(periods)).loanTermFrequencyType(LoanTestData.RepaymentFrequencyType.MONTHS)
276276
.interestRatePerPeriod(BigDecimal.ZERO).interestType(LoanTestData.InterestType.DECLINING_BALANCE)
277277
.expectedDisbursementDate(operationDate).submittedOnDate(operationDate)

0 commit comments

Comments
 (0)