adamsaghy commented on code in PR #2633:
URL: https://github.com/apache/fineract/pull/2633#discussion_r990959998


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

Review Comment:
   Please check whether the outstanding, principal , loan balance amount is 
correct after the chargeback



-- 
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]

Reply via email to