From fd765988a46c5becf60a7ad2802f5dc26d299de9 Mon Sep 17 00:00:00 2001 From: Janos Meszaros Date: Thu, 16 Jan 2025 21:41:46 +0100 Subject: [PATCH] Fix date bug in saving account test --- .../ClientSavingsIntegrationTest.java | 84 ++++++++----------- .../common/savings/SavingsAccountHelper.java | 8 ++ 2 files changed, 44 insertions(+), 48 deletions(-) diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java index 097d7e2514a..115ce14b433 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientSavingsIntegrationTest.java @@ -19,6 +19,7 @@ package org.apache.fineract.integrationtests; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import io.restassured.builder.RequestSpecBuilder; import io.restassured.builder.ResponseSpecBuilder; @@ -688,7 +689,7 @@ public void testSavingsAccountCharges() { assertEquals(savingsChargeId, deletedChargeId); chargesPendingState = this.savingsAccountHelper.getSavingsCharges(savingsId); - Assertions.assertTrue(chargesPendingState == null || chargesPendingState.size() == 0); + Assertions.assertTrue(chargesPendingState == null || chargesPendingState.isEmpty()); savingsStatusHashMap = this.savingsAccountHelper.approveSavingsOnDate(savingsId, submittedDateString); SavingsStatusChecker.verifySavingsIsApproved(savingsStatusHashMap); @@ -696,12 +697,11 @@ public void testSavingsAccountCharges() { savingsStatusHashMap = this.savingsAccountHelper.activateSavings(savingsId, submittedDateString); SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap); - final Integer chargeId = ChargesHelper.createCharges(this.requestSpec, this.responseSpec, - ChargesHelper.getSavingsAnnualFeeJSON()); + Integer chargeId = ChargesHelper.createCharges(this.requestSpec, this.responseSpec, ChargesHelper.getSavingsAnnualFeeJSON()); Assertions.assertNotNull(chargeId); ArrayList charges = this.savingsAccountHelper.getSavingsCharges(savingsId); - Assertions.assertTrue(charges == null || charges.size() == 0); + Assertions.assertTrue(charges == null || charges.isEmpty()); this.savingsAccountHelper.addChargesForSavingsWithDueDateAndFeeOnMonthDay(savingsId, chargeId, "10 January 2023", 100, "15 January"); @@ -718,41 +718,32 @@ public void testSavingsAccountCharges() { assertEquals("validation.msg.savingsaccountcharge.inactivation.of.charge.not.allowed.when.charge.is.due", savingsAccountErrorData.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE)); - SimpleDateFormat sdf = new SimpleDateFormat(CommonConstants.DATE_FORMAT, Locale.US); - Calendar cal = Calendar.getInstance(); - List dates = (List) savingsChargeForPay.get("dueDate"); - cal.set(Calendar.YEAR, (Integer) dates.get(0)); - cal.set(Calendar.MONTH, (Integer) dates.get(1) - 1); - cal.set(Calendar.DAY_OF_MONTH, (Integer) dates.get(2)); - int n = 0; - Calendar current = Calendar.getInstance(); - while (cal.compareTo(current) < 0) { - n++; - cal.set(Calendar.YEAR, (Integer) dates.get(0) + n); - } - cal.set(Calendar.YEAR, (Integer) dates.get(0)); - cal.set(Calendar.MONTH, (Integer) dates.get(1) - 1); - cal.set(Calendar.DAY_OF_MONTH, (Integer) dates.get(2)); - - BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2024, 1, 17)); - for (int i = 1; i <= n; i++) { - this.savingsAccountHelper.payCharge((Integer) savingsChargeForPay.get("id"), savingsId, - ((Float) savingsChargeForPay.get("amount")).toString(), sdf.format(cal.getTime())); - HashMap paidCharge = this.savingsAccountHelper.getSavingsCharge(savingsId, (Integer) savingsChargeForPay.get("id")); - Float expectedValue = (Float) savingsChargeForPay.get("amount") * i; - assertEquals(expectedValue, paidCharge.get("amountPaid")); - cal.set(Calendar.YEAR, (Integer) dates.get(0) + i); + float chargeAmount = (Float) savingsChargeForPay.get("amount"); + List chargeDueDateParts = (List) savingsChargeForPay.get("dueDate"); + LocalDate chargeDueDate = LocalDate.of((int) chargeDueDateParts.get(0), (int) chargeDueDateParts.get(1), + (int) chargeDueDateParts.get(2)); + + final LocalDate today = LocalDate.of(2024, 1, 17); + final int noChargeDues = today.getYear() - chargeDueDate.getYear(); + BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, today); + + for (int dueYearDiff = 0; dueYearDiff <= noChargeDues; dueYearDiff++) { + this.savingsAccountHelper.payCharge(annualSavingsChargeId, savingsId, String.valueOf(chargeAmount), + chargeDueDate.plusYears(dueYearDiff)); + float paidCharge = (float) this.savingsAccountHelper.getSavingsCharge(savingsId, annualSavingsChargeId).get("amountPaid"); + float expectedValue = chargeAmount * (dueYearDiff + 1); + assertTrue((expectedValue - paidCharge) < 0.01); } Integer inactivatedChargeId = (Integer) this.savingsAccountHelper.inactivateCharge(annualSavingsChargeId, savingsId, CommonConstants.RESPONSE_RESOURCE_ID); assertEquals(annualSavingsChargeId, inactivatedChargeId, "Inactivated Savings Charges Id"); - final Integer monthlyFeechargeId = ChargesHelper.createCharges(this.requestSpec, this.responseSpec, + final Integer monthlyFeeChargeId = ChargesHelper.createCharges(this.requestSpec, this.responseSpec, ChargesHelper.getSavingsMonthlyFeeJSON()); - Assertions.assertNotNull(monthlyFeechargeId); + Assertions.assertNotNull(monthlyFeeChargeId); - this.savingsAccountHelper.addChargesForSavings(savingsId, monthlyFeechargeId, true); + this.savingsAccountHelper.addChargesForSavings(savingsId, monthlyFeeChargeId, true); charges = this.savingsAccountHelper.getSavingsCharges(savingsId); Assertions.assertEquals(2, charges.size()); @@ -783,34 +774,31 @@ public void testSavingsAccountCharges() { Assertions.assertEquals(3, charges.size()); savingsChargeForPay = charges.get(2); - final Integer weeklySavingsFeeId = (Integer) savingsChargeForPay.get("id"); + chargeId = (Integer) savingsChargeForPay.get("id"); + chargeAmount = (float) savingsChargeForPay.get("amount"); + chargeDueDateParts = (List) savingsChargeForPay.get("dueDate"); + chargeDueDate = LocalDate.of((int) chargeDueDateParts.get(0), (int) chargeDueDateParts.get(1), (int) chargeDueDateParts.get(2)); - savingsAccountErrorData = (ArrayList) validationErrorHelper.inactivateCharge(weeklySavingsFeeId, savingsId, + savingsAccountErrorData = (ArrayList) validationErrorHelper.inactivateCharge(chargeId, savingsId, CommonConstants.RESPONSE_ERROR); assertEquals("validation.msg.savingsaccountcharge.inactivation.of.charge.not.allowed.when.charge.is.due", savingsAccountErrorData.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE)); - cal = Calendar.getInstance(); - dates = (List) savingsChargeForPay.get("dueDate"); - cal.set(Calendar.YEAR, (Integer) dates.get(0)); - cal.set(Calendar.MONTH, (Integer) dates.get(1) - 1); - cal.set(Calendar.DAY_OF_MONTH, (Integer) dates.get(2)); - // Depositing huge amount as scheduler job deducts the fee amount String transactionDate = "17 January 2024"; Integer depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsId, "100000", transactionDate, CommonConstants.RESPONSE_RESOURCE_ID); Assertions.assertNotNull(depositTransactionId); - this.savingsAccountHelper.payCharge((Integer) savingsChargeForPay.get("id"), savingsId, - ((Float) savingsChargeForPay.get("amount")).toString(), sdf.format(cal.getTime())); - HashMap paidCharge = this.savingsAccountHelper.getSavingsCharge(savingsId, (Integer) savingsChargeForPay.get("id")); - assertEquals(savingsChargeForPay.get("amount"), paidCharge.get("amountPaid")); - List nextDueDates = (List) paidCharge.get("dueDate"); - LocalDate nextDueDate = LocalDate.of((Integer) nextDueDates.get(0), (Integer) nextDueDates.get(1), - (Integer) nextDueDates.get(2)); - LocalDate expectedNextDueDate = LocalDate.of((Integer) dates.get(0), (Integer) dates.get(1), (Integer) dates.get(2)) - .plusWeeks((Integer) paidCharge.get("feeInterval")); + this.savingsAccountHelper.payCharge(chargeId, savingsId, String.valueOf(chargeAmount), chargeDueDate); + HashMap paidCharge = this.savingsAccountHelper.getSavingsCharge(savingsId, chargeId); + final float paidAmount = (float) paidCharge.get("amountPaid"); + assertTrue(chargeAmount - paidAmount < 0.01); + + List nextDueDateParts = (List) paidCharge.get("dueDate"); + LocalDate nextDueDate = LocalDate.of((Integer) nextDueDateParts.get(0), (Integer) nextDueDateParts.get(1), + (Integer) nextDueDateParts.get(2)); + LocalDate expectedNextDueDate = chargeDueDate.plusWeeks((Integer) paidCharge.get("feeInterval")); assertEquals(expectedNextDueDate, nextDueDate); } finally { BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2024, 11, 11)); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/savings/SavingsAccountHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/savings/SavingsAccountHelper.java index 061f8f88764..049ebd61e5c 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/savings/SavingsAccountHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/savings/SavingsAccountHelper.java @@ -35,6 +35,8 @@ import java.io.InputStream; import java.math.BigDecimal; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; @@ -387,6 +389,12 @@ public Integer addChargesForSavingsWithDueDateAndFeeOnMonthDay(final Integer sav CommonConstants.RESPONSE_RESOURCE_ID); } + public Integer payCharge(final Integer chargeId, final Integer savingsId, String amount, LocalDate dueDate) { + return (Integer) performSavingActions(createChargesURL("paycharge", savingsId, chargeId), + getSavingsPayChargeJSON(amount, dueDate.format(DateTimeFormatter.ofPattern(CommonConstants.DATE_FORMAT))), + CommonConstants.RESPONSE_RESOURCE_ID); + } + public Integer payCharge(final Integer chargeId, final Integer savingsId, String amount, String dueDate) { return (Integer) performSavingActions(createChargesURL("paycharge", savingsId, chargeId), getSavingsPayChargeJSON(amount, dueDate), CommonConstants.RESPONSE_RESOURCE_ID);