This is an automated email from the ASF dual-hosted git repository.
arnold 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 567b12170b FINERACT-2389: Improve E2E test data initialization
resilience
567b12170b is described below
commit 567b12170b4a4fa52f1f3f77c296162fb465a4a0
Author: Adam Saghy <[email protected]>
AuthorDate: Thu Oct 23 00:27:18 2025 +0200
FINERACT-2389: Improve E2E test data initialization resilience
---
.../test/factory/LoanProductsRequestFactory.java | 77 +++++++++++++---------
.../global/LoanProductGlobalInitializerStep.java | 12 ++--
2 files changed, 51 insertions(+), 38 deletions(-)
diff --git
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanProductsRequestFactory.java
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanProductsRequestFactory.java
index ab9d08312b..e976039474 100644
---
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanProductsRequestFactory.java
+++
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/LoanProductsRequestFactory.java
@@ -22,7 +22,9 @@ import static
org.apache.fineract.test.data.TransactionProcessingStrategyCode.AD
import java.math.BigDecimal;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import lombok.RequiredArgsConstructor;
import org.apache.fineract.client.models.AllowAttributeOverrides;
import
org.apache.fineract.client.models.GetLoanPaymentChannelToFundSourceMappings;
@@ -67,6 +69,8 @@ public class LoanProductsRequestFactory {
private final AccountTypeResolver accountTypeResolver;
private final CodeValueResolver codeValueResolver;
+ private final Set<String> productShortNameMap = new HashSet<>();
+
@Autowired
private CodeHelper codeHelper;
@@ -78,9 +82,6 @@ public class LoanProductsRequestFactory {
public static final String NAME_PREFIX_INTEREST_DECLINING =
"LP1InterestDeclining-";
public static final String NAME_PREFIX_INTEREST_DECLINING_RECALCULATION =
"LP1InterestDecliningRecalculation-";
public static final String NAME_PREFIX_INTEREST_RECALCULATION =
"LP2InterestRecalculation-";
- public static final String SHORT_NAME_PREFIX = "p";
- public static final String SHORT_NAME_PREFIX_INTEREST = "i";
- public static final String SHORT_NAME_PREFIX_EMI = "e";
public static final String DATE_FORMAT = "dd MMMM yyyy";
public static final String LOCALE_EN = "en";
public static final String DESCRIPTION = "30 days repayment";
@@ -126,8 +127,8 @@ public class LoanProductsRequestFactory {
public static final String CHARGE_OFF_REASONS = "ChargeOffReasons";
public PostLoanProductsRequest defaultLoanProductsRequestLP1() {
- String name = Utils.randomNameGenerator(NAME_PREFIX, 4);
- String shortName = Utils.randomNameGenerator(SHORT_NAME_PREFIX, 3);
+ String name = Utils.randomNameGenerator(NAME_PREFIX, 10);
+ String shortName = generateShortNameSafely();
List<Integer> principalVariationsForBorrowerCycle = new ArrayList<>();
List<Integer> numberOfRepaymentVariationsForBorrowerCycle = new
ArrayList<>();
@@ -236,8 +237,8 @@ public class LoanProductsRequestFactory {
}
public PostLoanProductsRequest defaultLoanProductsRequestLP1InterestFlat()
{
- String name = Utils.randomNameGenerator(NAME_PREFIX_INTEREST_FLAT, 4);
- String shortName =
Utils.randomNameGenerator(SHORT_NAME_PREFIX_INTEREST, 3);
+ String name = Utils.randomNameGenerator(NAME_PREFIX_INTEREST_FLAT, 10);
+ String shortName = generateShortNameSafely();
List<Integer> principalVariationsForBorrowerCycle = new ArrayList<>();
List<Integer> numberOfRepaymentVariationsForBorrowerCycle = new
ArrayList<>();
@@ -344,8 +345,8 @@ public class LoanProductsRequestFactory {
}
public PostLoanProductsRequest
defaultLoanProductsRequestLP1InterestDeclining() {
- String name =
Utils.randomNameGenerator(NAME_PREFIX_INTEREST_DECLINING, 4);
- String shortName =
Utils.randomNameGenerator(SHORT_NAME_PREFIX_INTEREST, 3);
+ String name =
Utils.randomNameGenerator(NAME_PREFIX_INTEREST_DECLINING, 10);
+ String shortName = generateShortNameSafely();
List<Integer> principalVariationsForBorrowerCycle = new ArrayList<>();
List<Integer> numberOfRepaymentVariationsForBorrowerCycle = new
ArrayList<>();
@@ -452,8 +453,8 @@ public class LoanProductsRequestFactory {
}
public PostLoanProductsRequest
defaultLoanProductsRequestLP11MonthInterestDecliningBalanceDailyRecalculationCompoundingMonthly()
{
- String name =
Utils.randomNameGenerator(NAME_PREFIX_INTEREST_DECLINING_RECALCULATION, 4);
- String shortName =
Utils.randomNameGenerator(SHORT_NAME_PREFIX_INTEREST, 3);
+ String name =
Utils.randomNameGenerator(NAME_PREFIX_INTEREST_DECLINING_RECALCULATION, 10);
+ String shortName = generateShortNameSafely();
List<Integer> principalVariationsForBorrowerCycle = new ArrayList<>();
List<Integer> numberOfRepaymentVariationsForBorrowerCycle = new
ArrayList<>();
@@ -565,8 +566,8 @@ public class LoanProductsRequestFactory {
}
public PostLoanProductsRequest
defaultLoanProductsRequestLP1InterestDecliningBalanceDailyRecalculationCompoundingNone()
{
- String name =
Utils.randomNameGenerator(NAME_PREFIX_INTEREST_DECLINING_RECALCULATION, 4);
- String shortName =
Utils.randomNameGenerator(SHORT_NAME_PREFIX_INTEREST, 3);
+ String name =
Utils.randomNameGenerator(NAME_PREFIX_INTEREST_DECLINING_RECALCULATION, 10);
+ String shortName = generateShortNameSafely();
List<Integer> principalVariationsForBorrowerCycle = new ArrayList<>();
List<Integer> numberOfRepaymentVariationsForBorrowerCycle = new
ArrayList<>();
@@ -675,8 +676,8 @@ public class LoanProductsRequestFactory {
}
public PostLoanProductsRequest
defaultLoanProductsRequestLP2InterestDailyRecalculation() {
- final String name =
Utils.randomNameGenerator(NAME_PREFIX_INTEREST_RECALCULATION, 4);
- final String shortName =
Utils.randomNameGenerator(SHORT_NAME_PREFIX_INTEREST, 3);
+ final String name =
Utils.randomNameGenerator(NAME_PREFIX_INTEREST_RECALCULATION, 10);
+ final String shortName = generateShortNameSafely();
List<LoanProductChargeToGLAccountMapper>
penaltyToIncomeAccountMappings = new ArrayList<>();
List<LoanProductChargeToGLAccountMapper> feeToIncomeAccountMappings =
new ArrayList<>();
@@ -790,8 +791,8 @@ public class LoanProductsRequestFactory {
}
public PostLoanProductsRequest defaultLoanProductsRequestLP2() {
- String name = Utils.randomNameGenerator(NAME_PREFIX_LP2, 4);
- String shortName = Utils.randomNameGenerator(SHORT_NAME_PREFIX, 3);
+ String name = Utils.randomNameGenerator(NAME_PREFIX_LP2, 10);
+ String shortName = generateShortNameSafely();
List<Integer> principalVariationsForBorrowerCycle = new ArrayList<>();
List<Integer> numberOfRepaymentVariationsForBorrowerCycle = new
ArrayList<>();
@@ -903,8 +904,8 @@ public class LoanProductsRequestFactory {
}
public PostLoanProductsRequest defaultLoanProductsRequestLP2InterestFlat()
{
- String name = Utils.randomNameGenerator(NAME_PREFIX_INTEREST_FLAT_LP2,
4);
- String shortName =
Utils.randomNameGenerator(SHORT_NAME_PREFIX_INTEREST, 3);
+ String name = Utils.randomNameGenerator(NAME_PREFIX_INTEREST_FLAT_LP2,
10);
+ String shortName = generateShortNameSafely();
List<Integer> principalVariationsForBorrowerCycle = new ArrayList<>();
List<Integer> numberOfRepaymentVariationsForBorrowerCycle = new
ArrayList<>();
@@ -1014,8 +1015,8 @@ public class LoanProductsRequestFactory {
}
public PostLoanProductsRequest defaultLoanProductsRequestLP2Emi() {
- String name = Utils.randomNameGenerator(NAME_PREFIX_LP2_EMI, 4);
- String shortName = Utils.randomNameGenerator(SHORT_NAME_PREFIX_EMI, 3);
+ String name = Utils.randomNameGenerator(NAME_PREFIX_LP2_EMI, 10);
+ String shortName = generateShortNameSafely();
List<Integer> principalVariationsForBorrowerCycle = new ArrayList<>();
List<Integer> numberOfRepaymentVariationsForBorrowerCycle = new
ArrayList<>();
@@ -1124,8 +1125,8 @@ public class LoanProductsRequestFactory {
}
public PostLoanProductsRequest
defaultLoanProductsRequestLP2EmiWithChargeOff() {
- String name = Utils.randomNameGenerator(NAME_PREFIX_LP2_EMI, 4);
- String shortName = Utils.randomNameGenerator(SHORT_NAME_PREFIX_EMI, 3);
+ String name = Utils.randomNameGenerator(NAME_PREFIX_LP2_EMI, 10);
+ String shortName = generateShortNameSafely();
List<Integer> principalVariationsForBorrowerCycle = new ArrayList<>();
List<Integer> numberOfRepaymentVariationsForBorrowerCycle = new
ArrayList<>();
@@ -1254,8 +1255,8 @@ public class LoanProductsRequestFactory {
}
public PostLoanProductsRequest
defaultLoanProductsRequestLP2ChargeOffReasonToExpenseAccountMappings() {
- final String name = Utils.randomNameGenerator(NAME_PREFIX_LP2, 4);
- final String shortName = Utils.randomNameGenerator(SHORT_NAME_PREFIX,
3);
+ final String name = Utils.randomNameGenerator(NAME_PREFIX_LP2, 10);
+ final String shortName = generateShortNameSafely();
final List<Integer> principalVariationsForBorrowerCycle = new
ArrayList<>();
final List<Integer> numberOfRepaymentVariationsForBorrowerCycle = new
ArrayList<>();
@@ -1376,8 +1377,8 @@ public class LoanProductsRequestFactory {
}
public PostLoanProductsRequest
defaultLoanProductsRequestLP2EmiCashAccounting() {
- String name = Utils.randomNameGenerator(NAME_PREFIX_LP2_EMI, 4);
- String shortName = Utils.randomNameGenerator(SHORT_NAME_PREFIX_EMI, 3);
+ String name = Utils.randomNameGenerator(NAME_PREFIX_LP2_EMI, 10);
+ String shortName = generateShortNameSafely();
List<Integer> principalVariationsForBorrowerCycle = new ArrayList<>();
List<Integer> numberOfRepaymentVariationsForBorrowerCycle = new
ArrayList<>();
@@ -1503,8 +1504,8 @@ public class LoanProductsRequestFactory {
}
public PostLoanProductsRequest
defaultLoanProductsRequestLP2CapitalizedIncome() {
- final String name = Utils.randomNameGenerator(NAME_PREFIX_LP2, 4);
- final String shortName = Utils.randomNameGenerator(SHORT_NAME_PREFIX,
3);
+ final String name = Utils.randomNameGenerator(NAME_PREFIX_LP2, 10);
+ final String shortName = generateShortNameSafely();
final List<Integer> principalVariationsForBorrowerCycle = new
ArrayList<>();
final List<Integer> numberOfRepaymentVariationsForBorrowerCycle = new
ArrayList<>();
final List<Integer> interestRateVariationsForBorrowerCycle = new
ArrayList<>();
@@ -1641,8 +1642,8 @@ public class LoanProductsRequestFactory {
}
public PostLoanProductsRequest defaultLoanProductsRequestLP2BuyDownFees() {
- final String name = Utils.randomNameGenerator(NAME_PREFIX_LP2, 4);
- final String shortName = Utils.randomNameGenerator(SHORT_NAME_PREFIX,
3);
+ final String name = Utils.randomNameGenerator(NAME_PREFIX_LP2, 10);
+ final String shortName = generateShortNameSafely();
final List<Integer> principalVariationsForBorrowerCycle = new
ArrayList<>();
final List<Integer> numberOfRepaymentVariationsForBorrowerCycle = new
ArrayList<>();
final List<Integer> interestRateVariationsForBorrowerCycle = new
ArrayList<>();
@@ -1777,4 +1778,18 @@ public class LoanProductsRequestFactory {
return defaultLoanProductsRequestLP2BuyDownFees()//
.chargeOffReasonToExpenseAccountMappings(chargeOffReasonToExpenseAccountMappings);//
}
+
+ public String generateShortNameSafely() {
+ String generatedShortName;
+ int counter = 0;
+ do {
+ counter++;
+ generatedShortName = Utils.randomNameGenerator("", 4);
+ if (counter > 999) {
+ throw new RuntimeException("Unable to generate unique short
name");
+ }
+ } while (productShortNameMap.contains(generatedShortName));
+ productShortNameMap.add(generatedShortName);
+ return generatedShortName;
+ }
}
diff --git
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
index 337acc99b7..174749caf1 100644
---
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
+++
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/initializer/global/LoanProductGlobalInitializerStep.java
@@ -26,7 +26,6 @@ import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.INTERE
import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.INTEREST_RATE_FREQUENCY_TYPE_YEAR;
import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.LOAN_ACCOUNTING_RULE_NONE;
import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.REPAYMENT_FREQUENCY_TYPE_MONTHS;
-import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.SHORT_NAME_PREFIX_EMI;
import java.math.BigDecimal;
import java.util.ArrayList;
@@ -62,7 +61,6 @@ import
org.apache.fineract.test.data.codevalue.DefaultCodeValue;
import org.apache.fineract.test.data.loanproduct.DefaultLoanProduct;
import org.apache.fineract.test.factory.LoanProductsRequestFactory;
import org.apache.fineract.test.helper.CodeHelper;
-import org.apache.fineract.test.helper.Utils;
import org.apache.fineract.test.support.TestContext;
import org.apache.fineract.test.support.TestContextKey;
import org.springframework.stereotype.Component;
@@ -2290,7 +2288,7 @@ public class LoanProductGlobalInitializerStep implements
FineractGlobalInitializ
final String name91 =
DefaultLoanProduct.LP2_ADV_PYMNT_INT_DAILY_EMI_ACTUAL_ACTUAL_INT_REFUND_FULL_ZERO_INT_CHARGE_OFF.getName();
final PostLoanProductsRequest
loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOff
= loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundFull
.name(name91)//
- .shortName(Utils.randomNameGenerator(SHORT_NAME_PREFIX_EMI,
3))//
+
.shortName(loanProductsRequestFactory.generateShortNameSafely())//
.chargeOffBehaviour("ZERO_INTEREST");//
final Response<PostLoanProductsResponse>
responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOff
= loanProductsApi
.createLoanProduct(loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullZeroIntChargeOff).execute();
@@ -2305,7 +2303,7 @@ public class LoanProductGlobalInitializerStep implements
FineractGlobalInitializ
.getName();
final PostLoanProductsRequest
loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullAccelerateMaturityChargeOff
=
loanProductsRequestLP2AdvancedpaymentInterestEmiActualActualInterestRefundFull
.name(name92)//
- .shortName(Utils.randomNameGenerator(SHORT_NAME_PREFIX_EMI,
3))//
+
.shortName(loanProductsRequestFactory.generateShortNameSafely())//
.chargeOffBehaviour("ACCELERATE_MATURITY");//
final Response<PostLoanProductsResponse>
responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullAccelerateMaturityChargeOff
= loanProductsApi
.createLoanProduct(loanProductsRequestLP2AdvPaymentIntEmiActualActualIntRefundFullAccelerateMaturityChargeOff).execute();
@@ -2340,7 +2338,7 @@ public class LoanProductGlobalInitializerStep implements
FineractGlobalInitializ
.getName();
final PostLoanProductsRequest
loanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullZeroIntChargeOff
=
loanProductsRequestLP2AdvancedPaymentInterestEmiActualActualNoInterestRecalcRefundFull
.name(name94)//
- .shortName(Utils.randomNameGenerator(SHORT_NAME_PREFIX_EMI,
3))//
+
.shortName(loanProductsRequestFactory.generateShortNameSafely())//
.chargeOffBehaviour("ZERO_INTEREST");//
final Response<PostLoanProductsResponse>
responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullZeroIntChargeOff
= loanProductsApi
.createLoanProduct(loanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullZeroIntChargeOff)
@@ -2356,7 +2354,7 @@ public class LoanProductGlobalInitializerStep implements
FineractGlobalInitializ
.getName();
final PostLoanProductsRequest
loanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullAccelerateMaturityChargeOff
=
loanProductsRequestLP2AdvancedPaymentInterestEmiActualActualNoInterestRecalcRefundFull
.name(name95)//
- .shortName(Utils.randomNameGenerator(SHORT_NAME_PREFIX_EMI,
3))//
+
.shortName(loanProductsRequestFactory.generateShortNameSafely())//
.chargeOffBehaviour("ACCELERATE_MATURITY");//
final Response<PostLoanProductsResponse>
responseLoanProductsRequestLP2AdvPaymentIntEmiActualActualNoInterestRecalcIntRefundFullAccelerateMaturityChargeOff
= loanProductsApi
.createLoanProduct(
@@ -3155,8 +3153,8 @@ public class LoanProductGlobalInitializerStep implements
FineractGlobalInitializ
.add(new
LoanProductChargeData().id(ChargeProductType.LOAN_INSTALLMENT_FEE_PERCENTAGE_INTEREST.value));
final PostLoanProductsRequest
loanProductsRequestLP2AdvPaymentInstallmentFeeFlatPlusInterestChargesMultiDisburse
= loanProductsRequestLP2AdvPaymentInstallmentFeePercentInterestCharges//
.name(name121)//
+
.shortName(loanProductsRequestFactory.generateShortNameSafely())//
.charges(chargesInstallmentFeeFlatPlusInterest)//
- .shortName(Utils.randomNameGenerator(SHORT_NAME_PREFIX_EMI,
3))//
.disallowExpectedDisbursements(true)//
.maxTrancheCount(10)//
.outstandingLoanBalance(10000.0);//