This is an automated email from the ASF dual-hosted git repository.
adamsaghy 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 9eb94dd7ef FINERACT-2455: added e2e tests for WCPL config with
validation check
9eb94dd7ef is described below
commit 9eb94dd7ef34c39212b6322d45b8f9838095e1f1
Author: MarianaDmytrivBinariks <[email protected]>
AuthorDate: Wed Mar 4 18:04:11 2026 +0200
FINERACT-2455: added e2e tests for WCPL config with validation check
---
.../DefaultWorkingCapitalLoanProduct.java | 3 +-
.../WorkingCapitalLoanProductRequestFactory.java | 70 --
.../test/factory/WorkingCapitalRequestFactory.java | 159 ++++
.../fineract/test/helper/ErrorMessageHelper.java | 29 +
.../org/apache/fineract/test/helper/Utils.java | 4 +
.../test/stepdef/loan/WorkingCapitalStepDef.java | 808 +++++++++++++++++++++
.../fineract/test/support/TestContextKey.java | 6 +
...tep.java => WorkingCapitalInitializerStep.java} | 40 +-
.../features/WorkingCapitalLoanProduct.feature | 135 ++++
...orkingCapitalLoanProductApiResourceSwagger.java | 2 +
10 files changed, 1159 insertions(+), 97 deletions(-)
diff --git
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/workingcapitalproduct/DefaultWorkingCapitalLoanProduct.java
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/workingcapitalproduct/DefaultWorkingCapitalLoanProduct.java
index 6cf76bcf00..bb35365fc0 100644
---
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/workingcapitalproduct/DefaultWorkingCapitalLoanProduct.java
+++
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/data/workingcapitalproduct/DefaultWorkingCapitalLoanProduct.java
@@ -20,7 +20,8 @@ package org.apache.fineract.test.data.workingcapitalproduct;
public enum DefaultWorkingCapitalLoanProduct implements
WorkingCapitalLoanProduct {
- WCLP; //
+ WCLP, //
+ WCLP_FOR_UPDATE; //
@Override
public String getName() {
diff --git
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalLoanProductRequestFactory.java
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalLoanProductRequestFactory.java
deleted file mode 100644
index da33587441..0000000000
---
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalLoanProductRequestFactory.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.fineract.test.factory;
-
-import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.CURRENCY_CODE;
-import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.DATE_FORMAT;
-import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.DAYS_IN_MONTH_TYPE_30;
-import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.DAYS_IN_YEAR_TYPE_360;
-import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.DELINQUENCY_BUCKET_ID;
-import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.FUND_ID;
-import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.LOCALE_EN;
-
-import java.math.BigDecimal;
-import lombok.RequiredArgsConstructor;
-import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest;
-import org.apache.fineract.test.helper.Utils;
-import org.springframework.stereotype.Component;
-
-@Component
-@RequiredArgsConstructor
-public class WorkingCapitalLoanProductRequestFactory {
-
- private final LoanProductsRequestFactory loanProductsRequestFactory;
-
- public static final String WCLP_NAME_PREFIX = "WCLP-";
- public static final String WCLP_DESCRIPTION = "Working Capital Loan
Product";
-
- public PostWorkingCapitalLoanProductsRequest
defaultWorkingCapitalLoanProductRequest() {
- String name = Utils.randomStringGenerator(WCLP_NAME_PREFIX, 10);
- String shortName =
loanProductsRequestFactory.generateShortNameSafely();
-
- return new PostWorkingCapitalLoanProductsRequest()//
- .name(name)//
- .shortName(shortName)//
- .description(WCLP_DESCRIPTION)//
- .fundId(FUND_ID)//
- .periodPaymentRate(new BigDecimal(1))//
-
.repaymentFrequencyType(PostWorkingCapitalLoanProductsRequest.RepaymentFrequencyTypeEnum.valueOf("DAYS"))//
- .repaymentEvery(DAYS_IN_MONTH_TYPE_30)//
- .startDate(null)//
- .closeDate(null)//
- .currencyCode(CURRENCY_CODE)//
- .digitsAfterDecimal(2)//
- .inMultiplesOf(0)//
- .principal(new BigDecimal(100))//
- .minPrincipal(new BigDecimal(10))//
- .maxPrincipal(new BigDecimal(100000))//
-
.amortizationType(PostWorkingCapitalLoanProductsRequest.AmortizationTypeEnum.valueOf("EIR"))//
- .npvDayCount(DAYS_IN_YEAR_TYPE_360)//
- .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
- .dateFormat(DATE_FORMAT)//
- .locale(LOCALE_EN);//
- }
-}
diff --git
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalRequestFactory.java
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalRequestFactory.java
new file mode 100644
index 0000000000..22817033af
--- /dev/null
+++
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/factory/WorkingCapitalRequestFactory.java
@@ -0,0 +1,159 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.test.factory;
+
+import static org.apache.fineract.test.data.DaysInYearType.DAYS365;
+import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.CURRENCY_CODE;
+import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.CURRENCY_CODE_USD;
+import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.DATE_FORMAT;
+import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.DAYS_IN_MONTH_TYPE_30;
+import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.DAYS_IN_YEAR_TYPE_360;
+import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.DELINQUENCY_BUCKET_ID;
+import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.FUND_ID;
+import static
org.apache.fineract.test.factory.LoanProductsRequestFactory.LOCALE_EN;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import lombok.RequiredArgsConstructor;
+import org.apache.fineract.client.models.PaymentAllocationOrder;
+import org.apache.fineract.client.models.PostAllowAttributeOverrides;
+import org.apache.fineract.client.models.PostPaymentAllocation;
+import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest;
+import
org.apache.fineract.client.models.PutWorkingCapitalLoanProductsProductIdRequest;
+import org.apache.fineract.test.helper.Utils;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class WorkingCapitalRequestFactory {
+
+ private final LoanProductsRequestFactory loanProductsRequestFactory;
+
+ public static final String WCLP_NAME_PREFIX = "WCLP-";
+ public static final String WCLP_DESCRIPTION = "Working Capital Loan
Product";
+ public static final String PENALTY = "PENALTY";
+ public static final String FEE = "FEE";
+ public static final String PRINCIPAL = "PRINCIPAL";
+
+ public PostWorkingCapitalLoanProductsRequest
defaultWorkingCapitalLoanProductRequest() {
+ String name = Utils.randomStringGenerator(WCLP_NAME_PREFIX, 10);
+ String shortName =
loanProductsRequestFactory.generateShortNameSafely();
+
+ return new PostWorkingCapitalLoanProductsRequest()//
+ .name(name)//
+ .shortName(shortName)//
+ .description(WCLP_DESCRIPTION)//
+ .fundId(FUND_ID)//
+ .periodPaymentRate(new BigDecimal(1))//
+
.repaymentFrequencyType(PostWorkingCapitalLoanProductsRequest.RepaymentFrequencyTypeEnum.DAYS)//
+ .repaymentEvery(DAYS_IN_MONTH_TYPE_30)//
+ .startDate(null)//
+ .closeDate(null)//
+ .currencyCode(CURRENCY_CODE)//
+ .digitsAfterDecimal(2)//
+ .inMultiplesOf(1)//
+ .principal(new BigDecimal(100))//
+ .minPrincipal(new BigDecimal(10))//
+ .maxPrincipal(new BigDecimal(100000))//
+
.amortizationType(PostWorkingCapitalLoanProductsRequest.AmortizationTypeEnum.EIR)//
+ .npvDayCount(DAYS_IN_YEAR_TYPE_360)//
+ .delinquencyBucketId(DELINQUENCY_BUCKET_ID.longValue())//
+ .dateFormat(DATE_FORMAT)//
+ .locale(LOCALE_EN)//
+ .paymentAllocation(List.of(//
+
createPaymentAllocation(PostPaymentAllocation.TransactionTypeEnum.DEFAULT.getValue(),
+ List.of(PENALTY, FEE, PRINCIPAL))));//
+ }
+
+ public PutWorkingCapitalLoanProductsProductIdRequest
defaultWorkingCapitalLoanProductRequestUpdate() {
+ String name = Utils.randomStringGenerator(WCLP_NAME_PREFIX, 10);
+ String shortName =
loanProductsRequestFactory.generateShortNameSafely();
+
+ PostAllowAttributeOverrides allowAttributeOverrides = new
PostAllowAttributeOverrides().delinquencyBucketClassification(true)
+
.discountDefault(false).flatPercentageAmount(true).periodPaymentFrequencyType(false).periodPaymentFrequency(true);
+
+ return new PutWorkingCapitalLoanProductsProductIdRequest()//
+ .name(name)//
+ .shortName(shortName)//
+ .description(WCLP_DESCRIPTION)//
+ .fundId(FUND_ID)//
+ .periodPaymentRate(new BigDecimal(1))//
+
.repaymentFrequencyType(PutWorkingCapitalLoanProductsProductIdRequest.RepaymentFrequencyTypeEnum.MONTHS)//
+ .repaymentEvery(1)//
+ .startDate(null)//
+ .closeDate(null)//
+ .currencyCode(CURRENCY_CODE_USD)//
+ .digitsAfterDecimal(2)//
+ .inMultiplesOf(1)//
+ .principal(new BigDecimal(200))//
+ .minPrincipal(new BigDecimal(15))//
+ .maxPrincipal(new BigDecimal(300000))//
+
.amortizationType(PutWorkingCapitalLoanProductsProductIdRequest.AmortizationTypeEnum.EIR)//
+ .npvDayCount(DAYS365.value)//
+ .delinquencyBucketId(null)//
+ .dateFormat(DATE_FORMAT)//
+ .locale(LOCALE_EN)//
+
.allowAttributeOverrides(allowAttributeOverrides).paymentAllocation(List.of(//
+
createPaymentAllocation(PostPaymentAllocation.TransactionTypeEnum.DEFAULT.getValue(),
//
+ List.of(FEE, PRINCIPAL, PENALTY))));//
+ }
+
+ public List<PostPaymentAllocation>
invalidNumberOfPaymentAllocationRulesForWorkingCapitalLoanProductCreateRequest()
{
+ return List.of(//
+
createPaymentAllocation(PostPaymentAllocation.TransactionTypeEnum.DEFAULT.getValue(),
//
+ List.of(FEE, PRINCIPAL, PENALTY, "INTEREST")));//
+ }
+
+ public List<PostPaymentAllocation>
invalidPaymentAllocationRulesForWorkingCapitalLoanProductCreateRequest() {
+ return List.of(//
+
createPaymentAllocation(PostPaymentAllocation.TransactionTypeEnum.DEFAULT.getValue(),
//
+ List.of(FEE, PRINCIPAL, "INTEREST")));//
+ }
+
+ public List<PostPaymentAllocation>
invalidNumberOfPaymentAllocationRulesForWorkingCapitalLoanProductUpdateRequest()
{
+ return List.of(//
+
createPaymentAllocation(PostPaymentAllocation.TransactionTypeEnum.DEFAULT.getValue(),
//
+ List.of(FEE, PRINCIPAL, PENALTY, "INTEREST")));//
+ }
+
+ public List<PostPaymentAllocation>
invalidPaymentAllocationRulesForWorkingCapitalLoanProductUpdateRequest() {
+ return List.of(//
+
createPaymentAllocation(PostPaymentAllocation.TransactionTypeEnum.DEFAULT.getValue(),
//
+ List.of(FEE, PRINCIPAL, "INTEREST")));//
+ }
+
+ public static PostPaymentAllocation createPaymentAllocation(String
transactionType, List<String> paymentAllocationRules) {
+ PostPaymentAllocation.TransactionTypeEnum transactionTypeName =
PostPaymentAllocation.TransactionTypeEnum.valueOf(transactionType);
+ PostPaymentAllocation paymentAllocationData = new
PostPaymentAllocation();
+ paymentAllocationData.setTransactionType(transactionTypeName);
+
+ List<PaymentAllocationOrder> paymentAllocationOrders = new
ArrayList<>();
+ for (int i = 0; i < paymentAllocationRules.size(); i++) {
+ PaymentAllocationOrder e = new PaymentAllocationOrder();
+ e.setOrder(i + 1);
+ e.setPaymentAllocationRule(paymentAllocationRules.get(i));
+ paymentAllocationOrders.add(e);
+ }
+
+
paymentAllocationData.setPaymentAllocationOrder(paymentAllocationOrders);
+ return paymentAllocationData;
+ }
+
+}
diff --git
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java
index f9ced27a25..d689a359f2 100644
---
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java
+++
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java
@@ -1011,4 +1011,33 @@ public final class ErrorMessageHelper {
public static String reAmortizeSameDateFailure() {
return "Validation errors: [id] Loan reamortization can only be done
once a day. There has already been a reamortization done for today";
}
+
+ public static String incorrectExpectedValueInResponse() {
+ return "The parameter is not matching to expected.";
+ }
+
+ public static String fieldValueNullOrEmptyMandatoryFailure(String
fieldName) {
+ return String.format("The parameter `%s` is mandatory.", fieldName);
+ }
+
+ public static String fieldValueMoreMaxLengthAllowedFailure(String
fieldName, int maxAllowedLength) {
+ return String.format("The parameter `%s` exceeds max length of %d.",
fieldName, maxAllowedLength);
+ }
+
+ public static String fieldValueZeroValueFailure(String fieldName) {
+ return String.format("The parameter `%s` must be greater than 0.",
fieldName);
+ }
+
+ public static String paymentAllocationRulesInvalidNumberFailure(int
actualNumberOfPaymentAllocationRules) {
+ return String.format("Each provided payment allocation must contain
exactly 3 allocation rules, but %d were provided",
+ actualNumberOfPaymentAllocationRules);
+ }
+
+ public static String paymentAllocationRulesInvalidValueFailure() {
+ return "One or more payment allocation types are invalid or not
recognized";
+ }
+
+ public static String
workingCapitalLoanProductIdentifiedDoesNotExistFailure(String identifierId) {
+ return String.format("Working Capital Loan Product with identifier %s
does not exist", identifierId);
+ }
}
diff --git
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/Utils.java
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/Utils.java
index 8427be5b02..5da2b2e073 100644
---
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/Utils.java
+++
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/Utils.java
@@ -59,6 +59,10 @@ public final class Utils {
return randomStringGenerator(prefix, len,
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
}
+ public static String randomStringGenerator(final int len) {
+ return randomStringGenerator("", len);
+ }
+
public static String randomFirstNameGenerator() {
return firstNames.get(random.nextInt(firstNames.size()));
}
diff --git
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/WorkingCapitalStepDef.java
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/WorkingCapitalStepDef.java
new file mode 100644
index 0000000000..1590115c84
--- /dev/null
+++
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/WorkingCapitalStepDef.java
@@ -0,0 +1,808 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.test.stepdef.loan;
+
+import static org.apache.fineract.client.feign.util.FeignCalls.fail;
+import static org.apache.fineract.client.feign.util.FeignCalls.ok;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import io.cucumber.java.en.Then;
+import io.cucumber.java.en.When;
+import java.math.BigDecimal;
+import java.util.Map;
+import java.util.UUID;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.fineract.client.feign.FineractFeignClient;
+import org.apache.fineract.client.feign.services.WorkingCapitalLoanProductsApi;
+import org.apache.fineract.client.feign.util.CallFailedRuntimeException;
+import
org.apache.fineract.client.models.DeleteWorkingCapitalLoanProductsProductIdResponse;
+import org.apache.fineract.client.models.GetConfigurableAttributes;
+import org.apache.fineract.client.models.GetPaymentAllocation;
+import
org.apache.fineract.client.models.GetWorkingCapitalLoanProductsProductIdResponse;
+import org.apache.fineract.client.models.PostAllowAttributeOverrides;
+import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest;
+import
org.apache.fineract.client.models.PostWorkingCapitalLoanProductsResponse;
+import
org.apache.fineract.client.models.PutWorkingCapitalLoanProductsProductIdRequest;
+import
org.apache.fineract.client.models.PutWorkingCapitalLoanProductsProductIdResponse;
+import
org.apache.fineract.test.data.workingcapitalproduct.DefaultWorkingCapitalLoanProduct;
+import org.apache.fineract.test.factory.WorkingCapitalRequestFactory;
+import org.apache.fineract.test.helper.ErrorMessageHelper;
+import org.apache.fineract.test.helper.Utils;
+import org.apache.fineract.test.stepdef.AbstractStepDef;
+import org.apache.fineract.test.support.TestContext;
+import org.apache.fineract.test.support.TestContextKey;
+import org.assertj.core.api.SoftAssertions;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@Slf4j
+@RequiredArgsConstructor
+public class WorkingCapitalStepDef extends AbstractStepDef {
+
+ @Autowired
+ private WorkingCapitalRequestFactory workingCapitalRequestFactory;
+
+ private final FineractFeignClient fineractFeignClient;
+
+ public static final String NAME_FIELD_NAME = "name";
+ public static final String SHORT_NAME_FIELD = "shortName";
+ public static final String DESCRIPTION_FIELD_NAME = "description";
+ public static final String CURRENCY_CODE_FIELD_NAME = "currencyCode";
+ public static final String DIGITS_AFTER_DECIMAL_FIELD_NAME =
"digitsAfterDecimal";
+ public static final String IN_MULTIPLES_OF_FIELD_NAME = "inMultiplesOf";
+ public static final String AMORTIZATION_TYPE_FIELD_NAME =
"amortizationType";
+ public static final String NPV_DAY_COUNT_FIELD_NAME = "npvDayCount";
+ public static final String PRINCIPAL_FIELD_NAME = "principal";
+ public static final String MIN_PRINCIPAL_FIELD_NAME = "minPrincipal";
+ public static final String MAX_PRINCIPAL_FIELD_NAME = "maxPrincipal";
+ public static final String PERIOD_PAYMENT_RATE_FIELD_NAME =
"periodPaymentRate";
+ public static final String MIN_PERIOD_PAYMENT_RATE_FIELD_NAME =
"minPeriodPaymentRate";
+ public static final String MAX_PERIOD_PAYMENT_RATE_FIELD_NAME =
"maxPeriodPaymentRate";
+ public static final String REPAYMENT_FREQUENCY_TYPE_FIELD_NAME =
"repaymentFrequencyType";
+ public static final String REPAYMENT_EVERY_FIELD_NAME = "repaymentEvery";
+ public static final String EXTERNAL_ID_FIELD_NAME = "externalId";
+ public static final String DELINQUENCY_BUCKET_ID_FIELD_NAME =
"delinquencyBucketId";
+ public static final String LOCALE_FIELD_NAME = "locale";
+
+ private WorkingCapitalLoanProductsApi workingCapitalApi() {
+ return fineractFeignClient.workingCapitalLoanProducts();
+ }
+
+ @When("Admin creates a new Working Capital Loan Product")
+ public void createWorkingCapitalLoanProduct() {
+ final String workingCapitalProductDefaultName =
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+ + Utils.randomStringGenerator("_", 10);
+ final PostWorkingCapitalLoanProductsRequest
defaultWorkingCapitalLoanProductCreateRequest = workingCapitalRequestFactory
+ .defaultWorkingCapitalLoanProductRequest() //
+ .name(workingCapitalProductDefaultName); //
+ final PostWorkingCapitalLoanProductsResponse
responseDefaultWorkingCapitalLoanProductCreate =
createWorkingCapitalLoanProduct(
+ defaultWorkingCapitalLoanProductCreateRequest);
+
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE,
responseDefaultWorkingCapitalLoanProductCreate);
+
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST,
defaultWorkingCapitalLoanProductCreateRequest);
+ checkWorkingCapitalLoanProductCreate();
+ }
+
+ @When("Admin creates a new Working Capital Loan Product with external-id")
+ public void createWorkingCapitalLoanProductWithExternalId() {
+ final String workingCapitalProductDefaultName =
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+ + Utils.randomStringGenerator("_", 10);
+ final PostWorkingCapitalLoanProductsRequest
defaultWorkingCapitalLoanProductCreateRequest = workingCapitalRequestFactory
+ .defaultWorkingCapitalLoanProductRequest() //
+ .name(workingCapitalProductDefaultName) //
+ .externalId("EXT-WCP-" + UUID.randomUUID());//
+ final PostWorkingCapitalLoanProductsResponse
responseDefaultWorkingCapitalLoanProductCreate =
createWorkingCapitalLoanProduct(
+ defaultWorkingCapitalLoanProductCreateRequest);
+
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE,
responseDefaultWorkingCapitalLoanProductCreate);
+
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST,
defaultWorkingCapitalLoanProductCreateRequest);
+ checkWorkingCapitalLoanProductWithExternalIdCreate();
+ }
+
+ @Then("Admin failed to create a new Working Capital Loan Product field
{string} with empty or null mandatory data {string}")
+ public void createWorkingCapitalLoanProductWithEmptyDataFailed(String
fieldName, String value) {
+ String errorMessage =
ErrorMessageHelper.fieldValueNullOrEmptyMandatoryFailure(fieldName);
+ createWorkingCapitalLoanProductWithInvalidDataFailure(fieldName,
value, errorMessage);
+ }
+
+ @Then("Admin failed to create a new Working Capital Loan Product field
{string} with max length data {int} while max allowed is {int}")
+ public void createWorkingCapitalLoanProductWithMaxLengthDataFailed(String
fieldName, int maxLengthValue, int maxAllowedLengthValue) {
+ final String workingCapitalProductDefaultName =
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+ + Utils.randomStringGenerator("_", 10);
+ final PostWorkingCapitalLoanProductsRequest
defaultWorkingCapitalLoanProductCreateRequest = workingCapitalRequestFactory
+ .defaultWorkingCapitalLoanProductRequest() //
+ .name(workingCapitalProductDefaultName); //
+ String value = Utils.randomStringGenerator(maxLengthValue);
+ final PostWorkingCapitalLoanProductsRequest
workingCapitalLoanProductCreateRequestUpdated =
setWorkingCapitalLoanProductsCreateFieldValue(
+ defaultWorkingCapitalLoanProductCreateRequest, fieldName,
value);
+
+ String errorMessage =
ErrorMessageHelper.fieldValueMoreMaxLengthAllowedFailure(fieldName,
maxAllowedLengthValue);
+
checkCreateWorkingCapitalLoanProductWithInvalidDataFailure(workingCapitalLoanProductCreateRequestUpdated,
errorMessage);
+ }
+
+ @Then("Admin failed to create a new Working Capital Loan Product field
{string} with zero incorrect value")
+ public void createWorkingCapitalLoanProductWithZeroValueDataFailed(String
fieldName) {
+ String errorMessage =
ErrorMessageHelper.fieldValueZeroValueFailure(fieldName);
+ createWorkingCapitalLoanProductWithInvalidDataFailure(fieldName, "0",
errorMessage);
+ }
+
+ @Then("Admin failed to create a new Working Capital Loan Product field
{string} with invalid data {string} and got an error {string}")
+ public void createWorkingCapitalLoanProductWithInvalidDataFailed(String
fieldName, String value, String errorMessage) {
+ createWorkingCapitalLoanProductWithInvalidDataFailure(fieldName,
value, errorMessage);
+ }
+
+ @Then("Admin failed to create a new Working Capital Loan Product with
invalid number of payment allocation rules")
+ public void
createWorkingCapitalLoanProductWithInvalidNumberPaymentAllocationFailed() {
+ final String workingCapitalProductDefaultName =
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+ + Utils.randomStringGenerator("_", 10);
+ final PostWorkingCapitalLoanProductsRequest
defaultWorkingCapitalLoanProductCreateRequest = workingCapitalRequestFactory
+ .defaultWorkingCapitalLoanProductRequest() //
+ .name(workingCapitalProductDefaultName) //
+ .paymentAllocation(
+
workingCapitalRequestFactory.invalidNumberOfPaymentAllocationRulesForWorkingCapitalLoanProductCreateRequest());
+
+ String errorMessage =
ErrorMessageHelper.paymentAllocationRulesInvalidNumberFailure(4);
+
checkCreateWorkingCapitalLoanProductWithInvalidDataFailure(defaultWorkingCapitalLoanProductCreateRequest,
errorMessage);
+ }
+
+ @Then("Admin failed to create a new Working Capital Loan Product with
invalid value of payment allocation rules")
+ public void
createWorkingCapitalLoanProductWithInvalidPaymentAllocationFailed() {
+ final String workingCapitalProductDefaultName =
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+ + Utils.randomStringGenerator("_", 10);
+ final PostWorkingCapitalLoanProductsRequest
defaultWorkingCapitalLoanProductCreateRequest = workingCapitalRequestFactory
+ .defaultWorkingCapitalLoanProductRequest() //
+ .name(workingCapitalProductDefaultName) //
+
.paymentAllocation(workingCapitalRequestFactory.invalidPaymentAllocationRulesForWorkingCapitalLoanProductCreateRequest());
+
+ String errorMessage =
ErrorMessageHelper.paymentAllocationRulesInvalidValueFailure();
+
checkCreateWorkingCapitalLoanProductWithInvalidDataFailure(defaultWorkingCapitalLoanProductCreateRequest,
errorMessage);
+ }
+
+ @When("Admin updates a Working Capital Loan Product")
+ public void updateWorkingCapitalLoanProduct() {
+ final String workingCapitalProductDefaultName =
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+ + Utils.randomStringGenerator("_", 10);
+ final String workingCapitalProductDefaultShortName =
Utils.randomStringGenerator(4);
+ final PutWorkingCapitalLoanProductsProductIdRequest
workingCapitalLoanProductUpdateRequest = workingCapitalRequestFactory
+ .defaultWorkingCapitalLoanProductRequestUpdate() //
+ .name(workingCapitalProductDefaultName) //
+ .shortName(workingCapitalProductDefaultShortName)//
+ .externalId("EXT-WCP-" + UUID.randomUUID());
+
+ PostWorkingCapitalLoanProductsResponse
workingCapitalLoanProductsResponse = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+ Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+
+ PutWorkingCapitalLoanProductsProductIdResponse
responseWorkingCapitalLoanProductUpdate = ok(
+ () ->
workingCapitalApi().updateWorkingCapitalLoanProduct(resourceId,
workingCapitalLoanProductUpdateRequest, Map.of()));
+
+
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_RESPONSE,
responseWorkingCapitalLoanProductUpdate);
+
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST,
workingCapitalLoanProductUpdateRequest);
+ checkWorkingCapitalLoanProductUpdate();
+ }
+
+ @When("Admin updates a Working Capital Loan Product via external-id")
+ public void updateWorkingCapitalLoanProductViaExternalId() {
+ final String workingCapitalProductDefaultName =
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+ + Utils.randomStringGenerator("_", 10);
+ final String workingCapitalProductDefaultShortName =
Utils.randomStringGenerator(4);
+ final PutWorkingCapitalLoanProductsProductIdRequest
workingCapitalLoanProductUpdateRequest = workingCapitalRequestFactory
+ .defaultWorkingCapitalLoanProductRequestUpdate() //
+ .name(workingCapitalProductDefaultName) //
+ .shortName(workingCapitalProductDefaultShortName)//
+ .externalId("EXT-WCP-" + UUID.randomUUID());
+
+ PostWorkingCapitalLoanProductsRequest
workingCapitalLoanProductsRequest = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST);
+ String externalId = workingCapitalLoanProductsRequest.getExternalId();
+
+ PutWorkingCapitalLoanProductsProductIdResponse
responseWorkingCapitalLoanProductUpdate = ok(
+ () ->
workingCapitalApi().updateWorkingCapitalLoanProduct1(externalId,
workingCapitalLoanProductUpdateRequest, Map.of()));
+
+
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_RESPONSE,
responseWorkingCapitalLoanProductUpdate);
+
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST,
workingCapitalLoanProductUpdateRequest);
+ checkWorkingCapitalLoanProductWithExternalIdUpdate();
+ }
+
+ @Then("Admin failed to update a new Working Capital Loan Product field
{string} with max length data {int} while max allowed is {int}")
+ public void updateWorkingCapitalLoanProductWithMaxLengthDataFailed(String
fieldName, int maxLengthValue, int maxAllowedLengthValue) {
+ String value = Utils.randomStringGenerator(maxLengthValue);
+ PutWorkingCapitalLoanProductsProductIdRequest
defaultWorkingCapitalLoanProductUpdateRequest = new
PutWorkingCapitalLoanProductsProductIdRequest();
+ final PutWorkingCapitalLoanProductsProductIdRequest
workingCapitalLoanProductUpdateRequestUpdated =
setWorkingCapitalLoanProductsUpdateRequest(
+ defaultWorkingCapitalLoanProductUpdateRequest, fieldName,
value);
+
+ PostWorkingCapitalLoanProductsResponse
workingCapitalLoanProductsResponse = TestContext.GLOBAL
+
.get(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP);
+ Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+
+ String errorMessage =
ErrorMessageHelper.fieldValueMoreMaxLengthAllowedFailure(fieldName,
maxAllowedLengthValue);
+ checkUpdateWorkingCapitalLoanProductWithInvalidDataFailure(resourceId,
workingCapitalLoanProductUpdateRequestUpdated, errorMessage);
+ }
+
+ @Then("Admin failed to update a new Working Capital Loan Product field
{string} with zero incorrect value")
+ public void updateWorkingCapitalLoanProductWithZeroValueDataFailed(String
fieldName) {
+ PostWorkingCapitalLoanProductsResponse
workingCapitalLoanProductsResponse = TestContext.GLOBAL
+
.get(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP);
+ Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+ String errorMessage =
ErrorMessageHelper.fieldValueZeroValueFailure(fieldName);
+ updateWorkingCapitalLoanProductWithInvalidDataFailure(resourceId,
fieldName, "0", errorMessage);
+ }
+
+ @Then("Admin failed to update a new Working Capital Loan Product field
{string} with invalid data {string} and got an error {string}")
+ public void updateWorkingCapitalLoanProductWithInvalidDataFailed(String
fieldName, String value, String errorMessage) {
+ final PostWorkingCapitalLoanProductsRequest
workingCapitalProductForUpdateRequest = TestContext.GLOBAL
+
.get(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST_FOR_UPDATE_WCLP);
+ String workingCapitalProductName =
workingCapitalProductForUpdateRequest.getName();
+ final PutWorkingCapitalLoanProductsProductIdRequest
defaultWorkingCapitalLoanProductUpdateRequest = workingCapitalRequestFactory
+ .defaultWorkingCapitalLoanProductRequestUpdate() //
+ .name(workingCapitalProductName); //
+
+ PostWorkingCapitalLoanProductsResponse
workingCapitalLoanProductsResponse = TestContext.GLOBAL
+
.get(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP);
+ Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+
updateWorkingCapitalLoanProductWithInvalidDataFailure(defaultWorkingCapitalLoanProductUpdateRequest,
resourceId, fieldName, value,
+ errorMessage);
+ }
+
+ @Then("Admin failed to update a new Working Capital Loan Product with
invalid number of payment allocation rules")
+ public void
updateWorkingCapitalLoanProductWithInvalidNumberPaymentAllocationFailed() {
+ final PutWorkingCapitalLoanProductsProductIdRequest
defaultWorkingCapitalLoanProductUpdateRequest = new
PutWorkingCapitalLoanProductsProductIdRequest()
+ .paymentAllocation(
+
workingCapitalRequestFactory.invalidNumberOfPaymentAllocationRulesForWorkingCapitalLoanProductUpdateRequest());
+ PostWorkingCapitalLoanProductsResponse
workingCapitalLoanProductsResponse = TestContext.GLOBAL
+
.get(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP);
+ Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+
+ String errorMessage =
ErrorMessageHelper.paymentAllocationRulesInvalidNumberFailure(4);
+ checkUpdateWorkingCapitalLoanProductWithInvalidDataFailure(resourceId,
defaultWorkingCapitalLoanProductUpdateRequest, errorMessage);
+ }
+
+ @Then("Admin failed to update a new Working Capital Loan Product with
invalid value of payment allocation rules")
+ public void
updateWorkingCapitalLoanProductWithInvalidPaymentAllocationFailed() {
+ final PutWorkingCapitalLoanProductsProductIdRequest
defaultWorkingCapitalLoanProductUpdateRequest = new
PutWorkingCapitalLoanProductsProductIdRequest()
+
.paymentAllocation(workingCapitalRequestFactory.invalidPaymentAllocationRulesForWorkingCapitalLoanProductUpdateRequest());
+ PostWorkingCapitalLoanProductsResponse
workingCapitalLoanProductsResponse = TestContext.GLOBAL
+
.get(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP);
+ Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+
+ String errorMessage =
ErrorMessageHelper.paymentAllocationRulesInvalidValueFailure();
+ checkUpdateWorkingCapitalLoanProductWithInvalidDataFailure(resourceId,
defaultWorkingCapitalLoanProductUpdateRequest, errorMessage);
+ }
+
+ @Then("Admin failed to retrieve a Working Capital Loan Product with id
{int} that doesn't exist")
+ public void retrieveWorkingCapitalLoanProductFailure(Integer productId) {
+ CallFailedRuntimeException exception = fail(
+ () ->
workingCapitalApi().retrieveWorkingCapitalLoanProductDetails(Long.valueOf(productId),
Map.of()));
+
assertThat(exception.getStatus()).as(ErrorMessageHelper.dateFailureErrorCodeMsg()).isEqualTo(404);
+ assertThat(exception.getDeveloperMessage())
+
.contains(ErrorMessageHelper.workingCapitalLoanProductIdentifiedDoesNotExistFailure(String.valueOf(productId)));
+ }
+
+ @Then("Admin deletes a Working Capital Loan Product")
+ public void deleteWorkingCapitalLoanProduct() {
+ PostWorkingCapitalLoanProductsResponse
workingCapitalLoanProductsResponse = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+ Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+
+ DeleteWorkingCapitalLoanProductsProductIdResponse
deleteWorkingCapitalLoanProductResponse = ok(
+ () ->
workingCapitalApi().deleteWorkingCapitalLoanProduct(resourceId, Map.of()));
+
assertThat(deleteWorkingCapitalLoanProductResponse.getResourceId()).isEqualTo(resourceId);
+ }
+
+ @Then("Admin deletes a Working Capital Loan Product via external-id")
+ public void deleteWorkingCapitalLoanProductViaExternalId() {
+ PostWorkingCapitalLoanProductsResponse
workingCapitalLoanProductsResponse = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+ Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+
+ PutWorkingCapitalLoanProductsProductIdRequest
workingCapitalLoanProductsUpdateRequest = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST);
+ String externalId =
workingCapitalLoanProductsUpdateRequest.getExternalId();
+
+ DeleteWorkingCapitalLoanProductsProductIdResponse
deleteWorkingCapitalLoanProductResponse = ok(
+ () ->
workingCapitalApi().deleteWorkingCapitalLoanProduct1(externalId, Map.of()));
+
assertThat(deleteWorkingCapitalLoanProductResponse.getResourceId()).isEqualTo(resourceId);
+ }
+
+ @Then("Admin checks a Working Capital Loan Product is deleted and doesn't
exist")
+ public void checkWorkingCapitalLoanProductIsDeleted() {
+ PostWorkingCapitalLoanProductsResponse
workingCapitalLoanProductsResponse = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+ Long resourceId = workingCapitalLoanProductsResponse.getResourceId();
+ checkWorkingCapitalLoanProductDeleteFailure(resourceId);
+ }
+
+ @Then("Admin failed to delete a Working Capital Loan Product with id {int}
that doesn't exist")
+ public void checkWorkingCapitalLoanProductIsDeleted(Integer productId) {
+ checkWorkingCapitalLoanProductDeleteFailure(Long.valueOf(productId));
+ }
+
+ @Then("Admin checks a Working Capital Loan Product is deleted and doesn't
exist via external-id")
+ public void checkWorkingCapitalLoanProductIsDeletedViaExternalId() {
+ PutWorkingCapitalLoanProductsProductIdRequest
workingCapitalLoanProductsUpdateRequest = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST);
+ String externalId =
workingCapitalLoanProductsUpdateRequest.getExternalId();
+
+ CallFailedRuntimeException exception = fail(
+ () ->
workingCapitalApi().retrieveWorkingCapitalLoanProductDetails1(externalId,
Map.of()));
+
assertThat(exception.getStatus()).as(ErrorMessageHelper.dateFailureErrorCodeMsg()).isEqualTo(404);
+ assertThat(exception.getDeveloperMessage())
+
.contains(ErrorMessageHelper.workingCapitalLoanProductIdentifiedDoesNotExistFailure(String.valueOf(externalId)));
+ }
+
+ public PostWorkingCapitalLoanProductsResponse
createWorkingCapitalLoanProduct(
+ PostWorkingCapitalLoanProductsRequest
workingCapitalProductRequest) {
+ String workingCapitalProductName =
workingCapitalProductRequest.getName();
+ log.debug("Creating new working capital product: {}",
workingCapitalProductName);
+ try {
+ PostWorkingCapitalLoanProductsResponse response = ok(
+ () ->
workingCapitalApi().createWorkingCapitalLoanProduct(workingCapitalProductRequest,
Map.of()));
+ log.debug("Successfully created working capital product '{}' with
ID: {}", workingCapitalProductName, response.getResourceId());
+ return response;
+ } catch (Exception e) {
+ log.error("FAILED to create working capital product '{}'",
workingCapitalProductName, e);
+ throw e;
+ }
+ }
+
+ public void checkWorkingCapitalLoanProductCreate() {
+ PostWorkingCapitalLoanProductsRequest
workingCapitalLoanProductCreateRequest = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST);
+
+ PostWorkingCapitalLoanProductsResponse
workingCapitalLoanProductResponse = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+ Long resourceId = workingCapitalLoanProductResponse.getResourceId();
+ GetWorkingCapitalLoanProductsProductIdResponse
getWorkingCapitalProductResponse = workingCapitalApi()
+ .retrieveWorkingCapitalLoanProductDetails(resourceId,
Map.of());
+
checkWorkingCapitalLoanProductCreate(workingCapitalLoanProductCreateRequest,
getWorkingCapitalProductResponse);
+ }
+
+ public void checkWorkingCapitalLoanProductWithExternalIdCreate() {
+ PostWorkingCapitalLoanProductsRequest
workingCapitalLoanProductCreateRequest = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST);
+ String externalId =
workingCapitalLoanProductCreateRequest.getExternalId();
+
+ GetWorkingCapitalLoanProductsProductIdResponse
getWorkingCapitalProductResponse = workingCapitalApi()
+ .retrieveWorkingCapitalLoanProductDetails1(externalId,
Map.of());
+
checkWorkingCapitalLoanProductCreate(workingCapitalLoanProductCreateRequest,
getWorkingCapitalProductResponse);
+ }
+
+ public void
checkWorkingCapitalLoanProductCreate(PostWorkingCapitalLoanProductsRequest
workingCapitalLoanProductCreateRequest,
+ GetWorkingCapitalLoanProductsProductIdResponse
getWorkingCapitalProductResponse) {
+ PostWorkingCapitalLoanProductsResponse
workingCapitalLoanProductResponse = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+ Long resourceId = workingCapitalLoanProductResponse.getResourceId();
+
+ SoftAssertions assertions = new SoftAssertions();
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getName()).isEqualTo(getWorkingCapitalProductResponse.getName());
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getShortName())
+ .isEqualTo(getWorkingCapitalProductResponse.getShortName());
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getDescription())
+ .isEqualTo(getWorkingCapitalProductResponse.getDescription());
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getExternalId())
+ .isEqualTo(getWorkingCapitalProductResponse.getExternalId());
+
assertions.assertThat(resourceId).isEqualTo(getWorkingCapitalProductResponse.getId());
+
+ // check currency
+ assert getWorkingCapitalProductResponse.getCurrency() != null;
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getCurrencyCode())
+
.isEqualTo(getWorkingCapitalProductResponse.getCurrency().getCode());
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getDigitsAfterDecimal())
+
.isEqualTo(getWorkingCapitalProductResponse.getCurrency().getDecimalPlaces());
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getInMultiplesOf())
+
.isEqualTo(getWorkingCapitalProductResponse.getCurrency().getInMultiplesOf());
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getStartDate())
+ .isEqualTo(getWorkingCapitalProductResponse.getStartDate());
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getCloseDate())
+ .isEqualTo(getWorkingCapitalProductResponse.getCloseDate());
+
+ assert getWorkingCapitalProductResponse.getAmortizationType() != null;
+ assert workingCapitalLoanProductCreateRequest.getAmortizationType() !=
null;
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getAmortizationType().getValue())
+
.isEqualTo(getWorkingCapitalProductResponse.getAmortizationType().getCode());
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getNpvDayCount())
+ .isEqualTo(getWorkingCapitalProductResponse.getNpvDayCount());
+ assertions.assertThat(
+
workingCapitalLoanProductCreateRequest.getRepaymentEvery().compareTo(getWorkingCapitalProductResponse.getRepaymentEvery()))
+ .isEqualTo(0);
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getRepaymentFrequencyType().getValue())
+
.isEqualTo(getWorkingCapitalProductResponse.getRepaymentFrequencyType().getCode());
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getPeriodPaymentRate()
+
.compareTo(getWorkingCapitalProductResponse.getPeriodPaymentRate())).isEqualTo(0);
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getMinPeriodPaymentRate())
+
.isEqualTo(getWorkingCapitalProductResponse.getMinPeriodPaymentRate());
+
assertions.assertThat(workingCapitalLoanProductCreateRequest.getMaxPeriodPaymentRate())
+
.isEqualTo(getWorkingCapitalProductResponse.getMaxPeriodPaymentRate());
+
+ // check payment allocation rules
+ assert workingCapitalLoanProductCreateRequest.getPaymentAllocation()
!= null;
+
workingCapitalLoanProductCreateRequest.getPaymentAllocation().forEach(paymentAllocation
-> {
+ assert getWorkingCapitalProductResponse.getPaymentAllocation() !=
null;
+ GetPaymentAllocation getPaymentAllocation =
getWorkingCapitalProductResponse.getPaymentAllocation().stream()
+ .filter(paymentAllocationSearched -> {
+ assert paymentAllocation.getTransactionType() != null;
+ return
paymentAllocation.getTransactionType().getValue().equals(paymentAllocationSearched.getTransactionType());
+ }).findFirst().orElseThrow(() -> new RuntimeException("No
paymentAllocation is found!"));
+
assertions.assertThat(paymentAllocation.getPaymentAllocationOrder())
+
.containsAll(getPaymentAllocation.getPaymentAllocationOrder());
+ });
+
+ assertions
+ .assertThat(
+
workingCapitalLoanProductCreateRequest.getPrincipal().compareTo(getWorkingCapitalProductResponse.getPrincipal()))
+ .isEqualTo(0);
+ assertions.assertThat(
+
workingCapitalLoanProductCreateRequest.getMaxPrincipal().compareTo(getWorkingCapitalProductResponse.getMaxPrincipal()))
+ .isEqualTo(0);
+ assertions.assertThat(
+
workingCapitalLoanProductCreateRequest.getMinPrincipal().compareTo(getWorkingCapitalProductResponse.getMinPrincipal()))
+ .isEqualTo(0);
+
+ if
(workingCapitalLoanProductCreateRequest.getAllowAttributeOverrides() != null) {
+ PostAllowAttributeOverrides allowAttributeOverridesCreateResponse
= workingCapitalLoanProductCreateRequest
+ .getAllowAttributeOverrides();
+ GetConfigurableAttributes allowAttributeOverridesGetResponse =
getWorkingCapitalProductResponse.getAllowAttributeOverrides();
+ assert allowAttributeOverridesGetResponse != null;
+
assertions.assertThat(allowAttributeOverridesCreateResponse.getDiscountDefault())
+
.isEqualTo(allowAttributeOverridesGetResponse.getDiscountDefault());
+
assertions.assertThat(allowAttributeOverridesCreateResponse.getFlatPercentageAmount())
+
.isEqualTo(allowAttributeOverridesGetResponse.getFlatPercentageAmount());
+
assertions.assertThat(allowAttributeOverridesCreateResponse.getDelinquencyBucketClassification())
+
.isEqualTo(allowAttributeOverridesGetResponse.getDelinquencyBucketClassification());
+
assertions.assertThat(allowAttributeOverridesCreateResponse.getPeriodPaymentFrequency())
+
.isEqualTo(allowAttributeOverridesGetResponse.getPeriodPaymentFrequency());
+
assertions.assertThat(allowAttributeOverridesCreateResponse.getPeriodPaymentFrequencyType())
+
.isEqualTo(allowAttributeOverridesGetResponse.getPeriodPaymentFrequencyType());
+ }
+ assertions.assertAll();
+ }
+
+ public void checkWorkingCapitalLoanProductUpdate() {
+ PutWorkingCapitalLoanProductsProductIdRequest
workingCapitalLoanProductsUpdateRequest = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST);
+
+ PostWorkingCapitalLoanProductsResponse
workingCapitalLoanProductResponse = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+ Long resourceId = workingCapitalLoanProductResponse.getResourceId();
+
+ GetWorkingCapitalLoanProductsProductIdResponse
getWorkingCapitalProductResponse = workingCapitalApi()
+ .retrieveWorkingCapitalLoanProductDetails(resourceId,
Map.of());
+
checkWorkingCapitalLoanProductUpdate(workingCapitalLoanProductsUpdateRequest,
getWorkingCapitalProductResponse);
+ }
+
+ public void checkWorkingCapitalLoanProductWithExternalIdUpdate() {
+ PutWorkingCapitalLoanProductsProductIdRequest
workingCapitalLoanProductsUpdateRequest = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST);
+ String externalId =
workingCapitalLoanProductsUpdateRequest.getExternalId();
+
+ GetWorkingCapitalLoanProductsProductIdResponse
getWorkingCapitalProductResponse = workingCapitalApi()
+ .retrieveWorkingCapitalLoanProductDetails1(externalId,
Map.of());
+
checkWorkingCapitalLoanProductUpdate(workingCapitalLoanProductsUpdateRequest,
getWorkingCapitalProductResponse);
+ }
+
+ public void
checkWorkingCapitalLoanProductUpdate(PutWorkingCapitalLoanProductsProductIdRequest
workingCapitalLoanProductsUpdateRequest,
+ GetWorkingCapitalLoanProductsProductIdResponse
getWorkingCapitalProductResponse) {
+ PostWorkingCapitalLoanProductsResponse
workingCapitalLoanProductResponse = testContext()
+
.get(TestContextKey.WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE);
+ Long resourceId = workingCapitalLoanProductResponse.getResourceId();
+
+ SoftAssertions assertions = new SoftAssertions();
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getName()).isEqualTo(getWorkingCapitalProductResponse.getName());
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getShortName())
+ .isEqualTo(getWorkingCapitalProductResponse.getShortName());
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getDescription())
+ .isEqualTo(getWorkingCapitalProductResponse.getDescription());
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getExternalId())
+ .isEqualTo(getWorkingCapitalProductResponse.getExternalId());
+
assertions.assertThat(resourceId).isEqualTo(getWorkingCapitalProductResponse.getId());
+
+ // check currency
+ assert getWorkingCapitalProductResponse.getCurrency() != null;
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getCurrencyCode())
+
.isEqualTo(getWorkingCapitalProductResponse.getCurrency().getCode());
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getDigitsAfterDecimal())
+
.isEqualTo(getWorkingCapitalProductResponse.getCurrency().getDecimalPlaces());
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getInMultiplesOf())
+
.isEqualTo(getWorkingCapitalProductResponse.getCurrency().getInMultiplesOf());
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getStartDate())
+ .isEqualTo(getWorkingCapitalProductResponse.getStartDate());
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getCloseDate())
+ .isEqualTo(getWorkingCapitalProductResponse.getCloseDate());
+
+ assert getWorkingCapitalProductResponse.getAmortizationType() != null;
+ assert workingCapitalLoanProductsUpdateRequest.getAmortizationType()
!= null;
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getAmortizationType().getValue())
+
.isEqualTo(getWorkingCapitalProductResponse.getAmortizationType().getCode());
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getNpvDayCount())
+ .isEqualTo(getWorkingCapitalProductResponse.getNpvDayCount());
+ assertions.assertThat(
+
workingCapitalLoanProductsUpdateRequest.getRepaymentEvery().compareTo(getWorkingCapitalProductResponse.getRepaymentEvery()))
+ .isEqualTo(0);
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getRepaymentFrequencyType().getValue())
+
.isEqualTo(getWorkingCapitalProductResponse.getRepaymentFrequencyType().getCode());
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getPeriodPaymentRate()
+
.compareTo(getWorkingCapitalProductResponse.getPeriodPaymentRate())).isEqualTo(0);
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getMinPeriodPaymentRate())
+
.isEqualTo(getWorkingCapitalProductResponse.getMinPeriodPaymentRate());
+
assertions.assertThat(workingCapitalLoanProductsUpdateRequest.getMaxPeriodPaymentRate())
+
.isEqualTo(getWorkingCapitalProductResponse.getMaxPeriodPaymentRate());
+
+ // check payment allocation rules
+ assert workingCapitalLoanProductsUpdateRequest.getPaymentAllocation()
!= null;
+
workingCapitalLoanProductsUpdateRequest.getPaymentAllocation().forEach(paymentAllocation
-> {
+ assert getWorkingCapitalProductResponse.getPaymentAllocation() !=
null;
+ GetPaymentAllocation getPaymentAllocation =
getWorkingCapitalProductResponse.getPaymentAllocation().stream()
+ .filter(paymentAllocationSearched -> {
+ assert paymentAllocation.getTransactionType() != null;
+ return
paymentAllocation.getTransactionType().getValue().equals(paymentAllocationSearched.getTransactionType());
+ }).findFirst().orElseThrow(() -> new RuntimeException("No
paymentAllocation is found!"));
+
assertions.assertThat(paymentAllocation.getPaymentAllocationOrder())
+
.containsAll(getPaymentAllocation.getPaymentAllocationOrder());
+ });
+
+ assertions
+ .assertThat(
+
workingCapitalLoanProductsUpdateRequest.getPrincipal().compareTo(getWorkingCapitalProductResponse.getPrincipal()))
+ .isEqualTo(0);
+ assertions.assertThat(
+
workingCapitalLoanProductsUpdateRequest.getMaxPrincipal().compareTo(getWorkingCapitalProductResponse.getMaxPrincipal()))
+ .isEqualTo(0);
+ assertions.assertThat(
+
workingCapitalLoanProductsUpdateRequest.getMinPrincipal().compareTo(getWorkingCapitalProductResponse.getMinPrincipal()))
+ .isEqualTo(0);
+
+ if
(workingCapitalLoanProductsUpdateRequest.getAllowAttributeOverrides() != null) {
+ PostAllowAttributeOverrides allowAttributeOverridesCreateResponse
= workingCapitalLoanProductsUpdateRequest
+ .getAllowAttributeOverrides();
+ GetConfigurableAttributes allowAttributeOverridesGetResponse =
getWorkingCapitalProductResponse.getAllowAttributeOverrides();
+ assert allowAttributeOverridesGetResponse != null;
+
assertions.assertThat(allowAttributeOverridesCreateResponse.getDiscountDefault())
+
.isEqualTo(allowAttributeOverridesGetResponse.getDiscountDefault());
+
assertions.assertThat(allowAttributeOverridesCreateResponse.getFlatPercentageAmount())
+
.isEqualTo(allowAttributeOverridesGetResponse.getFlatPercentageAmount());
+
assertions.assertThat(allowAttributeOverridesCreateResponse.getDelinquencyBucketClassification())
+
.isEqualTo(allowAttributeOverridesGetResponse.getDelinquencyBucketClassification());
+
assertions.assertThat(allowAttributeOverridesCreateResponse.getPeriodPaymentFrequency())
+
.isEqualTo(allowAttributeOverridesGetResponse.getPeriodPaymentFrequency());
+
assertions.assertThat(allowAttributeOverridesCreateResponse.getPeriodPaymentFrequencyType())
+
.isEqualTo(allowAttributeOverridesGetResponse.getPeriodPaymentFrequencyType());
+ }
+ assertions.assertAll();
+ }
+
+ public void createWorkingCapitalLoanProductWithInvalidDataFailure(String
fieldName, String value, String errorMessage) {
+ final String workingCapitalProductDefaultName =
DefaultWorkingCapitalLoanProduct.WCLP.getName()
+ + Utils.randomStringGenerator("_", 10);
+ final PostWorkingCapitalLoanProductsRequest
defaultWorkingCapitalLoanProductCreateRequest = workingCapitalRequestFactory
+ .defaultWorkingCapitalLoanProductRequest() //
+ .name(workingCapitalProductDefaultName); //
+
+ final PostWorkingCapitalLoanProductsRequest
workingCapitalLoanProductCreateRequestUpdated =
setWorkingCapitalLoanProductsCreateFieldValue(
+ defaultWorkingCapitalLoanProductCreateRequest, fieldName,
value);
+
checkCreateWorkingCapitalLoanProductWithInvalidDataFailure(workingCapitalLoanProductCreateRequestUpdated,
errorMessage);
+ }
+
+ public void checkCreateWorkingCapitalLoanProductWithInvalidDataFailure(
+ PostWorkingCapitalLoanProductsRequest
workingCapitalLoanProductCreateRequestUpdated, String errorMessage) {
+ CallFailedRuntimeException exception = fail(
+ () ->
workingCapitalApi().createWorkingCapitalLoanProduct(workingCapitalLoanProductCreateRequestUpdated,
Map.of()));
+
assertThat(exception.getStatus()).as(ErrorMessageHelper.incorrectExpectedValueInResponse()).isEqualTo(400);
+ assertThat(exception.getDeveloperMessage()).contains(errorMessage);
+ }
+
+ public PostWorkingCapitalLoanProductsRequest
setWorkingCapitalLoanProductsCreateFieldValue(
+ PostWorkingCapitalLoanProductsRequest
defaultWorkingCapitalLoanProductCreateRequest, String fieldName, String
fieldValue) {
+ if (fieldValue.equals("null")) {
+ fieldValue = null;
+ }
+ Integer valueInteger = null;
+ BigDecimal valueBigDecimal = null;
+ if (fieldName.equalsIgnoreCase(DIGITS_AFTER_DECIMAL_FIELD_NAME) ||
fieldName.equalsIgnoreCase(IN_MULTIPLES_OF_FIELD_NAME)
+ || fieldName.equalsIgnoreCase(NPV_DAY_COUNT_FIELD_NAME) ||
fieldName.equalsIgnoreCase(REPAYMENT_EVERY_FIELD_NAME)) {
+ valueInteger = fieldValue != null ? Integer.valueOf(fieldValue) :
null;
+ }
+ if (fieldName.equalsIgnoreCase(PRINCIPAL_FIELD_NAME) ||
fieldName.equalsIgnoreCase(MIN_PRINCIPAL_FIELD_NAME)
+ || fieldName.equalsIgnoreCase(MAX_PRINCIPAL_FIELD_NAME) ||
fieldName.equalsIgnoreCase(PERIOD_PAYMENT_RATE_FIELD_NAME)
+ ||
fieldName.equalsIgnoreCase(MIN_PERIOD_PAYMENT_RATE_FIELD_NAME)
+ ||
fieldName.equalsIgnoreCase(MAX_PERIOD_PAYMENT_RATE_FIELD_NAME)) {
+ valueBigDecimal = fieldValue != null ? new BigDecimal(fieldValue)
: null;
+ }
+
+ switch (fieldName) {
+ case NAME_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setName(fieldValue);
+ break;
+ case SHORT_NAME_FIELD:
+
defaultWorkingCapitalLoanProductCreateRequest.setShortName(fieldValue);
+ break;
+ case DESCRIPTION_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setDescription(fieldValue);
+ break;
+ case CURRENCY_CODE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setCurrencyCode(fieldValue);
+ break;
+ case DIGITS_AFTER_DECIMAL_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setDigitsAfterDecimal(valueInteger);
+ break;
+ case IN_MULTIPLES_OF_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setInMultiplesOf(valueInteger);
+ break;
+ case AMORTIZATION_TYPE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setAmortizationType(
+ fieldValue == null ? null :
PostWorkingCapitalLoanProductsRequest.AmortizationTypeEnum.valueOf(fieldValue));
+ break;
+ case NPV_DAY_COUNT_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setNpvDayCount(valueInteger);
+ break;
+ case PRINCIPAL_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setPrincipal(valueBigDecimal);
+ break;
+ case MIN_PRINCIPAL_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setMinPrincipal(valueBigDecimal);
+ break;
+ case MAX_PRINCIPAL_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setMaxPrincipal(valueBigDecimal);
+ break;
+ case PERIOD_PAYMENT_RATE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setPeriodPaymentRate(valueBigDecimal);
+ break;
+ case MIN_PERIOD_PAYMENT_RATE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setMinPeriodPaymentRate(valueBigDecimal);
+ break;
+ case MAX_PERIOD_PAYMENT_RATE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setMaxPeriodPaymentRate(valueBigDecimal);
+ break;
+ case REPAYMENT_FREQUENCY_TYPE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setRepaymentFrequencyType(
+ fieldValue == null ? null :
PostWorkingCapitalLoanProductsRequest.RepaymentFrequencyTypeEnum.valueOf(fieldValue));
+ break;
+ case REPAYMENT_EVERY_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setRepaymentEvery(valueInteger);
+ break;
+ case EXTERNAL_ID_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setExternalId(fieldValue);
+ break;
+ case DELINQUENCY_BUCKET_ID_FIELD_NAME:
+ defaultWorkingCapitalLoanProductCreateRequest
+ .setDelinquencyBucketId(fieldValue != null ?
Long.parseLong(fieldValue) : null);
+ break;
+ case LOCALE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductCreateRequest.setLocale(fieldValue);
+ break;
+ default:
+ break;
+ }
+ return defaultWorkingCapitalLoanProductCreateRequest;
+ }
+
+ public void updateWorkingCapitalLoanProductWithInvalidDataFailure(Long
productId, String fieldName, String value, String errorMessage) {
+ final PutWorkingCapitalLoanProductsProductIdRequest
defaultWorkingCapitalLoanProductUpdateRequest = new
PutWorkingCapitalLoanProductsProductIdRequest();
+
updateWorkingCapitalLoanProductWithInvalidDataFailure(defaultWorkingCapitalLoanProductUpdateRequest,
productId, fieldName, value,
+ errorMessage);
+ }
+
+ public void updateWorkingCapitalLoanProductWithInvalidDataFailure(
+ PutWorkingCapitalLoanProductsProductIdRequest
defaultWorkingCapitalLoanProductUpdateRequest, Long productId, String fieldName,
+ String value, String errorMessage) {
+ final PutWorkingCapitalLoanProductsProductIdRequest
workingCapitalLoanProductUpdateRequestUpdated =
setWorkingCapitalLoanProductsUpdateRequest(
+ defaultWorkingCapitalLoanProductUpdateRequest, fieldName,
value);
+ checkUpdateWorkingCapitalLoanProductWithInvalidDataFailure(productId,
workingCapitalLoanProductUpdateRequestUpdated, errorMessage);
+ }
+
+ public void
checkUpdateWorkingCapitalLoanProductWithInvalidDataFailure(Long productId,
+ PutWorkingCapitalLoanProductsProductIdRequest
workingCapitalLoanProductUpdateRequestUpdated, String errorMessage) {
+ CallFailedRuntimeException exception = fail(() ->
workingCapitalApi().updateWorkingCapitalLoanProduct(productId,
+ workingCapitalLoanProductUpdateRequestUpdated, Map.of()));
+
assertThat(exception.getStatus()).as(ErrorMessageHelper.incorrectExpectedValueInResponse()).isEqualTo(400);
+ assertThat(exception.getDeveloperMessage()).contains(errorMessage);
+ }
+
+ public PutWorkingCapitalLoanProductsProductIdRequest
setWorkingCapitalLoanProductsUpdateRequest(
+ PutWorkingCapitalLoanProductsProductIdRequest
defaultWorkingCapitalLoanProductUpdateRequest, String fieldName,
+ String fieldValue) {
+ if (fieldValue.equals("null")) {
+ fieldValue = null;
+ }
+
+ Integer valueInteger = null;
+ BigDecimal valueBigDecimal = null;
+ if (fieldName.equalsIgnoreCase(DIGITS_AFTER_DECIMAL_FIELD_NAME) ||
fieldName.equalsIgnoreCase(IN_MULTIPLES_OF_FIELD_NAME)
+ || fieldName.equalsIgnoreCase(NPV_DAY_COUNT_FIELD_NAME) ||
fieldName.equalsIgnoreCase(REPAYMENT_EVERY_FIELD_NAME)) {
+ valueInteger = fieldValue != null ? Integer.valueOf(fieldValue) :
null;
+ }
+ if (fieldName.equalsIgnoreCase(PRINCIPAL_FIELD_NAME) ||
fieldName.equalsIgnoreCase(MIN_PRINCIPAL_FIELD_NAME)
+ || fieldName.equalsIgnoreCase(MAX_PRINCIPAL_FIELD_NAME) ||
fieldName.equalsIgnoreCase(PERIOD_PAYMENT_RATE_FIELD_NAME)
+ ||
fieldName.equalsIgnoreCase(MIN_PERIOD_PAYMENT_RATE_FIELD_NAME)
+ ||
fieldName.equalsIgnoreCase(MAX_PERIOD_PAYMENT_RATE_FIELD_NAME)) {
+ valueBigDecimal = fieldValue != null ? new BigDecimal(fieldValue)
: null;
+ }
+
+ switch (fieldName) {
+ case NAME_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setName(fieldValue);
+ break;
+ case SHORT_NAME_FIELD:
+
defaultWorkingCapitalLoanProductUpdateRequest.setShortName(fieldValue);
+ break;
+ case DESCRIPTION_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setDescription(fieldValue);
+ break;
+ case CURRENCY_CODE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setCurrencyCode(fieldValue);
+ break;
+ case DIGITS_AFTER_DECIMAL_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setDigitsAfterDecimal(valueInteger);
+ break;
+ case IN_MULTIPLES_OF_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setInMultiplesOf(valueInteger);
+ break;
+ case AMORTIZATION_TYPE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setAmortizationType(
+ fieldValue == null ? null :
PutWorkingCapitalLoanProductsProductIdRequest.AmortizationTypeEnum.valueOf(fieldValue));
+ break;
+ case NPV_DAY_COUNT_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setNpvDayCount(valueInteger);
+ break;
+ case PRINCIPAL_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setPrincipal(valueBigDecimal);
+ break;
+ case MIN_PRINCIPAL_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setMinPrincipal(valueBigDecimal);
+ break;
+ case MAX_PRINCIPAL_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setMaxPrincipal(valueBigDecimal);
+ break;
+ case PERIOD_PAYMENT_RATE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setPeriodPaymentRate(valueBigDecimal);
+ break;
+ case MIN_PERIOD_PAYMENT_RATE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setMinPeriodPaymentRate(valueBigDecimal);
+ break;
+ case MAX_PERIOD_PAYMENT_RATE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setMaxPeriodPaymentRate(valueBigDecimal);
+ break;
+ case REPAYMENT_FREQUENCY_TYPE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setRepaymentFrequencyType(fieldValue
== null ? null
+ :
PutWorkingCapitalLoanProductsProductIdRequest.RepaymentFrequencyTypeEnum.valueOf(fieldValue));
+ break;
+ case REPAYMENT_EVERY_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setRepaymentEvery(valueInteger);
+ break;
+ case EXTERNAL_ID_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setExternalId(fieldValue);
+ break;
+ case DELINQUENCY_BUCKET_ID_FIELD_NAME:
+ defaultWorkingCapitalLoanProductUpdateRequest
+ .setDelinquencyBucketId(fieldValue != null ?
Long.parseLong(fieldValue) : null);
+ break;
+ case LOCALE_FIELD_NAME:
+
defaultWorkingCapitalLoanProductUpdateRequest.setLocale(fieldValue);
+ break;
+ default:
+ break;
+ }
+ return defaultWorkingCapitalLoanProductUpdateRequest;
+ }
+
+ public void checkWorkingCapitalLoanProductDeleteFailure(Long productId) {
+ CallFailedRuntimeException exception = fail(
+ () ->
workingCapitalApi().retrieveWorkingCapitalLoanProductDetails(productId,
Map.of()));
+
assertThat(exception.getStatus()).as(ErrorMessageHelper.dateFailureErrorCodeMsg()).isEqualTo(404);
+ assertThat(exception.getDeveloperMessage())
+
.contains(ErrorMessageHelper.workingCapitalLoanProductIdentifiedDoesNotExistFailure(String.valueOf(productId)));
+ }
+}
diff --git
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/support/TestContextKey.java
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/support/TestContextKey.java
index 36a10e2174..70ceff1cb7 100644
---
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/support/TestContextKey.java
+++
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/support/TestContextKey.java
@@ -318,4 +318,10 @@ public abstract class TestContextKey {
public static final String
DEFAULT_LOAN_PRODUCT_CREATE_RESPONSE_LP2_DOWNPAYMENT_ADVANCED_PAYMENT_ALLOCATION_PROGRESSIVE_LOAN_SCHEDULE_VERTICAL_INTEREST_RECALC
=
"loanProductCreateResponseLP2DownPaymentAdvancedPaymentAllocationProgressiveLoanScheduleVerticalInterestRecalc";
public static final String
DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP =
"workingCapitalLoanProductCreateResponseWCLP";
public static final String WC_LOAN_IDS = "wcLoanIds";
+ public static final String
DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST_FOR_UPDATE_WCLP =
"workingCapitalLoanProductCreateRequestForUpdateWCLP";
+ public static final String
DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP =
"workingCapitalLoanProductCreateResponseForUpdateWCLP";
+ public static final String WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST =
"workingCapitalLoanProductCreateRequest";
+ public static final String WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE =
"workingCapitalLoanProductCreateResponse";
+ public static final String WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_REQUEST =
"workingCapitalLoanProductUpdateRequest";
+ public static final String WORKING_CAPITAL_LOAN_PRODUCT_UPDATE_RESPONSE =
"workingCapitalLoanProductUpdateResponse";
}
diff --git
a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalLoanProductInitializerStep.java
b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalInitializerStep.java
similarity index 72%
rename from
fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalLoanProductInitializerStep.java
rename to
fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalInitializerStep.java
index 1beffe735c..931e739ad3 100644
---
a/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalLoanProductInitializerStep.java
+++
b/fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WorkingCapitalInitializerStep.java
@@ -20,19 +20,16 @@ package org.apache.fineract.test.initializer.global;
import static org.apache.fineract.client.feign.util.FeignCalls.ok;
-import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.fineract.client.feign.FineractFeignClient;
import org.apache.fineract.client.models.GetWorkingCapitalLoanProductsResponse;
-import org.apache.fineract.client.models.PaymentAllocationOrder;
-import org.apache.fineract.client.models.PostPaymentAllocation;
import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest;
import
org.apache.fineract.client.models.PostWorkingCapitalLoanProductsResponse;
import
org.apache.fineract.test.data.workingcapitalproduct.DefaultWorkingCapitalLoanProduct;
-import
org.apache.fineract.test.factory.WorkingCapitalLoanProductRequestFactory;
+import org.apache.fineract.test.factory.WorkingCapitalRequestFactory;
import org.apache.fineract.test.support.TestContext;
import org.apache.fineract.test.support.TestContextKey;
import org.springframework.stereotype.Component;
@@ -40,39 +37,30 @@ import org.springframework.stereotype.Component;
@Slf4j
@RequiredArgsConstructor
@Component
-public class WorkingCapitalLoanProductInitializerStep implements
FineractGlobalInitializerStep {
+public class WorkingCapitalInitializerStep implements
FineractGlobalInitializerStep {
private final FineractFeignClient fineractClient;
- private final WorkingCapitalLoanProductRequestFactory
workingCapitalLoanProductRequestFactory;
+ private final WorkingCapitalRequestFactory workingCapitalRequestFactory;
@Override
public void initialize() throws Exception {
final String workingCapitalProductDefaultName =
DefaultWorkingCapitalLoanProduct.WCLP.getName();
- final PostWorkingCapitalLoanProductsRequest defaultWCPLRequest =
workingCapitalLoanProductRequestFactory
+ final PostWorkingCapitalLoanProductsRequest defaultWCPLRequest =
workingCapitalRequestFactory
.defaultWorkingCapitalLoanProductRequest() //
- .name(workingCapitalProductDefaultName) //
- .paymentAllocation(List.of(//
- createPaymentAllocation("DEFAULT", List.of("PENALTY",
"FEE", "PRINCIPAL"))));//
+ .name(workingCapitalProductDefaultName); //
final PostWorkingCapitalLoanProductsResponse responseDefaultWCPL =
createWorkingCapitalLoanProductIdempotent(defaultWCPLRequest);
TestContext.INSTANCE.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_WCLP,
responseDefaultWCPL);
- }
-
- private static PostPaymentAllocation createPaymentAllocation(String
transactionType, List<String> paymentAllocationRules) {
- PostPaymentAllocation.TransactionTypeEnum transactionTypeName =
PostPaymentAllocation.TransactionTypeEnum.valueOf(transactionType);
- PostPaymentAllocation paymentAllocationData = new
PostPaymentAllocation();
- paymentAllocationData.setTransactionType(transactionTypeName);
- List<PaymentAllocationOrder> paymentAllocationOrders = new
ArrayList<>();
- for (int i = 0; i < paymentAllocationRules.size(); i++) {
- PaymentAllocationOrder e = new PaymentAllocationOrder();
- e.setOrder(i + 1);
- e.setPaymentAllocationRule(paymentAllocationRules.get(i));
- paymentAllocationOrders.add(e);
- }
-
-
paymentAllocationData.setPaymentAllocationOrder(paymentAllocationOrders);
- return paymentAllocationData;
+ final String workingCapitalProductForUpdateName =
DefaultWorkingCapitalLoanProduct.WCLP_FOR_UPDATE.getName();
+ final PostWorkingCapitalLoanProductsRequest
defaultForUpdateWCPLRequest = workingCapitalRequestFactory
+ .defaultWorkingCapitalLoanProductRequest() //
+ .name(workingCapitalProductForUpdateName); //
+ final PostWorkingCapitalLoanProductsResponse responseForUpdateWCPL =
createWorkingCapitalLoanProductIdempotent(
+ defaultForUpdateWCPLRequest);
+
TestContext.GLOBAL.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_REQUEST_FOR_UPDATE_WCLP,
+ defaultForUpdateWCPLRequest);
+
TestContext.GLOBAL.set(TestContextKey.DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE_FOR_UPDATE_WCLP,
responseForUpdateWCPL);
}
private PostWorkingCapitalLoanProductsResponse
createWorkingCapitalLoanProductIdempotent(
diff --git
a/fineract-e2e-tests-runner/src/test/resources/features/WorkingCapitalLoanProduct.feature
b/fineract-e2e-tests-runner/src/test/resources/features/WorkingCapitalLoanProduct.feature
new file mode 100644
index 0000000000..63c2acbc5c
--- /dev/null
+++
b/fineract-e2e-tests-runner/src/test/resources/features/WorkingCapitalLoanProduct.feature
@@ -0,0 +1,135 @@
+@WorkingCapitalLoanProductFeature
+Feature: WorkingCapitalLoanProduct
+
+ @TestRailId:C70208
+ Scenario: Verify Working capital Loan Product create/edit/delete with valid
data - happy path - UC1
+ When Admin creates a new Working Capital Loan Product
+ When Admin updates a Working Capital Loan Product
+ Then Admin deletes a Working Capital Loan Product
+ Then Admin checks a Working Capital Loan Product is deleted and doesn't
exist
+
+ @TestRailId:C70209
+ Scenario: Verify Working capital Loan Product create/edit/delete via
external-id with valid data - happy path - UC2
+ When Admin creates a new Working Capital Loan Product with external-id
+ When Admin updates a Working Capital Loan Product via external-id
+ Then Admin deletes a Working Capital Loan Product via external-id
+ Then Admin checks a Working Capital Loan Product is deleted and doesn't
exist via external-id
+
+ @TestRailId:C70210
+ Scenario Outline: Verify Working capital Loan Product create with invalid
data shall outcome with error - validation check with mandatory fields - UC3
+ Then Admin failed to create a new Working Capital Loan Product field
"<wcp_field_name_mandatory>" with empty or null mandatory data
<wcp_empty_field_value_mandatory>
+
+ Examples:
+ | wcp_field_name_mandatory | wcp_empty_field_value_mandatory |
+ | name | "null" |
+ | name | "" |
+ | shortName | "" |
+ | shortName | "null" |
+ | currencyCode | "" |
+ | currencyCode | "null" |
+ | digitsAfterDecimal | "null" |
+ | amortizationType | "null" |
+ | npvDayCount | "null" |
+ | principal | "null" |
+ | periodPaymentRate | "null" |
+ | repaymentFrequencyType | "null" |
+
+ @TestRailId:C70211
+ Scenario Outline: Verify Working capital Loan Product create with invalid
data shall outcome with error - validation check with max allowed length - UC4
+ Then Admin failed to create a new Working Capital Loan Product field
"<wcp_field_name_max_length>" with max length data
<wcp_invalid_field_value_max_length> while max allowed is
<wcp_invalid_field_value_max_allowed_length>
+
+ Examples:
+ | wcp_field_name_max_length | wcp_invalid_field_value_max_length |
wcp_invalid_field_value_max_allowed_length |
+ | name | 101 | 100
|
+ | shortName | 9 | 4
|
+ | description | 550 | 500
|
+ | currencyCode | 4 | 3
|
+
+ @TestRailId:C70212
+ Scenario Outline: Verify Working capital Loan Product update with invalid
data shall outcome with error - validation check with max allowed length - UC5
+ Then Admin failed to update a new Working Capital Loan Product field
"<wcp_field_name_max_length>" with max length data
<wcp_invalid_field_value_max_length> while max allowed is
<wcp_invalid_field_value_max_allowed_length>
+
+ Examples:
+ | wcp_field_name_max_length | wcp_invalid_field_value_max_length |
wcp_invalid_field_value_max_allowed_length |
+ | name | 111 | 100
|
+ | shortName | 5 | 4
|
+ | description | 600 | 500
|
+ | currencyCode | 10 | 3
|
+
+ @TestRailId:C70213
+ Scenario Outline: Verify Working capital Loan Product create with invalid
data shall outcome with error - validation check with zero values - UC6
+ Then Admin failed to create a new Working Capital Loan Product field
"<wcp_field_name_zero_value>" with zero incorrect value
+
+ Examples:
+ | wcp_field_name_zero_value |
+ | npvDayCount |
+ | principal |
+ | minPrincipal |
+ | maxPrincipal |
+ | delinquencyBucketId |
+
+ @TestRailId:C70214
+ Scenario Outline: Verify Working capital Loan Product update with invalid
data shall outcome with error - validation check with zero values - UC7
+ Then Admin failed to update a new Working Capital Loan Product field
"<wcp_field_name_zero_value>" with zero incorrect value
+
+ Examples:
+ | wcp_field_name_zero_value |
+ | npvDayCount |
+ | principal |
+ | minPrincipal |
+ | maxPrincipal |
+ | delinquencyBucketId |
+
+ @TestRailId:C70215
+ Scenario Outline: Verify Working capital Loan Product create with invalid
data shall outcome with error - validation check with diff values - U8
+ Then Admin failed to create a new Working Capital Loan Product field
"<wcp_field_name>" with invalid data <wcp_invalid_field_value> and got an error
<wcp_error_message>
+
+ Examples:
+ | wcp_field_name | wcp_invalid_field_value |
wcp_error_message
|
+ | digitsAfterDecimal | "25" | "The parameter
`digitsAfterDecimal` must be between 0 and 6." |
+ | inMultiplesOf | "-1" | "The parameter
`inMultiplesOf` must be zero or greater." |
+ | periodPaymentRate | "-1" | "The parameter
`periodPaymentRate` must be greater than or equal to 0." |
+ | locale | "null" | "The parameter
`digitsAfterDecimal` requires a `locale` parameter to be passed with it." |
+ | locale | "" | "The parameter
`locale` is invalid. It cannot be blank." |
+
+ @TestRailId:C70216
+ Scenario Outline: Verify Working capital Loan Product update with invalid
data shall outcome with error - validation check with diff values - UC9
+ Then Admin failed to update a new Working Capital Loan Product field
"<wcp_field_name>" with invalid data <wcp_invalid_field_value> and got an error
<wcp_error_message>
+
+ Examples:
+ | wcp_field_name | wcp_invalid_field_value |
wcp_error_message
|
+ | digitsAfterDecimal | "25" | "The parameter
`digitsAfterDecimal` must be between 0 and 6." |
+ | inMultiplesOf | "-1" | "The parameter
`inMultiplesOf` must be zero or greater." |
+ | periodPaymentRate | "-1" | "The parameter
`periodPaymentRate` must be greater than or equal to 0." |
+
+ @TestRailId:C70217
+ Scenario: Verify Working capital Loan Product create with invalid data shall
outcome with error - validation check with number of payment allocation rules -
UC10
+ Then Admin failed to create a new Working Capital Loan Product with
invalid number of payment allocation rules
+
+ @TestRailId:C70218
+ Scenario: Verify Working capital Loan Product create with invalid data shall
outcome with error - validation check with payment allocation rules - UC11
+ Then Admin failed to create a new Working Capital Loan Product with
invalid value of payment allocation rules
+
+ @TestRailId:C70219
+ Scenario: Verify Working capital Loan Product update with invalid data shall
outcome with error - validation check with number of payment allocation rules -
UC12
+ Then Admin failed to update a new Working Capital Loan Product with
invalid number of payment allocation rules
+
+ @TestRailId:C70220
+ Scenario: Verify Working capital Loan Product update with invalid data shall
outcome with error - validation check with payment allocation rules - UC13
+ Then Admin failed to update a new Working Capital Loan Product with
invalid value of payment allocation rules
+
+ @TestRailId:C70221
+ Scenario Outline: Verify Working capital Loan Product delete with invalid
data shall outcome with error - validation check with id - UC14
+ Then Admin failed to delete a Working Capital Loan Product with id
<wcp_field_name_incorrect_value> that doesn't exist
+ Examples:
+ | wcp_field_name_incorrect_value |
+ | 103284 |
+ | 0 |
+
+ @TestRailId:C70222
+ Scenario Outline: Verify Working capital Loan Product retrieve with invalid
data shall outcome with error - validation check with id - UC15
+ Then Admin failed to retrieve a Working Capital Loan Product with id
<wcp_field_name_incorrect_value> that doesn't exist
+ Examples:
+ | wcp_field_name_incorrect_value |
+ | 565465 |
+ | 0 |
diff --git
a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/api/WorkingCapitalLoanProductApiResourceSwagger.java
b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/api/WorkingCapitalLoanProductApiResourceSwagger.java
index 44281d9b5a..d0cd51d91a 100644
---
a/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/api/WorkingCapitalLoanProductApiResourceSwagger.java
+++
b/fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloanproduct/api/WorkingCapitalLoanProductApiResourceSwagger.java
@@ -367,6 +367,8 @@ public final class
WorkingCapitalLoanProductApiResourceSwagger {
public String shortName;
@Schema(example = "Updated Working Capital Loan Product for merchants")
public String description;
+ @Schema(example = "2075e308-d4a8-44d9-8203-f5a947b8c2f4")
+ public String externalId;
@Schema(example = "3")
public Long fundId;
@Schema(example = "10 July 2022")