From c362e0f19a983115a66a3053e43cce401b109a9b Mon Sep 17 00:00:00 2001 From: Priti Date: Thu, 28 Mar 2013 21:57:28 +0530 Subject: [PATCH 1/5] 1.Integration Test : LoanWithWaiveInterest added 2. LoanProduct Builder created 3. RandomGenerator methods moved to Util file --- .../LoanWithWaiveInterestAndWriteOff.java | 2721 +++++++++++++++++ .../testbuilder/LoanProductTestBuilder.java | 166 + .../integrationtests/testbuilder/Utils.java | 23 + 3 files changed, 2910 insertions(+) create mode 100644 mifosng-provider/src/integrationTest/java/LoanWithWaiveInterestAndWriteOff.java create mode 100644 mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/LoanProductTestBuilder.java create mode 100644 mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/Utils.java diff --git a/mifosng-provider/src/integrationTest/java/LoanWithWaiveInterestAndWriteOff.java b/mifosng-provider/src/integrationTest/java/LoanWithWaiveInterestAndWriteOff.java new file mode 100644 index 000000000..b45ee27fe --- /dev/null +++ b/mifosng-provider/src/integrationTest/java/LoanWithWaiveInterestAndWriteOff.java @@ -0,0 +1,2721 @@ +import static com.jayway.restassured.RestAssured.given; +import static com.jayway.restassured.RestAssured.post; +import static com.jayway.restassured.path.json.JsonPath.from; +import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.HashMap; + +import junit.framework.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.google.gson.Gson; +import com.jayway.restassured.builder.RequestSpecBuilder; +import com.jayway.restassured.builder.ResponseSpecBuilder; +import com.jayway.restassured.http.ContentType; +import com.jayway.restassured.path.json.JsonPath; +import com.jayway.restassured.specification.RequestSpecification; +import com.jayway.restassured.specification.ResponseSpecification; +import org.mifosplatform.integrationtests.testbuilder.LoanProductTestBuilder; +import org.mifosplatform.integrationtests.testbuilder.Utils; + +/** + * Client Loan Integration Test for checking Loan Disburstment with Waive Interest and Write-Off. + */ +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class LoanWithWaiveInterestAndWriteOff { + + ResponseSpecification responseSpec; + RequestSpecification requestSpec; + final String PRINCIPAL="4,500.00", + NUMBER_OF_REPAYMENTS="9", + REPAYMENT_PERIOD="2", + DISBURSEMENT_DATE="30 October 2010", + LOAN_APPLICATION_SUBMISSION_DATE="23 September 2010", + INTEREST_VALUE_AMOUNT = "40.00"; + + @Before + public void setup() { + String basicAuthKey = loginIntoServerAndGetBase64EncodedAuthenticationKey(); + + requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); + requestSpec.header("Authorization","Basic "+basicAuthKey); + + responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + } + + @Test + public void checkClientLoanCreateAndDisburseFlow(){ + //CREATE CLIENT + Integer clientID = createClient(); + verifyClientCreatedOnServer(clientID); + + //CREATE LOAN PRODUCT + Integer loanProductID = createLoanProduct(); + //APPLY FOR LOAN + Integer loanID = applyForLoanApplication(clientID, loanProductID); + HashMap loanStatusHashMap = getStatusOfLoan(loanID); + verifyLoanStatusIsPending(loanStatusHashMap); + + //APPROVE LOAN + loanStatusHashMap = approveLoan("28 September 2010", loanID); + System.out.println("********************HASHMAP **************"+loanStatusHashMap); + verifyLoanIsApproved(loanStatusHashMap); + verifyLoanStatusIsWaitingForDisbursal(loanStatusHashMap); + + //UNDO APPROVAL + loanStatusHashMap = undoApproval(loanID); + verifyLoanNeedsApproval(loanStatusHashMap); + + //RE-APPROVE LOAN ON 1 OCTOBER 2010 + loanStatusHashMap = approveLoan("1 October 2010", loanID); + verifyLoanIsApproved(loanStatusHashMap); + verifyLoanStatusIsWaitingForDisbursal(loanStatusHashMap); + + //DISBURSE + loanStatusHashMap = disburseLoan(loanID); + verifyLoanStatusIsActive(loanStatusHashMap); + + //PERFORM REPAYMENTS AND CHECK LOAN STATUS + //----------------------------------------- +// verifyRepaymentScheduleEntryFor(1, 4000.0F, 200.0F, loanID); + + makeRepayment(540.0f, "1 January 2011", loanID); + makeRepayment(540.0f, "1 March 2011", loanID); + waiveInterest("1 May 2011", loanID); + makeRepayment(500.0f, "1 May 2011", loanID); + makeRepayment(540.0f, "1 July 2011", loanID); + waiveInterest("1 September 2011", loanID); + makeRepayment(500.0f, "1 September 2011", loanID); + makeRepayment(540.0f, "1 November 2011", loanID); + waiveInterest("1 January 2012", loanID); + makeRepayment(500.0f, "1 January 2012", loanID); + +// verifyRepaymentScheduleEntryFor(7, 1000.0F, 200.0F, loanID); + + //WRITE OFF LOAN AND CHECK ACCOUNT IS CLOSED + verifyLoanAccountIsClosed(writeOffLoan("1 March 2012", loanID)); + + } + + private void verifyLoanNeedsApproval(HashMap loanStatusHashMap) { + assertTrue(getStatus(loanStatusHashMap, "pendingApproval")); + } + + private void verifyLoanIsApproved(HashMap loanStatusHashMap) { + assertFalse(getStatus(loanStatusHashMap, "pendingApproval")); + } + + private void verifyLoanStatusIsWaitingForDisbursal(HashMap loanStatusHashMap) { + assertTrue(getStatus(loanStatusHashMap, "waitingForDisbursal")); + } + + private void verifyLoanStatusIsPending(HashMap loanStatusHashMap) { + assertTrue(getStatus(loanStatusHashMap, "pendingApproval")); + } + + private void verifyLoanStatusIsActive(HashMap loanStatusHashMap) { + assertTrue(getStatus(loanStatusHashMap, "active")); + } + + private void verifyRepaymentScheduleEntryFor(int repaymentNumber, float expectedPrincipal, Float expectedInterest, Integer loanID) { + ArrayList repaymentPeriods = getLoanRepaymentSchedule(loanID); + assertEquals(repaymentPeriods.get(repaymentNumber).get("principalLoanBalanceOutstanding"), expectedPrincipal); + assertEquals(repaymentPeriods.get(repaymentNumber).get("interestLoanBalanceOutstanding"), expectedInterest); + } + + private HashMap writeOffLoan(String transactionDate, Integer loanID){ + System.out.println("--------------------LOAN WRITTEN OFF ON "+transactionDate+"-------------------------------\n"); + String json = given().spec(requestSpec).body(getWriteOffBodyAsJSON(transactionDate)) + .expect().spec(responseSpec).log().ifError() + .when().post("/mifosng-provider/api/v1/loans/" + loanID + "/transactions?command=writeoff&tenantIdentifier=default") + .andReturn().asString(); + HashMap response = from(json).get("changes"); + return (HashMap)response.get("status"); + } + + private void waiveInterest(String transactionDate, Integer loanID){ + System.out.println("--------------------Waive INTEREST On "+transactionDate+"-------------------------------\n"); + given().spec(requestSpec).body(getWaiveBodyAsJSON(transactionDate)) + .expect().spec(responseSpec).log().ifError() + .when().post("/mifosng-provider/api/v1/loans/" + loanID + "/transactions?command=waiveinterest&tenantIdentifier=default"); + } + + private void makeRepayment(Float transactionAmount, String transactionDate, Integer loanID){ + System.out.print("------------------------MADE REPAYMENT ON "+transactionDate+"---------------------------------\n"); + given().spec(requestSpec).body(getRepaymentBodyAsJSON(transactionDate,transactionAmount)) + .expect().spec(responseSpec).log().ifError() + .when().post("/mifosng-provider/api/v1/loans/" + loanID + "/transactions?command=repayment&tenantIdentifier=default"); + } + + private ArrayList getLoanRepaymentSchedule(Integer loanID) + { + System.out.println("---------------------------GETTING LOAN REPAYMENT SCHEDULE--------------------------------"); + String json = given().spec(requestSpec) + .expect().spec(responseSpec).log().ifError() + .when().get("/mifosng-provider/api/v1/loans/" + loanID +"?associations=repaymentSchedule&tenantIdentifier=default").andReturn().asString(); + HashMap repaymentSchedule = from(json).get("repaymentSchedule"); + return (ArrayList)repaymentSchedule.get("periods"); + } + + private boolean getStatus(HashMap loanStatusMap,String nameOfLoanStatusString){ + return (Boolean)loanStatusMap.get(nameOfLoanStatusString); + } + + private void verifyLoanAccountIsClosed(HashMap loanStatusHashMap){ + Assert.assertTrue(getStatus(loanStatusHashMap, "closed")); + } + + private HashMap getStatusOfLoan(Integer loanID){ + String json= given().spec(requestSpec) + .expect().spec(responseSpec).log().ifError() + .when().get("/mifosng-provider/api/v1/loans/" + loanID + "?tenantIdentifier=default") + .andReturn().asString(); + return from(json).get("status"); + } + + private HashMap undoApproval(Integer loanID){ + System.out.println("-----------------------------------UNDO LOAN APPROVAL-----------------------------------------"); + String json = given().spec(requestSpec).body("{'note':'UNDO APPROVAL'}") + .expect().spec(responseSpec).log().ifError() + .when().post("/mifosng-provider/api/v1/loans/" + loanID + "?command=undoApproval&tenantIdentifier=default") + .andReturn().asString(); + HashMap response = from(json).get("changes"); + return (HashMap)response.get("status"); + } + private HashMap disburseLoan(Integer loanID){ + System.out.println("-----------------------------------DISBURSE LOAN-----------------------------------------"); + String json = given().spec(requestSpec).body(getDisburseLoanAsJSON()) + .expect().spec(responseSpec).log().ifError() + .when().post("/mifosng-provider/api/v1/loans/" + loanID + "?command=disburse&tenantIdentifier=default") + .andReturn().asString(); + HashMap response = from(json).get("changes"); + return (HashMap)response.get("status"); + } + + private HashMap approveLoan(String approvalDate, Integer loanID){ + System.out.println("-----------------------------------APPROVE LOAN-----------------------------------------"); + String json =given().spec(requestSpec).body(getApproveLoanAsJSON(approvalDate)) + .expect().spec(responseSpec).log().ifError() + .when().post("/mifosng-provider/api/v1/loans/"+ loanID +"?command=approve&tenantIdentifier=default") + .andReturn().asString(); + System.out.println("**************CHANGES :"+from(json).get("changes")); + HashMap response = from(json).get("changes"); + return (HashMap)response.get("status"); + } + + + private String loginIntoServerAndGetBase64EncodedAuthenticationKey() { + System.out.println("-----------------------------------LOGIN-----------------------------------------"); + String json = post("/mifosng-provider/api/v1/authentication?username=mifos&password=password&tenantIdentifier=default").asString(); + return JsonPath.with(json).get("base64EncodedAuthenticationKey"); + } + + private Integer createClient() { + System.out.println("---------------------------------CREATING A CLIENT---------------------------------------------"); + String json = given().spec(requestSpec).body(getTestClientAsJSON()) + .expect().spec(responseSpec).log().ifError() + .when().post("/mifosng-provider/api/v1/clients?tenantIdentifier=default") + .andReturn().asString(); + + return from(json).get("clientId"); + } + + private void verifyClientCreatedOnServer(final Integer generatedClientID) { + System.out.println("------------------------------CHECK CLIENT DETAILS------------------------------------\n"); + given().spec(requestSpec) + .expect().spec(responseSpec).log().ifError() + .when().get("/mifosng-provider/api/v1/clients/" + generatedClientID + "?tenantIdentifier=default"); + } + + private Integer createLoanProduct() { + System.out.println("------------------------------CREATING NEW LOAN PRODUCT ---------------------------------------"); + String loanProductJSON = new LoanProductTestBuilder() + .withPrincipal(PRINCIPAL) + .withRepaymentTypeAsMonth() + .withRepaymentAfterEvery(REPAYMENT_PERIOD) + .withNumberOfRepayments(NUMBER_OF_REPAYMENTS) + .build(); + String json = given().spec(requestSpec).body(loanProductJSON) + .expect().spec(responseSpec).log().ifError() + .when().post("/mifosng-provider/api/v1/loanproducts?tenantIdentifier=default") + .andReturn().asString(); + return from(json).get("resourceId"); + } + + private Integer applyForLoanApplication(final Integer clientID, final Integer loanProductID) { + System.out.println("--------------------------------APPLYING FOR LOAN APPLICATION--------------------------------"); + String json = given().spec(requestSpec).body(getLoanApplicationBodyAsJSON(clientID.toString(), loanProductID.toString())) + .expect().spec(responseSpec).log().ifError() + .when().post("/mifosng-provider/api/v1/loans?tenantIdentifier=default") + .andReturn().asString(); + return from(json).get("loanId"); + } + + + private String getWriteOffBodyAsJSON(String transactionDate){ + HashMap map = new HashMap(); + map.put("dateFormat","dd MMMM yyyy"); + map.put("locale","en"); + map.put("note", " LOAN WRITE OFF!!!"); + map.put("transactionDate",transactionDate); + return new Gson().toJson(map); + } + private String getWaiveBodyAsJSON(String transactionDate){ + HashMap map = new HashMap(); + map.put("locale","en"); + map.put("dateFormat","dd MMMM yyyy"); + map.put("transactionDate",transactionDate); + map.put("transactionAmount",INTEREST_VALUE_AMOUNT); + map.put("note", " Interest Waived!!!"); + return new Gson().toJson(map); + } + private String getRepaymentBodyAsJSON(String transactionDate,Float transactionAmount){ + HashMap map = new HashMap(); + map.put("locale","en"); + map.put("dateFormat","dd MMMM yyyy"); + map.put("transactionDate",transactionDate); + map.put("transactionAmount",transactionAmount.toString()); + map.put("note", "Repayment Made!!!"); + return new Gson().toJson(map); + } + private String getApproveLoanAsJSON(String approvalDate){ + HashMap map = new HashMap(); + map.put("locale","en"); + map.put("dateFormat","dd MMMM yyyy"); + map.put("approvedOnDate",approvalDate); + map.put("note", "Approval NOTE"); + System.out.println("***************JSON ***"+new Gson().toJson(map)); + return new Gson().toJson(map); + } + + private String getDisburseLoanAsJSON(){ + HashMap map = new HashMap(); + map.put("locale","en"); + map.put("dateFormat","dd MMMM yyyy"); + map.put("actualDisbursementDate",DISBURSEMENT_DATE); + map.put("note", "DISBURSE NOTE"); + return new Gson().toJson(map); + } + + private String getTestClientAsJSON() { + HashMap map = new HashMap(); + map.put("officeId", "1"); + map.put("firstname", Utils.randomNameGenerator("Client_FirstName_", 5)); + map.put("lastname", Utils.randomNameGenerator("Client_LastName_", 4)); + map.put("externalId", Utils.randomIDGenerator("ID_", 7)); + map.put("dateFormat", "dd MMMM yyyy"); + map.put("locale", "en"); + map.put("joinedDate", "04 March 2009"); + System.out.println("map : "+map); + return new Gson().toJson(map); + } + + + private String getLoanApplicationBodyAsJSON(final String clientID,final String productID){ + HashMap map = new HashMap(); + map.put("dateFormat", "dd MMMM yyyy"); + map.put("locale", "en_GB"); + map.put("clientId", clientID); + map.put("productId", productID); + map.put("principal", PRINCIPAL); + map.put("loanTermFrequency", "4"); + map.put("loanTermFrequencyType", "2"); + map.put("numberOfRepayments", NUMBER_OF_REPAYMENTS); + map.put("repaymentEvery", REPAYMENT_PERIOD); + map.put("repaymentFrequencyType", "2"); + map.put("interestRateFrequencyType", "2"); + map.put("interestRatePerPeriod", "2"); + map.put("amortizationType", "1"); + map.put("interestType", "1"); + map.put("interestCalculationPeriodType", "1"); + map.put("transactionProcessingStrategyId", "1"); + map.put("expectedDisbursementDate", DISBURSEMENT_DATE); + map.put("submittedOnDate", LOAN_APPLICATION_SUBMISSION_DATE); + return new Gson().toJson(map); + } + + private String getLoanCalculationBodyAsJSON(String productID){ + HashMap map = new HashMap(); + map.put("dateFormat", "dd MMMM yyyy"); + map.put("locale", "en_GB"); + map.put("productId", productID); + map.put("principal", PRINCIPAL); + map.put("loanTermFrequency", "4"); + map.put("loanTermFrequencyType", "2"); + map.put("numberOfRepayments", NUMBER_OF_REPAYMENTS); + map.put("repaymentEvery", REPAYMENT_PERIOD); + map.put("repaymentFrequencyType", "2"); + map.put("interestRateFrequencyType", "2"); + map.put("interestRatePerPeriod", "2"); + map.put("amortizationType", "1"); + map.put("interestType", "1"); + map.put("interestCalculationPeriodType", "1"); + map.put("expectedDisbursementDate", DISBURSEMENT_DATE); + map.put("transactionProcessingStrategyId", "1"); + return new Gson().toJson(map); + } + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/LoanProductTestBuilder.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/LoanProductTestBuilder.java new file mode 100644 index 000000000..9ebd1879f --- /dev/null +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/LoanProductTestBuilder.java @@ -0,0 +1,166 @@ +package org.mifosplatform.integrationtests.testbuilder; + +import com.google.gson.Gson; + +import java.util.HashMap; + +public class LoanProductTestBuilder { + private static final String LOCALE = "en_GB"; + private static final String DIGITS_AFTER_DECIMAL = "2"; + private static final String INR = "INR"; + private static final String DAYS = "0"; + private static final String WEEK = "1"; + private static final String MONTHS = "2"; + private static final String YEARS = "3"; + private static final String CALCULATION_PERIOD_SAME_AS_REPAYMENT_PERIOD="1"; + private static final String EQUAL_PRINCIPLE_PAYMENTS="0"; + private static final String EQUAL_INSTALLMENTS="1"; + private static final String DECLINING_BALANCE="0"; + private static final String FLAT_BALANCE="1"; + private static final String MIFOS_STANDARD_STRATEGY ="1"; + private static final String HEAVENS_FAMILY_STRATEGY ="2"; + private static final String CREO_CORE_STRATEGY ="3"; + private static final String RBI_INDIA_STRATEGY ="4"; + private static final String NONE ="1"; + private static final String CASH_BASED ="2"; + private static final String ACCRUAL_BASED ="3"; + + + private String nameOfLoanProduct = Utils.randomNameGenerator("LOAN_PRODUCT_", 6); + private String principal = "10000.00"; + private String numberOfRepayments = "0"; + private String repaymentFrequency = WEEK; + private String repaymentPeriod = "0"; + private String interestRatePerPeriod= "2"; + private String interestRateFrequencyType = MONTHS; + private String interestType = FLAT_BALANCE; + private String interestCalculationPeriodType=CALCULATION_PERIOD_SAME_AS_REPAYMENT_PERIOD; + private String inArrearsTolerance="0"; + private String transactionProcessingStrategy=MIFOS_STANDARD_STRATEGY; + private String accountingRule =NONE; + private String currencyCode = INR; + private String amortizationType= EQUAL_INSTALLMENTS; + + public String build() { + HashMap map = new HashMap(); + + map.put("name", nameOfLoanProduct); + map.put("currencyCode", currencyCode); + map.put("locale", LOCALE); + map.put("digitsAfterDecimal",DIGITS_AFTER_DECIMAL); + map.put("principal", principal); + map.put("numberOfRepayments", numberOfRepayments); + map.put("repaymentEvery",repaymentPeriod ); + map.put("repaymentFrequencyType", repaymentFrequency); + map.put("interestRatePerPeriod", interestRatePerPeriod); + map.put("interestRateFrequencyType", interestRateFrequencyType); + map.put("amortizationType",amortizationType); + map.put("interestType", interestType); + map.put("interestCalculationPeriodType", interestCalculationPeriodType); + map.put("inArrearsTolerance", inArrearsTolerance); + map.put("transactionProcessingStrategyId", transactionProcessingStrategy); + map.put("accountingRule", accountingRule); + return new Gson().toJson(map); + } + + public LoanProductTestBuilder withLoanName(String loanName){ + this.nameOfLoanProduct=loanName; + return this; + } + public LoanProductTestBuilder withPrincipal(String principal){ + this.principal = principal; + return this; + } + + public LoanProductTestBuilder withNumberOfRepayments(String numberOfRepayment){ + this.numberOfRepayments = numberOfRepayment; + return this; + } + + + public LoanProductTestBuilder withRepaymentTypeAsMonth(){ + this.repaymentFrequency = MONTHS; + return this; + } + + public LoanProductTestBuilder withRepaymentTypeAsWeek(){ + this.repaymentFrequency = WEEK; + return this; + } + + public LoanProductTestBuilder withRepaymentTypeAsDays(){ + this.repaymentFrequency = DAYS; + return this; + } + + public LoanProductTestBuilder withRepaymentAfterEvery(String repaymentAfterEvery){ + this.repaymentPeriod=repaymentAfterEvery; + return this; + } + + public LoanProductTestBuilder withInterestRateFrequencyTypeAsMonths(){ + this.interestRateFrequencyType=MONTHS; + return this; + } + + public LoanProductTestBuilder withInterestRateFrequencyTypeAsYear(){ + this.interestRateFrequencyType=YEARS; + return this; + } + + public LoanProductTestBuilder withinterestRatePerPeriod(String interestRatePerPeriod) { + this.interestRatePerPeriod=interestRatePerPeriod; + return this; + } + + public LoanProductTestBuilder withAmortizationTypeAsEqualPrinciplePayment(){ + this.amortizationType = EQUAL_PRINCIPLE_PAYMENTS; + return this; + } + + public LoanProductTestBuilder withAmortizationTypeAsEqualInstallments(){ + this.amortizationType = EQUAL_INSTALLMENTS; + return this; + } + + public LoanProductTestBuilder withInterestTypeAsFlat(){ + this.interestType=FLAT_BALANCE; + return this; + } + + public LoanProductTestBuilder withInterestTypeAsDecliningBalance (){ + this.interestType=DECLINING_BALANCE; + return this; + } + + public LoanProductTestBuilder withInterestCalculationPeriodTypeAsDays (){ + this.interestCalculationPeriodType=DAYS; + return this; + } + + public LoanProductTestBuilder withInterestCalculationPeriodTypeAsRepaymentPeriod (){ + this.interestCalculationPeriodType=CALCULATION_PERIOD_SAME_AS_REPAYMENT_PERIOD; + return this; + } + + public LoanProductTestBuilder withInArrearsTolerance (String amountCanBeWaved){ + this.inArrearsTolerance = amountCanBeWaved; + return this; + } + + public LoanProductTestBuilder withAccountingRuleAsNone (){ + this.accountingRule= NONE; + return this; + } + + public LoanProductTestBuilder withAccountingRuleAsCashBased (){ + this.accountingRule= CASH_BASED; + return this; + } + + public LoanProductTestBuilder withAccountingRuleAsAccrualBased (){ + this.accountingRule= ACCRUAL_BASED; + return this; + } + +} diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/Utils.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/Utils.java new file mode 100644 index 000000000..b665a44df --- /dev/null +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/Utils.java @@ -0,0 +1,23 @@ +package org.mifosplatform.integrationtests.testbuilder; + +import java.util.Random; + +public class Utils { + + public static String randomStringGenerator(final String prefix, final int len, final String sourceSetString) { + int lengthOfSource = sourceSetString.length(); + Random rnd = new Random(); + StringBuilder sb = new StringBuilder(len); + for (int i = 0; i < len; i++) + sb.append((sourceSetString).charAt(rnd.nextInt(lengthOfSource))); + return (prefix+(sb.toString())); + } + + public static String randomNameGenerator(final String prefix, final int lenOfRandomSuffix) { + return randomStringGenerator(prefix, lenOfRandomSuffix, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + } + + public static String randomIDGenerator(final String prefix, final int lenOfRandomSuffix) { + return randomStringGenerator(prefix, lenOfRandomSuffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + } +} From b4edfc4c3405612c3d964080282b574856e1c549 Mon Sep 17 00:00:00 2001 From: Priti Date: Sat, 30 Mar 2013 11:06:02 +0530 Subject: [PATCH 2/5] Builder for LoanApplication Added --- .../LoanApplicationTestBuilder.java | 163 ++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/LoanApplicationTestBuilder.java diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/LoanApplicationTestBuilder.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/LoanApplicationTestBuilder.java new file mode 100644 index 000000000..d11b689aa --- /dev/null +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/LoanApplicationTestBuilder.java @@ -0,0 +1,163 @@ +package org.mifosplatform.integrationtests.testbuilder; + +import com.google.gson.Gson; + +import java.util.HashMap; + + +public class LoanApplicationTestBuilder { + private static final String DAYS = "0"; + private static final String WEEKS = "1"; + private static final String MONTHS = "2"; + private static final String YEARS = "3"; + private static final String DECLINING_BALANCE = "0"; + private static final String FLAT_BALANCE = "1"; + private static final String EQUAL_PRINCIPLE_PAYMENTS="0"; + private static final String EQUAL_INSTALLMENTS="1"; + private static final String CALCULATION_PERIOD_SAME_AS_REPAYMENT_PERIOD="1"; + private static final String MIFOS_STANDARD_STRATEGY ="1"; + + + private String principal = "10,000"; + private String clientID="0"; + private String loanProductId = "0"; + private String loanTermFrequency = ""; + private String loanTermFrequencyType=""; //0=Days, 1=Weeks, 2=Months, 3=Years + private String numberOfRepayment = "0"; + private String repaymentPeriod = "0"; + private String repaymentFrequencyType = ""; //0=Days, 1=Weeks, 2=Months + + // 12 % per Year Declining Balance + // interest rate per Interest_frequency interest type + private String interestRate = "2"; + private String interestRateFrequencyType="0"; //2=Per month, 3=Per year + private String interestType= ""; //0=Declining Balance, 1=Flat + private String amortizationType =""; //0=Equal principle payments, 1=Equal installments + private String interestCalculationPeriodType =CALCULATION_PERIOD_SAME_AS_REPAYMENT_PERIOD; + private String transactionProcessingID= MIFOS_STANDARD_STRATEGY; + private String expectedDisbursmentDate=""; + private String submittedOndate =""; + + public String Build(String clientID, String loanProductId){ + this.clientID = clientID; + this.loanProductId = loanProductId; + HashMap map = new HashMap(); + map.put("dateFormat", "dd MMMM yyyy"); + map.put("locale", "en_GB"); + map.put("clientId", clientID); + map.put("productId",loanProductId); + map.put("principal", principal); + map.put("loanTermFrequency",loanTermFrequency); + map.put("loanTermFrequencyType", "2"); + map.put("numberOfRepayments", numberOfRepayment); + map.put("repaymentEvery", repaymentPeriod); + map.put("repaymentFrequencyType", repaymentFrequencyType); + map.put("interestRateFrequencyType", interestRateFrequencyType); + map.put("interestRatePerPeriod", interestRate); + map.put("amortizationType", amortizationType); + map.put("interestType", interestType); + map.put("interestCalculationPeriodType", interestCalculationPeriodType); + map.put("transactionProcessingStrategyId", transactionProcessingID); + map.put("expectedDisbursementDate", expectedDisbursmentDate); + map.put("submittedOnDate", submittedOndate); + return new Gson().toJson(map); + } + + public LoanApplicationTestBuilder withPrincipal(String principalAmount){ + this.principal = principalAmount; + return this; + } + + public LoanApplicationTestBuilder withLoanTermFrequency(String loanToBePayedDuration){ + this.loanTermFrequency= loanToBePayedDuration; + return this; + } + + public LoanApplicationTestBuilder withLoanTermFrequencyAsDays(){ + this.loanTermFrequencyType=DAYS; + return this; + } + public LoanApplicationTestBuilder withLoanTermFrequencyAsMonths(){ + this.loanTermFrequencyType=MONTHS; + return this; + } + public LoanApplicationTestBuilder withLoanTermFrequencyAsWeeks(){ + this.loanTermFrequencyType=WEEKS; + return this; + } + public LoanApplicationTestBuilder withLoanTermFrequencyAsYears(){ + this.loanTermFrequencyType=YEARS; + return this; + } + public LoanApplicationTestBuilder withNumberOfRepayments(String numberOfRepayments){ + this.numberOfRepayment= numberOfRepayments; + return this; + } + public LoanApplicationTestBuilder withRepaymentEveryAfter(String repaymentPeriod){ + this.repaymentPeriod=repaymentPeriod; + return this; + } + public LoanApplicationTestBuilder withRepaymentFrequencyTypeAsDays(){ + this.repaymentFrequencyType = DAYS; + return this; + } + + public LoanApplicationTestBuilder withRepaymentFrequencyTypeAsMonths(){ + this.repaymentFrequencyType = MONTHS; + return this; + } + + public LoanApplicationTestBuilder withRepaymentFrequencyTypeAsWeeks(){ + this.repaymentFrequencyType = WEEKS; + return this; + } + + public LoanApplicationTestBuilder withInterestRatePerPeriod(String interestRate){ + this.interestRate=interestRate; + return this; + } + public LoanApplicationTestBuilder withInterestRateFrequencyTypeAsMonths(){ + this.interestRateFrequencyType=MONTHS; + return this; + } + public LoanApplicationTestBuilder withInterestRateFrequencyTypeAsYears(){ + this.interestRateFrequencyType=YEARS; + return this; + } + public LoanApplicationTestBuilder withInterestTypeAsFlatBalance(){ + this.interestType=FLAT_BALANCE; + return this; + } + public LoanApplicationTestBuilder withInterestTypeAsDecliningBalance(){ + this.interestType=DECLINING_BALANCE; + return this; + } + + public LoanApplicationTestBuilder withAmortizationTypeAsEqualInstallments(){ + this.amortizationType=EQUAL_INSTALLMENTS; + return this; + } + + public LoanApplicationTestBuilder withAmortizationTypeAsEqualPrincipalPayments(){ + this.amortizationType=EQUAL_PRINCIPLE_PAYMENTS; + return this; + } + + public LoanApplicationTestBuilder withInterestCalculationPeriodTypeSameAsRepaymentPeriod(){ + this.interestCalculationPeriodType=CALCULATION_PERIOD_SAME_AS_REPAYMENT_PERIOD; + return this; + } + + public LoanApplicationTestBuilder withInterestCalculationPeriodTypeAsDays(){ + this.interestCalculationPeriodType=DAYS; + return this; + } + public LoanApplicationTestBuilder withExpectedDisbursementDate(String expectedDisbursementDate){ + this.expectedDisbursmentDate=expectedDisbursementDate; + return this; + } + public LoanApplicationTestBuilder withSubmittedOnDate(String loanApplicationSubmittedDate){ + this.submittedOndate=loanApplicationSubmittedDate; + return this; + } +} From 3471475c94591adccc5aba32194e82f807859f41 Mon Sep 17 00:00:00 2001 From: Priti Date: Sat, 30 Mar 2013 11:07:21 +0530 Subject: [PATCH 3/5] LoanStatusChecker added which checks the loan status --- .../testbuilder/LoanStatusChecker.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/LoanStatusChecker.java diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/LoanStatusChecker.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/LoanStatusChecker.java new file mode 100644 index 000000000..7bd8dd0c3 --- /dev/null +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/LoanStatusChecker.java @@ -0,0 +1,39 @@ +package org.mifosplatform.integrationtests.testbuilder; + +import junit.framework.Assert; + +import java.util.HashMap; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class LoanStatusChecker { + + private static boolean getStatus(HashMap loanStatusMap, String nameOfLoanStatusString){ + return (Boolean)loanStatusMap.get(nameOfLoanStatusString); + } + + public static void verifyLoanIsApproved(HashMap loanStatusHashMap) { + assertFalse(getStatus(loanStatusHashMap, "pendingApproval")); + } + + public static void verifyLoanStatusIsWaitingForDisbursal(HashMap loanStatusHashMap) { + assertTrue(getStatus(loanStatusHashMap, "waitingForDisbursal")); + } + + public static void verifyLoanStatusIsPending(HashMap loanStatusHashMap) { + assertTrue(getStatus(loanStatusHashMap, "pendingApproval")); + } + + public static void verifyLoanStatusIsActive(HashMap loanStatusHashMap) { + assertTrue(getStatus(loanStatusHashMap, "active")); + } + + private static void verifyLoanNeedsApproval(HashMap loanStatusHashMap) { + assertTrue(getStatus(loanStatusHashMap, "pendingApproval")); + } + + public static void verifyLoanAccountIsClosed(HashMap loanStatusHashMap){ + Assert.assertTrue(getStatus(loanStatusHashMap, "closed")); + } +} From ed95612b3f437534f24a71b3ebff1021b5ad7c31 Mon Sep 17 00:00:00 2001 From: Priti Date: Sat, 30 Mar 2013 11:07:58 +0530 Subject: [PATCH 4/5] common jsonCreator moved to Utils --- .../integrationtests/testbuilder/Utils.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/Utils.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/Utils.java index b665a44df..0bf5c7a46 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/Utils.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/testbuilder/Utils.java @@ -1,5 +1,8 @@ package org.mifosplatform.integrationtests.testbuilder; +import com.google.gson.Gson; + +import java.util.HashMap; import java.util.Random; public class Utils { @@ -20,4 +23,65 @@ public class Utils { public static String randomIDGenerator(final String prefix, final int lenOfRandomSuffix) { return randomStringGenerator(prefix, lenOfRandomSuffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); } + + public static String getTestClientAsJSON(String dateOfJoining) { + HashMap map = new HashMap(); + map.put("officeId", "1"); + map.put("firstname", Utils.randomNameGenerator("Client_FirstName_", 5)); + map.put("lastname", Utils.randomNameGenerator("Client_LastName_", 4)); + map.put("externalId", Utils.randomIDGenerator("ID_", 7)); + map.put("dateFormat", "dd MMMM yyyy"); + map.put("locale", "en"); + map.put("joinedDate", dateOfJoining); + System.out.println("map : "+map); + return new Gson().toJson(map); + } + + public static String getDisburseLoanAsJSON(String actualDisbursementDate){ + HashMap map = new HashMap(); + map.put("locale","en"); + map.put("dateFormat","dd MMMM yyyy"); + map.put("actualDisbursementDate",actualDisbursementDate); + map.put("note", "DISBURSE NOTE"); + return new Gson().toJson(map); + } + + public static String getApproveLoanAsJSON(String approvalDate){ + HashMap map = new HashMap(); + map.put("locale","en"); + map.put("dateFormat","dd MMMM yyyy"); + map.put("approvedOnDate",approvalDate); + map.put("note", "Approval NOTE"); + return new Gson().toJson(map); + } + + public static String getRepaymentBodyAsJSON(String transactionDate,Float transactionAmount){ + HashMap map = new HashMap(); + map.put("locale","en"); + map.put("dateFormat","dd MMMM yyyy"); + map.put("transactionDate",transactionDate); + map.put("transactionAmount",transactionAmount.toString()); + map.put("note", "Repayment Made!!!"); + return new Gson().toJson(map); + } + + public static String getWriteOffBodyAsJSON(String transactionDate){ + HashMap map = new HashMap(); + map.put("dateFormat","dd MMMM yyyy"); + map.put("locale","en"); + map.put("note", " LOAN WRITE OFF!!!"); + map.put("transactionDate",transactionDate); + return new Gson().toJson(map); + } + public static String getWaiveBodyAsJSON(String transactionDate,String amountToBeWaived){ + HashMap map = new HashMap(); + map.put("locale","en"); + map.put("dateFormat","dd MMMM yyyy"); + map.put("transactionDate",transactionDate); + map.put("transactionAmount",amountToBeWaived); + map.put("note", " Interest Waived!!!"); + return new Gson().toJson(map); + } + + } From 5d4bbf191e7ec785fa32e6f3444db641a6946bbe Mon Sep 17 00:00:00 2001 From: Priti Date: Sat, 30 Mar 2013 11:08:16 +0530 Subject: [PATCH 5/5] Refactoring --- .../java/ClientLoanIntegrationTest.java | 92 +++---- .../LoanWithWaiveInterestAndWriteOff.java | 237 +++++------------- 2 files changed, 97 insertions(+), 232 deletions(-) diff --git a/mifosng-provider/src/integrationTest/java/ClientLoanIntegrationTest.java b/mifosng-provider/src/integrationTest/java/ClientLoanIntegrationTest.java index 9709cd442..1f21d8112 100644 --- a/mifosng-provider/src/integrationTest/java/ClientLoanIntegrationTest.java +++ b/mifosng-provider/src/integrationTest/java/ClientLoanIntegrationTest.java @@ -19,6 +19,9 @@ import com.jayway.restassured.http.ContentType; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.specification.RequestSpecification; import com.jayway.restassured.specification.ResponseSpecification; +import org.mifosplatform.integrationtests.testbuilder.LoanApplicationTestBuilder; +import org.mifosplatform.integrationtests.testbuilder.LoanProductTestBuilder; +import org.mifosplatform.integrationtests.testbuilder.Utils; /** * Client Loan Integration Test for checking Loan Application Repayment Schedule. @@ -43,12 +46,9 @@ public class ClientLoanIntegrationTest { public void checkClientLoanCreateAndDisburseFlow(){ Integer clientID = createClient(); - System.out.println("------------------------GENERATED CLIENT ID: "+clientID+"---------------------------\n"); checkClientCreatedOnServer(clientID); Integer loanProductID = createLoanProduct(); - System.out.println("-----------------------GENERATED LOAN PRODUCT ID : "+loanProductID+"---------------------------\n"); - applyForLoanApplication(clientID, loanProductID); ArrayList loanSchedule = getLoanRepaymentSchedule(loanProductID); @@ -64,7 +64,7 @@ public class ClientLoanIntegrationTest { private Integer createClient() { System.out.println("---------------------------------CREATING A CLIENT---------------------------------------------"); - String json = given().spec(requestSpec).body(getTestClientAsJSON()) + String json = given().spec(requestSpec).body(Utils.getTestClientAsJSON("4 March 2009")) .expect().spec(responseSpec) .when().post("/mifosng-provider/api/v1/clients?tenantIdentifier=default") .andReturn().asString(); @@ -81,7 +81,18 @@ public class ClientLoanIntegrationTest { private Integer createLoanProduct() { System.out.println("------------------------------CREATING NEW LOAN PRODUCT ---------------------------------------"); - String json = given().spec(requestSpec).body(getTestLoanProductAsJSON()) + String loanProductJSON = new LoanProductTestBuilder() + .withPrincipal("12,000.00") + .withNumberOfRepayments("4") + .withRepaymentAfterEvery("1") + .withRepaymentTypeAsMonth() + .withinterestRatePerPeriod("2") + .withInterestRateFrequencyTypeAsMonths() + .withAmortizationTypeAsEqualInstallments() + .withInterestTypeAsDecliningBalance() + .withinterestRatePerPeriod("1") + .build(); + String json = given().spec(requestSpec).body(loanProductJSON) .expect().spec(responseSpec) .when().post("/mifosng-provider/api/v1/loanproducts?tenantIdentifier=default") .andReturn().asString(); @@ -90,7 +101,22 @@ public class ClientLoanIntegrationTest { private void applyForLoanApplication(final Integer clientID, final Integer loanProductID) { System.out.println("--------------------------------APPLYING FOR LOAN APPLICATION--------------------------------"); - given().spec(requestSpec).body(getLoanApplicationBodyAsJSON(clientID.toString(), loanProductID.toString())) + String loanApplicationJSON = new LoanApplicationTestBuilder() + .withPrincipal("12,000.00") + .withLoanTermFrequency("4") + .withLoanTermFrequencyAsMonths() + .withNumberOfRepayments("4") + .withRepaymentEveryAfter("1") + .withRepaymentFrequencyTypeAsMonths() + .withInterestRatePerPeriod("2") + .withInterestRateFrequencyTypeAsMonths() + .withAmortizationTypeAsEqualInstallments() + .withInterestTypeAsDecliningBalance() + .withInterestCalculationPeriodTypeSameAsRepaymentPeriod() + .withExpectedDisbursementDate("20 September 2011") + .withSubmittedOnDate("20 September 2011") + .Build(clientID.toString(),loanProductID.toString()); + given().spec(requestSpec).body(loanApplicationJSON) .expect().spec(responseSpec) .when().post("/mifosng-provider/api/v1/loans?tenantIdentifier=default"); } @@ -125,61 +151,7 @@ public class ClientLoanIntegrationTest { } - private String getTestClientAsJSON() { - HashMap map = new HashMap(); - map.put("officeId", "1"); - map.put("firstname", randomNameGenerator("Client_FirstName_", 5)); - map.put("lastname", randomNameGenerator("Client_LastName_", 4)); - map.put("externalId", randomIDGenerator("ID_", 7)); - map.put("dateFormat", "dd MMMM yyyy"); - map.put("locale", "en"); - map.put("joinedDate", "04 March 2009"); - return new Gson().toJson(map); - } - private String getTestLoanProductAsJSON(){ - HashMap map = new HashMap(); - map.put("name", randomNameGenerator("LOAN_PRODUCT_", 6)); - map.put("currencyCode", "INR"); - map.put("locale", "en_GB"); - map.put("digitsAfterDecimal", "2"); - map.put("principal", "12,000.00"); - map.put("numberOfRepayments", "4"); - map.put("repaymentEvery", "1"); - map.put("repaymentFrequencyType", "2"); - map.put("interestRatePerPeriod", "2"); - map.put("interestRateFrequencyType", "2"); - map.put("amortizationType", "1"); - map.put("interestType", "0"); - map.put("interestCalculationPeriodType", "1"); - map.put("inArrearsTolerance", "0"); - map.put("transactionProcessingStrategyId", "1"); - map.put("accountingRule", "1") ; - return new Gson().toJson(map); - } - - private String getLoanApplicationBodyAsJSON(final String clientID,final String productID){ - HashMap map = new HashMap(); - map.put("dateFormat", "dd MMMM yyyy"); - map.put("locale", "en_GB"); - map.put("clientId", clientID); - map.put("productId", productID); - map.put("principal", "12,000.00"); - map.put("loanTermFrequency", "4"); - map.put("loanTermFrequencyType", "2"); - map.put("numberOfRepayments", "4"); - map.put("repaymentEvery", "1"); - map.put("repaymentFrequencyType", "2"); - map.put("interestRateFrequencyType", "2"); - map.put("interestRatePerPeriod", "2"); - map.put("amortizationType", "1"); - map.put("interestType", "0"); - map.put("interestCalculationPeriodType", "1"); - map.put("transactionProcessingStrategyId", "1"); - map.put("expectedDisbursementDate", "20 September 2011"); - map.put("submittedOnDate", "20 September 2011"); - return new Gson().toJson(map); - } private String getLoanCalculationBodyAsJSON(final String productID){ HashMap map = new HashMap(); diff --git a/mifosng-provider/src/integrationTest/java/LoanWithWaiveInterestAndWriteOff.java b/mifosng-provider/src/integrationTest/java/LoanWithWaiveInterestAndWriteOff.java index b45ee27fe..6db08a5e2 100644 --- a/mifosng-provider/src/integrationTest/java/LoanWithWaiveInterestAndWriteOff.java +++ b/mifosng-provider/src/integrationTest/java/LoanWithWaiveInterestAndWriteOff.java @@ -8,33 +8,43 @@ import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.HashMap; -import junit.framework.Assert; import org.junit.Before; import org.junit.Test; -import com.google.gson.Gson; import com.jayway.restassured.builder.RequestSpecBuilder; import com.jayway.restassured.builder.ResponseSpecBuilder; import com.jayway.restassured.http.ContentType; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.specification.RequestSpecification; import com.jayway.restassured.specification.ResponseSpecification; +import org.mifosplatform.integrationtests.testbuilder.LoanApplicationTestBuilder; import org.mifosplatform.integrationtests.testbuilder.LoanProductTestBuilder; +import org.mifosplatform.integrationtests.testbuilder.LoanStatusChecker; import org.mifosplatform.integrationtests.testbuilder.Utils; /** - * Client Loan Integration Test for checking Loan Disburstment with Waive Interest and Write-Off. + * Client Loan Integration Test for checking Loan Disbursement with Waive Interest and Write-Off. */ @SuppressWarnings({ "rawtypes", "unchecked" }) public class LoanWithWaiveInterestAndWriteOff { ResponseSpecification responseSpec; RequestSpecification requestSpec; - final String PRINCIPAL="4,500.00", + final String + LP_PRINCIPAL = "12,000.00", + LP_REPAYMENTS ="2", + LP_REPAYMENT_PERIOD="6", + LP_INTEREST_RATE="1", + + PRINCIPAL="4,500.00", + LOAN_TERM_FREQUENCY="18", NUMBER_OF_REPAYMENTS="9", REPAYMENT_PERIOD="2", DISBURSEMENT_DATE="30 October 2010", LOAN_APPLICATION_SUBMISSION_DATE="23 September 2010", + EXPECTED_DISBURSAL_DATE="28 October 2010", + RATE_OF_INTEREST_PER_PERIOD="2", + DATE_OF_JOINING = "04 March 2009", INTEREST_VALUE_AMOUNT = "40.00"; @Before @@ -50,7 +60,7 @@ public class LoanWithWaiveInterestAndWriteOff { @Test public void checkClientLoanCreateAndDisburseFlow(){ //CREATE CLIENT - Integer clientID = createClient(); + Integer clientID = createClient(DATE_OF_JOINING); verifyClientCreatedOnServer(clientID); //CREATE LOAN PRODUCT @@ -58,31 +68,30 @@ public class LoanWithWaiveInterestAndWriteOff { //APPLY FOR LOAN Integer loanID = applyForLoanApplication(clientID, loanProductID); HashMap loanStatusHashMap = getStatusOfLoan(loanID); - verifyLoanStatusIsPending(loanStatusHashMap); + + LoanStatusChecker.verifyLoanStatusIsPending(loanStatusHashMap); //APPROVE LOAN loanStatusHashMap = approveLoan("28 September 2010", loanID); - System.out.println("********************HASHMAP **************"+loanStatusHashMap); - verifyLoanIsApproved(loanStatusHashMap); - verifyLoanStatusIsWaitingForDisbursal(loanStatusHashMap); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + LoanStatusChecker.verifyLoanStatusIsWaitingForDisbursal(loanStatusHashMap); //UNDO APPROVAL loanStatusHashMap = undoApproval(loanID); - verifyLoanNeedsApproval(loanStatusHashMap); + LoanStatusChecker.verifyLoanStatusIsPending(loanStatusHashMap); //RE-APPROVE LOAN ON 1 OCTOBER 2010 loanStatusHashMap = approveLoan("1 October 2010", loanID); - verifyLoanIsApproved(loanStatusHashMap); - verifyLoanStatusIsWaitingForDisbursal(loanStatusHashMap); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + LoanStatusChecker.verifyLoanStatusIsWaitingForDisbursal(loanStatusHashMap); //DISBURSE loanStatusHashMap = disburseLoan(loanID); - verifyLoanStatusIsActive(loanStatusHashMap); + System.out.println("DISBURSE "+loanStatusHashMap); + LoanStatusChecker.verifyLoanStatusIsActive(loanStatusHashMap); //PERFORM REPAYMENTS AND CHECK LOAN STATUS - //----------------------------------------- -// verifyRepaymentScheduleEntryFor(1, 4000.0F, 200.0F, loanID); - + verifyRepaymentScheduleEntryFor(1, 4000.0F,loanID); makeRepayment(540.0f, "1 January 2011", loanID); makeRepayment(540.0f, "1 March 2011", loanID); waiveInterest("1 May 2011", loanID); @@ -93,43 +102,22 @@ public class LoanWithWaiveInterestAndWriteOff { makeRepayment(540.0f, "1 November 2011", loanID); waiveInterest("1 January 2012", loanID); makeRepayment(500.0f, "1 January 2012", loanID); - -// verifyRepaymentScheduleEntryFor(7, 1000.0F, 200.0F, loanID); + verifyRepaymentScheduleEntryFor(7,1000.0f,loanID); //WRITE OFF LOAN AND CHECK ACCOUNT IS CLOSED - verifyLoanAccountIsClosed(writeOffLoan("1 March 2012", loanID)); + LoanStatusChecker.verifyLoanAccountIsClosed(writeOffLoan("1 March 2012", loanID)); } - private void verifyLoanNeedsApproval(HashMap loanStatusHashMap) { - assertTrue(getStatus(loanStatusHashMap, "pendingApproval")); - } - - private void verifyLoanIsApproved(HashMap loanStatusHashMap) { - assertFalse(getStatus(loanStatusHashMap, "pendingApproval")); - } - - private void verifyLoanStatusIsWaitingForDisbursal(HashMap loanStatusHashMap) { - assertTrue(getStatus(loanStatusHashMap, "waitingForDisbursal")); - } - - private void verifyLoanStatusIsPending(HashMap loanStatusHashMap) { - assertTrue(getStatus(loanStatusHashMap, "pendingApproval")); - } - - private void verifyLoanStatusIsActive(HashMap loanStatusHashMap) { - assertTrue(getStatus(loanStatusHashMap, "active")); - } - - private void verifyRepaymentScheduleEntryFor(int repaymentNumber, float expectedPrincipal, Float expectedInterest, Integer loanID) { + private void verifyRepaymentScheduleEntryFor(int repaymentNumber, float expectedPrincipalOutstanding ,Integer loanID) { ArrayList repaymentPeriods = getLoanRepaymentSchedule(loanID); - assertEquals(repaymentPeriods.get(repaymentNumber).get("principalLoanBalanceOutstanding"), expectedPrincipal); - assertEquals(repaymentPeriods.get(repaymentNumber).get("interestLoanBalanceOutstanding"), expectedInterest); + assertEquals(repaymentPeriods.get(repaymentNumber).get("principalLoanBalanceOutstanding"), expectedPrincipalOutstanding); + } private HashMap writeOffLoan(String transactionDate, Integer loanID){ System.out.println("--------------------LOAN WRITTEN OFF ON "+transactionDate+"-------------------------------\n"); - String json = given().spec(requestSpec).body(getWriteOffBodyAsJSON(transactionDate)) + String json = given().spec(requestSpec).body(Utils.getWriteOffBodyAsJSON(transactionDate)) .expect().spec(responseSpec).log().ifError() .when().post("/mifosng-provider/api/v1/loans/" + loanID + "/transactions?command=writeoff&tenantIdentifier=default") .andReturn().asString(); @@ -139,14 +127,14 @@ public class LoanWithWaiveInterestAndWriteOff { private void waiveInterest(String transactionDate, Integer loanID){ System.out.println("--------------------Waive INTEREST On "+transactionDate+"-------------------------------\n"); - given().spec(requestSpec).body(getWaiveBodyAsJSON(transactionDate)) + given().spec(requestSpec).body(Utils.getWaiveBodyAsJSON(transactionDate, INTEREST_VALUE_AMOUNT)) .expect().spec(responseSpec).log().ifError() .when().post("/mifosng-provider/api/v1/loans/" + loanID + "/transactions?command=waiveinterest&tenantIdentifier=default"); } private void makeRepayment(Float transactionAmount, String transactionDate, Integer loanID){ - System.out.print("------------------------MADE REPAYMENT ON "+transactionDate+"---------------------------------\n"); - given().spec(requestSpec).body(getRepaymentBodyAsJSON(transactionDate,transactionAmount)) + System.out.print("------------------------MADE REPAYMENT ON " + transactionDate + "---------------------------------\n"); + given().spec(requestSpec).body(Utils.getRepaymentBodyAsJSON(transactionDate, transactionAmount)) .expect().spec(responseSpec).log().ifError() .when().post("/mifosng-provider/api/v1/loans/" + loanID + "/transactions?command=repayment&tenantIdentifier=default"); } @@ -161,14 +149,6 @@ public class LoanWithWaiveInterestAndWriteOff { return (ArrayList)repaymentSchedule.get("periods"); } - private boolean getStatus(HashMap loanStatusMap,String nameOfLoanStatusString){ - return (Boolean)loanStatusMap.get(nameOfLoanStatusString); - } - - private void verifyLoanAccountIsClosed(HashMap loanStatusHashMap){ - Assert.assertTrue(getStatus(loanStatusHashMap, "closed")); - } - private HashMap getStatusOfLoan(Integer loanID){ String json= given().spec(requestSpec) .expect().spec(responseSpec).log().ifError() @@ -188,7 +168,7 @@ public class LoanWithWaiveInterestAndWriteOff { } private HashMap disburseLoan(Integer loanID){ System.out.println("-----------------------------------DISBURSE LOAN-----------------------------------------"); - String json = given().spec(requestSpec).body(getDisburseLoanAsJSON()) + String json = given().spec(requestSpec).body(Utils.getDisburseLoanAsJSON(DISBURSEMENT_DATE)) .expect().spec(responseSpec).log().ifError() .when().post("/mifosng-provider/api/v1/loans/" + loanID + "?command=disburse&tenantIdentifier=default") .andReturn().asString(); @@ -198,11 +178,10 @@ public class LoanWithWaiveInterestAndWriteOff { private HashMap approveLoan(String approvalDate, Integer loanID){ System.out.println("-----------------------------------APPROVE LOAN-----------------------------------------"); - String json =given().spec(requestSpec).body(getApproveLoanAsJSON(approvalDate)) + String json =given().spec(requestSpec).body(Utils.getApproveLoanAsJSON(approvalDate)) .expect().spec(responseSpec).log().ifError() .when().post("/mifosng-provider/api/v1/loans/"+ loanID +"?command=approve&tenantIdentifier=default") .andReturn().asString(); - System.out.println("**************CHANGES :"+from(json).get("changes")); HashMap response = from(json).get("changes"); return (HashMap)response.get("status"); } @@ -214,9 +193,9 @@ public class LoanWithWaiveInterestAndWriteOff { return JsonPath.with(json).get("base64EncodedAuthenticationKey"); } - private Integer createClient() { + private Integer createClient(String dateOfJoining) { System.out.println("---------------------------------CREATING A CLIENT---------------------------------------------"); - String json = given().spec(requestSpec).body(getTestClientAsJSON()) + String json = given().spec(requestSpec).body(Utils.getTestClientAsJSON(dateOfJoining)) .expect().spec(responseSpec).log().ifError() .when().post("/mifosng-provider/api/v1/clients?tenantIdentifier=default") .andReturn().asString(); @@ -234,10 +213,15 @@ public class LoanWithWaiveInterestAndWriteOff { private Integer createLoanProduct() { System.out.println("------------------------------CREATING NEW LOAN PRODUCT ---------------------------------------"); String loanProductJSON = new LoanProductTestBuilder() - .withPrincipal(PRINCIPAL) + .withPrincipal(LP_PRINCIPAL) .withRepaymentTypeAsMonth() - .withRepaymentAfterEvery(REPAYMENT_PERIOD) - .withNumberOfRepayments(NUMBER_OF_REPAYMENTS) + .withRepaymentAfterEvery(LP_REPAYMENT_PERIOD) + .withNumberOfRepayments(LP_REPAYMENTS) + .withRepaymentTypeAsMonth() + .withinterestRatePerPeriod(LP_INTEREST_RATE) + .withInterestRateFrequencyTypeAsMonths() + .withAmortizationTypeAsEqualPrinciplePayment() + .withInterestTypeAsFlat() .build(); String json = given().spec(requestSpec).body(loanProductJSON) .expect().spec(responseSpec).log().ifError() @@ -248,118 +232,27 @@ public class LoanWithWaiveInterestAndWriteOff { private Integer applyForLoanApplication(final Integer clientID, final Integer loanProductID) { System.out.println("--------------------------------APPLYING FOR LOAN APPLICATION--------------------------------"); - String json = given().spec(requestSpec).body(getLoanApplicationBodyAsJSON(clientID.toString(), loanProductID.toString())) - .expect().spec(responseSpec).log().ifError() - .when().post("/mifosng-provider/api/v1/loans?tenantIdentifier=default") - .andReturn().asString(); + String loanApplicationJSON = new LoanApplicationTestBuilder() + .withPrincipal(PRINCIPAL) + .withLoanTermFrequency(LOAN_TERM_FREQUENCY) + .withLoanTermFrequencyAsMonths() + .withNumberOfRepayments(NUMBER_OF_REPAYMENTS) + .withRepaymentEveryAfter(REPAYMENT_PERIOD) + .withRepaymentFrequencyTypeAsMonths() + .withInterestRateFrequencyTypeAsMonths() + .withInterestRatePerPeriod(RATE_OF_INTEREST_PER_PERIOD) + .withInterestTypeAsFlatBalance() + .withAmortizationTypeAsEqualInstallments() + .withInterestCalculationPeriodTypeSameAsRepaymentPeriod() + .withExpectedDisbursementDate(EXPECTED_DISBURSAL_DATE) + .withSubmittedOnDate(LOAN_APPLICATION_SUBMISSION_DATE) + .Build(clientID.toString(), loanProductID.toString()); + String json = given().spec(requestSpec).body(loanApplicationJSON) + .expect().spec(responseSpec).log().ifError() + .when().post("/mifosng-provider/api/v1/loans?tenantIdentifier=default") + .andReturn().asString(); return from(json).get("loanId"); } - - - private String getWriteOffBodyAsJSON(String transactionDate){ - HashMap map = new HashMap(); - map.put("dateFormat","dd MMMM yyyy"); - map.put("locale","en"); - map.put("note", " LOAN WRITE OFF!!!"); - map.put("transactionDate",transactionDate); - return new Gson().toJson(map); - } - private String getWaiveBodyAsJSON(String transactionDate){ - HashMap map = new HashMap(); - map.put("locale","en"); - map.put("dateFormat","dd MMMM yyyy"); - map.put("transactionDate",transactionDate); - map.put("transactionAmount",INTEREST_VALUE_AMOUNT); - map.put("note", " Interest Waived!!!"); - return new Gson().toJson(map); - } - private String getRepaymentBodyAsJSON(String transactionDate,Float transactionAmount){ - HashMap map = new HashMap(); - map.put("locale","en"); - map.put("dateFormat","dd MMMM yyyy"); - map.put("transactionDate",transactionDate); - map.put("transactionAmount",transactionAmount.toString()); - map.put("note", "Repayment Made!!!"); - return new Gson().toJson(map); - } - private String getApproveLoanAsJSON(String approvalDate){ - HashMap map = new HashMap(); - map.put("locale","en"); - map.put("dateFormat","dd MMMM yyyy"); - map.put("approvedOnDate",approvalDate); - map.put("note", "Approval NOTE"); - System.out.println("***************JSON ***"+new Gson().toJson(map)); - return new Gson().toJson(map); - } - - private String getDisburseLoanAsJSON(){ - HashMap map = new HashMap(); - map.put("locale","en"); - map.put("dateFormat","dd MMMM yyyy"); - map.put("actualDisbursementDate",DISBURSEMENT_DATE); - map.put("note", "DISBURSE NOTE"); - return new Gson().toJson(map); - } - - private String getTestClientAsJSON() { - HashMap map = new HashMap(); - map.put("officeId", "1"); - map.put("firstname", Utils.randomNameGenerator("Client_FirstName_", 5)); - map.put("lastname", Utils.randomNameGenerator("Client_LastName_", 4)); - map.put("externalId", Utils.randomIDGenerator("ID_", 7)); - map.put("dateFormat", "dd MMMM yyyy"); - map.put("locale", "en"); - map.put("joinedDate", "04 March 2009"); - System.out.println("map : "+map); - return new Gson().toJson(map); - } - - - private String getLoanApplicationBodyAsJSON(final String clientID,final String productID){ - HashMap map = new HashMap(); - map.put("dateFormat", "dd MMMM yyyy"); - map.put("locale", "en_GB"); - map.put("clientId", clientID); - map.put("productId", productID); - map.put("principal", PRINCIPAL); - map.put("loanTermFrequency", "4"); - map.put("loanTermFrequencyType", "2"); - map.put("numberOfRepayments", NUMBER_OF_REPAYMENTS); - map.put("repaymentEvery", REPAYMENT_PERIOD); - map.put("repaymentFrequencyType", "2"); - map.put("interestRateFrequencyType", "2"); - map.put("interestRatePerPeriod", "2"); - map.put("amortizationType", "1"); - map.put("interestType", "1"); - map.put("interestCalculationPeriodType", "1"); - map.put("transactionProcessingStrategyId", "1"); - map.put("expectedDisbursementDate", DISBURSEMENT_DATE); - map.put("submittedOnDate", LOAN_APPLICATION_SUBMISSION_DATE); - return new Gson().toJson(map); - } - - private String getLoanCalculationBodyAsJSON(String productID){ - HashMap map = new HashMap(); - map.put("dateFormat", "dd MMMM yyyy"); - map.put("locale", "en_GB"); - map.put("productId", productID); - map.put("principal", PRINCIPAL); - map.put("loanTermFrequency", "4"); - map.put("loanTermFrequencyType", "2"); - map.put("numberOfRepayments", NUMBER_OF_REPAYMENTS); - map.put("repaymentEvery", REPAYMENT_PERIOD); - map.put("repaymentFrequencyType", "2"); - map.put("interestRateFrequencyType", "2"); - map.put("interestRatePerPeriod", "2"); - map.put("amortizationType", "1"); - map.put("interestType", "1"); - map.put("interestCalculationPeriodType", "1"); - map.put("expectedDisbursementDate", DISBURSEMENT_DATE); - map.put("transactionProcessingStrategyId", "1"); - return new Gson().toJson(map); - } - - }