Integration tests for Savings Dormancy Tracking feature
This commit is contained in:
+156
-4
@@ -34,6 +34,7 @@ import java.util.Locale;
|
||||
|
||||
import org.apache.fineract.integrationtests.common.ClientHelper;
|
||||
import org.apache.fineract.integrationtests.common.CommonConstants;
|
||||
import org.apache.fineract.integrationtests.common.SchedulerJobHelper;
|
||||
import org.apache.fineract.integrationtests.common.TaxComponentHelper;
|
||||
import org.apache.fineract.integrationtests.common.TaxGroupHelper;
|
||||
import org.apache.fineract.integrationtests.common.Utils;
|
||||
@@ -42,6 +43,8 @@ import org.apache.fineract.integrationtests.common.savings.SavingsAccountHelper;
|
||||
import org.apache.fineract.integrationtests.common.savings.SavingsProductHelper;
|
||||
import org.apache.fineract.integrationtests.common.savings.SavingsStatusChecker;
|
||||
import org.joda.time.LocalDate;
|
||||
import org.joda.time.format.DateTimeFormat;
|
||||
import org.joda.time.format.DateTimeFormatter;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -806,7 +809,7 @@ public class ClientSavingsIntegrationTest {
|
||||
final String percentage = "10";
|
||||
final Integer taxGroupId = createTaxGroup(percentage);
|
||||
final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, MINIMUM_OPENING_BALANCE,
|
||||
minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft, String.valueOf(taxGroupId));
|
||||
minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft, String.valueOf(taxGroupId), false);
|
||||
Assert.assertNotNull(savingsProductID);
|
||||
|
||||
final Integer savingsId = this.savingsAccountHelper.applyForSavingsApplication(clientID, savingsProductID, ACCOUNT_TYPE_INDIVIDUAL);
|
||||
@@ -854,7 +857,7 @@ public class ClientSavingsIntegrationTest {
|
||||
final String percentage = "10";
|
||||
final Integer taxGroupId = createTaxGroup(percentage);
|
||||
final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, MINIMUM_OPENING_BALANCE,
|
||||
minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft, String.valueOf(taxGroupId));
|
||||
minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft, String.valueOf(taxGroupId), false);
|
||||
Assert.assertNotNull(savingsProductID);
|
||||
|
||||
final Integer savingsId = this.savingsAccountHelper.applyForSavingsApplication(clientID, savingsProductID, ACCOUNT_TYPE_INDIVIDUAL);
|
||||
@@ -890,6 +893,152 @@ public class ClientSavingsIntegrationTest {
|
||||
Assert.assertEquals(expected, actual, 1);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSavingsAccount_DormancyTracking() {
|
||||
this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
|
||||
|
||||
final Integer clientID = ClientHelper.createClient(this.requestSpec, this.responseSpec);
|
||||
Assert.assertNotNull(clientID);
|
||||
final String minBalanceForInterestCalculation = null;
|
||||
final String minRequiredBalance = null;
|
||||
final String enforceMinRequiredBalance = "false";
|
||||
final boolean allowOverdraft = false;
|
||||
final String percentage = "10";
|
||||
final Integer taxGroupId = createTaxGroup(percentage);
|
||||
final Integer savingsProductID = createSavingsProduct(this.requestSpec, this.responseSpec, MINIMUM_OPENING_BALANCE,
|
||||
minBalanceForInterestCalculation, minRequiredBalance, enforceMinRequiredBalance, allowOverdraft, String.valueOf(taxGroupId), true);
|
||||
Assert.assertNotNull(savingsProductID);
|
||||
|
||||
final Integer savingsChargeId = ChargesHelper.createCharges(this.requestSpec, this.responseSpec,
|
||||
ChargesHelper.getSavingsNoActivityFeeJSON());
|
||||
Assert.assertNotNull(savingsChargeId);
|
||||
|
||||
ArrayList<Integer> savingsList = new ArrayList<>();
|
||||
|
||||
for(int i=0; i< 5; i++){
|
||||
final Integer savingsId = this.savingsAccountHelper.applyForSavingsApplication(clientID, savingsProductID, ACCOUNT_TYPE_INDIVIDUAL);
|
||||
Assert.assertNotNull(savingsProductID);
|
||||
|
||||
HashMap modifications = this.savingsAccountHelper.updateSavingsAccount(clientID, savingsProductID, savingsId,
|
||||
ACCOUNT_TYPE_INDIVIDUAL);
|
||||
Assert.assertTrue(modifications.containsKey("submittedOnDate"));
|
||||
|
||||
this.savingsAccountHelper.addChargesForSavings(savingsId, savingsChargeId);
|
||||
|
||||
HashMap savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsId);
|
||||
SavingsStatusChecker.verifySavingsIsPending(savingsStatusHashMap);
|
||||
|
||||
savingsStatusHashMap = this.savingsAccountHelper.approveSavings(savingsId);
|
||||
SavingsStatusChecker.verifySavingsIsApproved(savingsStatusHashMap);
|
||||
|
||||
savingsStatusHashMap = this.savingsAccountHelper.activateSavings(savingsId);
|
||||
SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
|
||||
savingsList.add(savingsId);
|
||||
}
|
||||
|
||||
final Integer savingsId = this.savingsAccountHelper.applyForSavingsApplication(clientID, savingsProductID, ACCOUNT_TYPE_INDIVIDUAL);
|
||||
Assert.assertNotNull(savingsProductID);
|
||||
|
||||
HashMap modifications = this.savingsAccountHelper.updateSavingsAccount(clientID, savingsProductID, savingsId,
|
||||
ACCOUNT_TYPE_INDIVIDUAL);
|
||||
Assert.assertTrue(modifications.containsKey("submittedOnDate"));
|
||||
|
||||
HashMap savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsId);
|
||||
SavingsStatusChecker.verifySavingsIsPending(savingsStatusHashMap);
|
||||
|
||||
savingsList.add(savingsId);
|
||||
|
||||
final DateTimeFormatter formatter = DateTimeFormat.forPattern("dd MMMM yyyy");
|
||||
LocalDate transactionDate = new LocalDate();
|
||||
for(int i=0; i< 4; i++){
|
||||
String TRANSACTION_DATE = formatter.print(transactionDate);
|
||||
Integer depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsList.get(i), DEPOSIT_AMOUNT,
|
||||
TRANSACTION_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
|
||||
transactionDate = transactionDate.minusDays(30);
|
||||
}
|
||||
|
||||
SchedulerJobHelper jobHelper = new SchedulerJobHelper(this.requestSpec, this.responseSpec);
|
||||
try {
|
||||
jobHelper.executeJob("Update Savings Dormant Accounts");
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
//VERIFY WITHIN PROVIDED RANGE DOESN'T INACTIVATE
|
||||
savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(0));
|
||||
SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
|
||||
savingsStatusHashMap = SavingsStatusChecker.getSubStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(0));
|
||||
SavingsStatusChecker.verifySavingsSubStatusNone(savingsStatusHashMap);
|
||||
HashMap summary = this.savingsAccountHelper.getSavingsSummary(savingsList.get(0));
|
||||
Float balance = 3000f;
|
||||
Float chargeAmt = 0f;
|
||||
balance -= chargeAmt;
|
||||
assertEquals("Verifying account Balance", balance, summary.get("accountBalance"));
|
||||
|
||||
|
||||
//VERIFY INACTIVE
|
||||
savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(1));
|
||||
SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
|
||||
savingsStatusHashMap = SavingsStatusChecker.getSubStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(1));
|
||||
SavingsStatusChecker.verifySavingsSubStatusInactive(savingsStatusHashMap);
|
||||
summary = this.savingsAccountHelper.getSavingsSummary(savingsList.get(1));
|
||||
balance = 3000f;
|
||||
chargeAmt = 100f;
|
||||
balance -= chargeAmt;
|
||||
assertEquals("Verifying account Balance", balance, summary.get("accountBalance"));
|
||||
|
||||
String TRANSACTION_DATE = formatter.print(new LocalDate());
|
||||
Integer depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsList.get(1), DEPOSIT_AMOUNT,
|
||||
TRANSACTION_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
|
||||
savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(1));
|
||||
SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
|
||||
savingsStatusHashMap = SavingsStatusChecker.getSubStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(1));
|
||||
SavingsStatusChecker.verifySavingsSubStatusNone(savingsStatusHashMap);
|
||||
|
||||
//VERIFY DORMANT
|
||||
savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(2));
|
||||
SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
|
||||
savingsStatusHashMap = SavingsStatusChecker.getSubStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(2));
|
||||
SavingsStatusChecker.verifySavingsSubStatusDormant(savingsStatusHashMap);
|
||||
summary = this.savingsAccountHelper.getSavingsSummary(savingsList.get(2));
|
||||
balance = 3000f;
|
||||
chargeAmt = 100f;
|
||||
balance -= chargeAmt;
|
||||
assertEquals("Verifying account Balance", balance, summary.get("accountBalance"));
|
||||
|
||||
TRANSACTION_DATE = formatter.print(new LocalDate());
|
||||
depositTransactionId = (Integer) this.savingsAccountHelper.depositToSavingsAccount(savingsList.get(2), DEPOSIT_AMOUNT,
|
||||
TRANSACTION_DATE, CommonConstants.RESPONSE_RESOURCE_ID);
|
||||
savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(2));
|
||||
SavingsStatusChecker.verifySavingsIsActive(savingsStatusHashMap);
|
||||
savingsStatusHashMap = SavingsStatusChecker.getSubStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(2));
|
||||
SavingsStatusChecker.verifySavingsSubStatusNone(savingsStatusHashMap);
|
||||
|
||||
//VERIFY ESCHEAT DUE TO OLD TRANSACTION
|
||||
savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(3));
|
||||
SavingsStatusChecker.verifySavingsAccountIsClosed(savingsStatusHashMap);
|
||||
savingsStatusHashMap = SavingsStatusChecker.getSubStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(3));
|
||||
SavingsStatusChecker.verifySavingsSubStatusEscheat(savingsStatusHashMap);
|
||||
summary = this.savingsAccountHelper.getSavingsSummary(savingsList.get(3));
|
||||
assertEquals("Verifying account Balance", 2900f, summary.get("accountBalance"));
|
||||
|
||||
//VERIFY ESCHEAT DUE NO TRANSACTION FROM ACTIVATION
|
||||
savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(4));
|
||||
SavingsStatusChecker.verifySavingsAccountIsClosed(savingsStatusHashMap);
|
||||
savingsStatusHashMap = SavingsStatusChecker.getSubStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(4));
|
||||
SavingsStatusChecker.verifySavingsSubStatusEscheat(savingsStatusHashMap);
|
||||
summary = this.savingsAccountHelper.getSavingsSummary(savingsList.get(4));
|
||||
assertEquals("Verifying account Balance", 900f, summary.get("accountBalance"));
|
||||
|
||||
//VERIFY NON ACTIVE ACCOUNTS ARE NOT AFFECTED
|
||||
savingsStatusHashMap = SavingsStatusChecker.getStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(5));
|
||||
SavingsStatusChecker.verifySavingsIsPending(savingsStatusHashMap);
|
||||
savingsStatusHashMap = SavingsStatusChecker.getSubStatusOfSavings(this.requestSpec, this.responseSpec, savingsList.get(5));
|
||||
SavingsStatusChecker.verifySavingsSubStatusNone(savingsStatusHashMap);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private HashMap activateSavingsAccount(final Integer savingsId, final String activationDate) {
|
||||
@@ -902,18 +1051,21 @@ public class ClientSavingsIntegrationTest {
|
||||
String enforceMinRequiredBalance, final boolean allowOverdraft) {
|
||||
final String taxGroupId = null;
|
||||
return createSavingsProduct(requestSpec, responseSpec, minOpenningBalance, minBalanceForInterestCalculation, minRequiredBalance,
|
||||
enforceMinRequiredBalance, allowOverdraft, taxGroupId);
|
||||
enforceMinRequiredBalance, allowOverdraft, taxGroupId, false);
|
||||
}
|
||||
|
||||
private Integer createSavingsProduct(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
|
||||
final String minOpenningBalance, String minBalanceForInterestCalculation, String minRequiredBalance,
|
||||
String enforceMinRequiredBalance, final boolean allowOverdraft, final String taxGroupId) {
|
||||
String enforceMinRequiredBalance, final boolean allowOverdraft, final String taxGroupId, boolean withDormancy) {
|
||||
System.out.println("------------------------------CREATING NEW SAVINGS PRODUCT ---------------------------------------");
|
||||
SavingsProductHelper savingsProductHelper = new SavingsProductHelper();
|
||||
if (allowOverdraft) {
|
||||
final String overDraftLimit = "2000.0";
|
||||
savingsProductHelper = savingsProductHelper.withOverDraft(overDraftLimit);
|
||||
}
|
||||
if(withDormancy){
|
||||
savingsProductHelper = savingsProductHelper.withDormancy();
|
||||
}
|
||||
|
||||
final String savingsProductJSON = savingsProductHelper
|
||||
//
|
||||
|
||||
+9
@@ -48,6 +48,7 @@ public class ChargesHelper {
|
||||
private static final Integer CHARGE_OVERDUE_INSTALLMENT_FEE = 9;
|
||||
private static final Integer CHARGE_OVERDRAFT_FEE = 10;
|
||||
private static final Integer WEEKLY_FEE = 11;
|
||||
private static final Integer CHARGE_SAVINGS_NO_ACTIVITY_FEE = 16;
|
||||
|
||||
private static final Integer CHARGE_CLIENT_SPECIFIED_DUE_DATE = 1;
|
||||
|
||||
@@ -88,6 +89,14 @@ public class ChargesHelper {
|
||||
return chargesCreateJson;
|
||||
}
|
||||
|
||||
public static String getSavingsNoActivityFeeJSON() {
|
||||
final HashMap<String, Object> map = populateDefaultsForSavings();
|
||||
map.put("chargeTimeType", CHARGE_SAVINGS_NO_ACTIVITY_FEE);
|
||||
String chargesCreateJson = new Gson().toJson(map);
|
||||
System.out.println(chargesCreateJson);
|
||||
return chargesCreateJson;
|
||||
}
|
||||
|
||||
public static String getSavingsWithdrawalFeeJSON() {
|
||||
final HashMap<String, Object> map = populateDefaultsForSavings();
|
||||
map.put("chargeTimeType", CHARGE_WITHDRAWAL_FEE);
|
||||
|
||||
+11
@@ -27,6 +27,8 @@ public class SavingsApplicationTestBuilder {
|
||||
private static final String LOCALE = "en_GB";
|
||||
|
||||
private String submittedOnDate = "";
|
||||
|
||||
private HashMap<String, String> addParams = null;
|
||||
|
||||
public String build(final String ID, final String savingsProductId, final String accountType) {
|
||||
|
||||
@@ -40,6 +42,9 @@ public class SavingsApplicationTestBuilder {
|
||||
map.put("productId", savingsProductId);
|
||||
map.put("locale", LOCALE);
|
||||
map.put("submittedOnDate", this.submittedOnDate);
|
||||
if(addParams!=null && addParams.size() > 0){
|
||||
map.putAll(addParams);
|
||||
}
|
||||
String savingsApplicationJSON = new Gson().toJson(map);
|
||||
System.out.println(savingsApplicationJSON);
|
||||
return savingsApplicationJSON;
|
||||
@@ -49,4 +54,10 @@ public class SavingsApplicationTestBuilder {
|
||||
this.submittedOnDate = savingsApplicationSubmittedDate;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SavingsApplicationTestBuilder withParams(
|
||||
HashMap<String, String> params) {
|
||||
this.addParams = params;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
+20
@@ -88,6 +88,10 @@ public class SavingsProductHelper {
|
||||
private String enforceMinRequiredBalance = "false";
|
||||
private Boolean withHoldTax = false;
|
||||
private String taxGroupId = null;
|
||||
private boolean isDormancyTrackingActive = false;
|
||||
private String daysToInactive = null;
|
||||
private String daysToDormancy = null;
|
||||
private String daysToEscheat = null;
|
||||
|
||||
public String build() {
|
||||
final HashMap<String, String> map = new HashMap<>();
|
||||
@@ -130,6 +134,13 @@ public class SavingsProductHelper {
|
||||
if (this.accountingRule.equals(CASH_BASED)) {
|
||||
map.putAll(getAccountMappingForCashBased());
|
||||
}
|
||||
if(this.isDormancyTrackingActive){
|
||||
map.put("isDormancyTrackingActive", Boolean.toString(this.isDormancyTrackingActive));
|
||||
map.put("daysToInactive", this.daysToInactive);
|
||||
map.put("daysToDormancy", this.daysToDormancy);
|
||||
map.put("daysToEscheat", this.daysToEscheat);
|
||||
|
||||
}
|
||||
String savingsProductCreateJson = new Gson().toJson(map);
|
||||
System.out.println(savingsProductCreateJson);
|
||||
return savingsProductCreateJson;
|
||||
@@ -263,4 +274,13 @@ public class SavingsProductHelper {
|
||||
assertEquals("ERROR IN CREATING THE Savings Product", generatedProductID, responseSavingsProductID);
|
||||
}
|
||||
|
||||
public SavingsProductHelper withDormancy() {
|
||||
this.isDormancyTrackingActive = true;
|
||||
this.daysToInactive = "30";
|
||||
this.daysToDormancy = "60";
|
||||
this.daysToEscheat = "90";
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
+32
-1
@@ -80,7 +80,38 @@ public class SavingsStatusChecker {
|
||||
return Utils.performServerGet(requestSpec, responseSpec, url, "status");
|
||||
}
|
||||
|
||||
private static boolean getStatus(final HashMap savingsStatusMap, final String nameOfSavingsStatusString) {
|
||||
public static HashMap getSubStatusOfSavings(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
|
||||
final Integer savingsID) {
|
||||
final String url = SAVINGS_ACCOUNT_URL+"/" + savingsID + "?"+Utils.TENANT_IDENTIFIER;
|
||||
return Utils.performServerGet(requestSpec, responseSpec, url, "subStatus");
|
||||
}
|
||||
|
||||
private static boolean getStatus(final HashMap savingsStatusMap, final String nameOfSavingsStatusString) {
|
||||
return (Boolean) savingsStatusMap.get(nameOfSavingsStatusString);
|
||||
}
|
||||
|
||||
public static void verifySavingsSubStatusInactive(HashMap savingsStatusHashMap) {
|
||||
System.out.println("\n-------------------------------------- VERIFYING SAVINGS APPLICATION IS ACTIVE ------------------------------------");
|
||||
assertTrue("UNEXPECTED SAVINGS ACCOUNT SUB STATUS", getStatus(savingsStatusHashMap, "inactive"));
|
||||
System.out.println("Savings Application Sub Status:" + savingsStatusHashMap + "\n");
|
||||
}
|
||||
|
||||
public static void verifySavingsSubStatusDormant(HashMap savingsStatusHashMap) {
|
||||
System.out.println("\n-------------------------------------- VERIFYING SAVINGS APPLICATION IS ACTIVE ------------------------------------");
|
||||
assertTrue("UNEXPECTED SAVINGS ACCOUNT SUB STATUS", getStatus(savingsStatusHashMap, "dormant"));
|
||||
System.out.println("Savings Application Sub Status:" + savingsStatusHashMap + "\n");
|
||||
}
|
||||
|
||||
public static void verifySavingsSubStatusEscheat(HashMap savingsStatusHashMap) {
|
||||
System.out.println("\n-------------------------------------- VERIFYING SAVINGS APPLICATION IS ACTIVE ------------------------------------");
|
||||
assertTrue("UNEXPECTED SAVINGS ACCOUNT SUB STATUS", getStatus(savingsStatusHashMap, "escheat"));
|
||||
System.out.println("Savings Application Sub Status:" + savingsStatusHashMap + "\n");
|
||||
}
|
||||
|
||||
public static void verifySavingsSubStatusNone(HashMap savingsStatusHashMap) {
|
||||
System.out.println("\n-------------------------------------- VERIFYING SAVINGS APPLICATION IS ACTIVE ------------------------------------");
|
||||
assertTrue("UNEXPECTED SAVINGS ACCOUNT SUB STATUS", getStatus(savingsStatusHashMap, "none"));
|
||||
System.out.println("Savings Application Sub Status:" + savingsStatusHashMap + "\n");
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user