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);//

Reply via email to