This is an automated email from the ASF dual-hosted git repository. adamsaghy pushed a commit to branch release/1.13.1 in repository https://gitbox.apache.org/repos/asf/fineract.git
commit 7c9c00e13584b2e1b10b304264a525502fdab77f 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);//
