josehernandezfintecheandomx commented on code in PR #2633:
URL: https://github.com/apache/fineract/pull/2633#discussion_r991348462
##########
integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionChargebackTest.java:
##########
@@ -50,57 +55,263 @@
public class LoanTransactionChargebackTest {
private ResponseSpecification responseSpec;
+ private ResponseSpecification responseSpecError;
private RequestSpecification requestSpec;
+ private LoanTransactionHelper loanTransactionHelper;
+ private final String amountVal = "1000";
+ private LocalDate todaysDate;
+ private String operationDate;
@BeforeEach
public void setup() {
Utils.initializeRESTAssured();
this.requestSpec = new
RequestSpecBuilder().setContentType(ContentType.JSON).build();
this.requestSpec.header("Authorization", "Basic " +
Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
this.responseSpec = new
ResponseSpecBuilder().expectStatusCode(200).build();
+ this.responseSpecError = new
ResponseSpecBuilder().expectStatusCode(503).build();
+ this.loanTransactionHelper = new
LoanTransactionHelper(this.requestSpec, this.responseSpec);
+
+ this.todaysDate = Utils.getLocalDateOfTenant();
+ this.operationDate = Utils.dateFormatter.format(this.todaysDate);
}
@Test
public void applyLoanTransactionChargeback() {
- final LoanTransactionHelper loanTransactionHelper = new
LoanTransactionHelper(this.requestSpec, this.responseSpec);
+ // Client and Loan account creation
+ final Integer loanId = createAccounts(15);
+
+ GetLoansLoanIdResponse getLoansLoanIdResponse =
loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+
+ loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse);
+
+ Float amount = Float.valueOf(amountVal);
+ PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse =
loanTransactionHelper.makeLoanRepayment(operationDate, amount,
+ loanId);
+ assertNotNull(loanIdTransactionsResponse);
+ final Integer transactionId =
loanIdTransactionsResponse.getResourceId();
+
+ getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+ loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.closed.obligations.met");
+
+ reviewLoanTransactionRelations(loanId, transactionId, 0);
+
+ final Integer chargebackTransactionId =
applyChargebackTransaction(loanId, transactionId, "1000.00", 0, responseSpec);
+
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
+
+ getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+ loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.active");
+
+ // Try to reverse a Loan Transaction charge back
+ PostLoansLoanIdTransactionsResponse reverseTransactionResponse =
loanTransactionHelper.reverseLoanTransaction(loanId,
+ chargebackTransactionId, operationDate, responseSpecError);
+
+ // Try to reverse a Loan Transaction repayment with linked transactions
+ reverseTransactionResponse =
loanTransactionHelper.reverseLoanTransaction(loanId, transactionId,
operationDate, responseSpecError);
+ }
+ @Test
+ public void applyLoanTransactionChargebackOverNoRepaymentType() {
// Client and Loan account creation
- final Integer clientId = ClientHelper.createClient(this.requestSpec,
this.responseSpec, "01 January 2012");
- final GetLoanProductsProductIdResponse getLoanProductsProductResponse
= createLoanProduct(loanTransactionHelper, null);
- assertNotNull(getLoanProductsProductResponse);
- log.info("Loan Product Bucket Name: {}",
getLoanProductsProductResponse.getDelinquencyBucket().getName());
+ final Integer loanId = createAccounts(15);
- final LocalDate todaysDate = Utils.getLocalDateOfTenant();
- // Older date to have more than one overdue installment
- final LocalDate transactionDate = todaysDate.minusDays(45);
- String operationDate = Utils.dateFormatter.format(transactionDate);
+ GetLoansLoanIdResponse getLoansLoanIdResponse =
loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
- final Integer loanId = createLoanAccount(loanTransactionHelper,
clientId.toString(),
- getLoanProductsProductResponse.getId().toString(),
operationDate, "1000");
+ Set<GetLoansLoanIdTransactions> loanTransactions =
getLoansLoanIdResponse.getTransactions();
+ assertNotNull(loanTransactions);
+ log.info("Loan Id {} with {} transactions", loanId,
loanTransactions.size());
+ assertEquals(2, loanTransactions.size());
+ GetLoansLoanIdTransactions loanTransaction =
loanTransactions.iterator().next();
+ log.info("Try to apply the Charge back over transaction Id {} with
type {}", loanTransaction.getId(),
+ loanTransaction.getType().getCode());
+
+ applyChargebackTransaction(loanId, loanTransaction.getId().intValue(),
amountVal, 0, responseSpecError);
+ }
+
+ @Test
+ public void applyLoanTransactionChargebackAfterMature() {
+ // Client and Loan account creation
+ final Integer loanId = createAccounts(45);
GetLoansLoanIdResponse getLoansLoanIdResponse =
loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
assertNotNull(getLoansLoanIdResponse);
loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse);
+ GetLoansLoanIdRepaymentSchedule getLoanRepaymentSchedule =
getLoansLoanIdResponse.getRepaymentSchedule();
+ log.info("Loan with {} periods",
getLoanRepaymentSchedule.getPeriods().size());
+ assertEquals(2, getLoanRepaymentSchedule.getPeriods().size());
- operationDate = Utils.dateFormatter.format(todaysDate);
- Float amount = Float.valueOf("1100.0");
+ Float amount = Float.valueOf(amountVal);
PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse =
loanTransactionHelper.makeLoanRepayment(operationDate, amount,
loanId);
assertNotNull(loanIdTransactionsResponse);
final Integer transactionId =
loanIdTransactionsResponse.getResourceId();
- List<GetPaymentTypesResponse> paymentTypeList =
PaymentTypeHelper.getSystemPaymentType(requestSpec, responseSpec);
- assertTrue(!paymentTypeList.isEmpty());
+ getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+ loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.closed.obligations.met");
+
+ reviewLoanTransactionRelations(loanId, transactionId, 0);
+
+ final Integer chargebackTransactionId =
applyChargebackTransaction(loanId, transactionId, "1000.00", 0, responseSpec);
+
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
+
+ getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+ loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.active");
+
+ // N+1 Scenario
+ loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse);
+ getLoanRepaymentSchedule =
getLoansLoanIdResponse.getRepaymentSchedule();
+ log.info("Loan with {} periods",
getLoanRepaymentSchedule.getPeriods().size());
+ assertEquals(3, getLoanRepaymentSchedule.getPeriods().size());
+ }
+
+ @Test
+ public void applyLoanTransactionChargebackWithLoanOverpaidToLoanActive() {
+ // Client and Loan account creation
+ final Integer loanId = createAccounts(15);
+
+ GetLoansLoanIdResponse getLoansLoanIdResponse =
loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+
+ loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse);
+
+ Float amount = Float.valueOf("1100.00");
+ PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse =
loanTransactionHelper.makeLoanRepayment(operationDate, amount,
+ loanId);
+ assertNotNull(loanIdTransactionsResponse);
+ final Integer transactionId =
loanIdTransactionsResponse.getResourceId();
+
+ getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+ loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.overpaid");
+
+ reviewLoanTransactionRelations(loanId, transactionId, 0);
- amount = Float.valueOf("800.0");
- final String payload = createChargebackPayload(amount.toString(),
paymentTypeList.get(0).getId());
- PostLoansLoanIdTransactionsTransactionIdRequest
postLoansTransactionCommandRequest = loanTransactionHelper
- .applyLoanTransactionCommand(loanId, transactionId,
"chargeback", payload);
- assertNotNull(postLoansTransactionCommandRequest);
+ final Integer chargebackTransactionId =
applyChargebackTransaction(loanId, transactionId, "200.00", 0, responseSpec);
+
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
Review Comment:
Done!
##########
integration-tests/src/test/java/org/apache/fineract/integrationtests/LoanTransactionChargebackTest.java:
##########
@@ -50,57 +55,263 @@
public class LoanTransactionChargebackTest {
private ResponseSpecification responseSpec;
+ private ResponseSpecification responseSpecError;
private RequestSpecification requestSpec;
+ private LoanTransactionHelper loanTransactionHelper;
+ private final String amountVal = "1000";
+ private LocalDate todaysDate;
+ private String operationDate;
@BeforeEach
public void setup() {
Utils.initializeRESTAssured();
this.requestSpec = new
RequestSpecBuilder().setContentType(ContentType.JSON).build();
this.requestSpec.header("Authorization", "Basic " +
Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
this.responseSpec = new
ResponseSpecBuilder().expectStatusCode(200).build();
+ this.responseSpecError = new
ResponseSpecBuilder().expectStatusCode(503).build();
+ this.loanTransactionHelper = new
LoanTransactionHelper(this.requestSpec, this.responseSpec);
+
+ this.todaysDate = Utils.getLocalDateOfTenant();
+ this.operationDate = Utils.dateFormatter.format(this.todaysDate);
}
@Test
public void applyLoanTransactionChargeback() {
- final LoanTransactionHelper loanTransactionHelper = new
LoanTransactionHelper(this.requestSpec, this.responseSpec);
+ // Client and Loan account creation
+ final Integer loanId = createAccounts(15);
+
+ GetLoansLoanIdResponse getLoansLoanIdResponse =
loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+
+ loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse);
+
+ Float amount = Float.valueOf(amountVal);
+ PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse =
loanTransactionHelper.makeLoanRepayment(operationDate, amount,
+ loanId);
+ assertNotNull(loanIdTransactionsResponse);
+ final Integer transactionId =
loanIdTransactionsResponse.getResourceId();
+
+ getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+ loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.closed.obligations.met");
+
+ reviewLoanTransactionRelations(loanId, transactionId, 0);
+
+ final Integer chargebackTransactionId =
applyChargebackTransaction(loanId, transactionId, "1000.00", 0, responseSpec);
+
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
+
+ getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+ loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.active");
+
+ // Try to reverse a Loan Transaction charge back
+ PostLoansLoanIdTransactionsResponse reverseTransactionResponse =
loanTransactionHelper.reverseLoanTransaction(loanId,
+ chargebackTransactionId, operationDate, responseSpecError);
+
+ // Try to reverse a Loan Transaction repayment with linked transactions
+ reverseTransactionResponse =
loanTransactionHelper.reverseLoanTransaction(loanId, transactionId,
operationDate, responseSpecError);
+ }
+ @Test
+ public void applyLoanTransactionChargebackOverNoRepaymentType() {
// Client and Loan account creation
- final Integer clientId = ClientHelper.createClient(this.requestSpec,
this.responseSpec, "01 January 2012");
- final GetLoanProductsProductIdResponse getLoanProductsProductResponse
= createLoanProduct(loanTransactionHelper, null);
- assertNotNull(getLoanProductsProductResponse);
- log.info("Loan Product Bucket Name: {}",
getLoanProductsProductResponse.getDelinquencyBucket().getName());
+ final Integer loanId = createAccounts(15);
- final LocalDate todaysDate = Utils.getLocalDateOfTenant();
- // Older date to have more than one overdue installment
- final LocalDate transactionDate = todaysDate.minusDays(45);
- String operationDate = Utils.dateFormatter.format(transactionDate);
+ GetLoansLoanIdResponse getLoansLoanIdResponse =
loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
- final Integer loanId = createLoanAccount(loanTransactionHelper,
clientId.toString(),
- getLoanProductsProductResponse.getId().toString(),
operationDate, "1000");
+ Set<GetLoansLoanIdTransactions> loanTransactions =
getLoansLoanIdResponse.getTransactions();
+ assertNotNull(loanTransactions);
+ log.info("Loan Id {} with {} transactions", loanId,
loanTransactions.size());
+ assertEquals(2, loanTransactions.size());
+ GetLoansLoanIdTransactions loanTransaction =
loanTransactions.iterator().next();
+ log.info("Try to apply the Charge back over transaction Id {} with
type {}", loanTransaction.getId(),
+ loanTransaction.getType().getCode());
+
+ applyChargebackTransaction(loanId, loanTransaction.getId().intValue(),
amountVal, 0, responseSpecError);
+ }
+
+ @Test
+ public void applyLoanTransactionChargebackAfterMature() {
+ // Client and Loan account creation
+ final Integer loanId = createAccounts(45);
GetLoansLoanIdResponse getLoansLoanIdResponse =
loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
assertNotNull(getLoansLoanIdResponse);
loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse);
+ GetLoansLoanIdRepaymentSchedule getLoanRepaymentSchedule =
getLoansLoanIdResponse.getRepaymentSchedule();
+ log.info("Loan with {} periods",
getLoanRepaymentSchedule.getPeriods().size());
+ assertEquals(2, getLoanRepaymentSchedule.getPeriods().size());
- operationDate = Utils.dateFormatter.format(todaysDate);
- Float amount = Float.valueOf("1100.0");
+ Float amount = Float.valueOf(amountVal);
PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse =
loanTransactionHelper.makeLoanRepayment(operationDate, amount,
loanId);
assertNotNull(loanIdTransactionsResponse);
final Integer transactionId =
loanIdTransactionsResponse.getResourceId();
- List<GetPaymentTypesResponse> paymentTypeList =
PaymentTypeHelper.getSystemPaymentType(requestSpec, responseSpec);
- assertTrue(!paymentTypeList.isEmpty());
+ getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+ loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.closed.obligations.met");
+
+ reviewLoanTransactionRelations(loanId, transactionId, 0);
+
+ final Integer chargebackTransactionId =
applyChargebackTransaction(loanId, transactionId, "1000.00", 0, responseSpec);
+
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
+
+ getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+ loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.active");
+
+ // N+1 Scenario
+ loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse);
+ getLoanRepaymentSchedule =
getLoansLoanIdResponse.getRepaymentSchedule();
+ log.info("Loan with {} periods",
getLoanRepaymentSchedule.getPeriods().size());
+ assertEquals(3, getLoanRepaymentSchedule.getPeriods().size());
+ }
+
+ @Test
+ public void applyLoanTransactionChargebackWithLoanOverpaidToLoanActive() {
+ // Client and Loan account creation
+ final Integer loanId = createAccounts(15);
+
+ GetLoansLoanIdResponse getLoansLoanIdResponse =
loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+
+ loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse);
+
+ Float amount = Float.valueOf("1100.00");
+ PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse =
loanTransactionHelper.makeLoanRepayment(operationDate, amount,
+ loanId);
+ assertNotNull(loanIdTransactionsResponse);
+ final Integer transactionId =
loanIdTransactionsResponse.getResourceId();
+
+ getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+ loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.overpaid");
+
+ reviewLoanTransactionRelations(loanId, transactionId, 0);
- amount = Float.valueOf("800.0");
- final String payload = createChargebackPayload(amount.toString(),
paymentTypeList.get(0).getId());
- PostLoansLoanIdTransactionsTransactionIdRequest
postLoansTransactionCommandRequest = loanTransactionHelper
- .applyLoanTransactionCommand(loanId, transactionId,
"chargeback", payload);
- assertNotNull(postLoansTransactionCommandRequest);
+ final Integer chargebackTransactionId =
applyChargebackTransaction(loanId, transactionId, "200.00", 0, responseSpec);
+
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
assertNotNull(getLoansLoanIdResponse);
+ loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.active");
+ }
+
+ @Test
+ public void applyLoanTransactionChargebackWithLoanOverpaidToLoanClose() {
+ // Client and Loan account creation
+ final Integer loanId = createAccounts(15);
+
+ GetLoansLoanIdResponse getLoansLoanIdResponse =
loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+
+ loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse);
+
+ Float amount = Float.valueOf("1100.00");
+ PostLoansLoanIdTransactionsResponse loanIdTransactionsResponse =
loanTransactionHelper.makeLoanRepayment(operationDate, amount,
+ loanId);
+ assertNotNull(loanIdTransactionsResponse);
+ final Integer transactionId =
loanIdTransactionsResponse.getResourceId();
+
+ getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
+ assertNotNull(getLoansLoanIdResponse);
+ loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse,
"loanStatusType.overpaid");
+
+ reviewLoanTransactionRelations(loanId, transactionId, 0);
+
+ final Integer chargebackTransactionId =
applyChargebackTransaction(loanId, transactionId, "100.00", 0, responseSpec);
+
+ reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
+
+ getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec,
responseSpec, loanId);
Review Comment:
Done!
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]