/* * Copyright (c) 2005-2011 Grameen Foundation USA * All rights reserved. * * Licensed 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. * * See also http://www.apache.org/licenses/LICENSE-2.0.html for an * explanation of the license and how it is applied. */ package org.mifos.test.acceptance.loan.lsim; import java.io.UnsupportedEncodingException; import java.sql.SQLException; import org.joda.time.DateTime; import org.mifos.test.acceptance.framework.MifosPage; import org.mifos.test.acceptance.framework.UiTestCaseBase; import org.mifos.test.acceptance.framework.account.AccountStatus; import org.mifos.test.acceptance.framework.loan.CreateLoanAccountConfirmationPage; import org.mifos.test.acceptance.framework.loan.CreateLoanAccountEntryPage; import org.mifos.test.acceptance.framework.loan.CreateLoanAccountPreviewPage; import org.mifos.test.acceptance.framework.loan.CreateLoanAccountReviewInstallmentPage; import org.mifos.test.acceptance.framework.loan.CreateLoanAccountSearchPage; import org.mifos.test.acceptance.framework.loan.CreateLoanAccountSearchParameters; import org.mifos.test.acceptance.framework.loan.CreateLoanAccountSubmitParameters; import org.mifos.test.acceptance.framework.loan.DisburseLoanParameters; import org.mifos.test.acceptance.framework.loan.EditLoanAccountInformationPage; import org.mifos.test.acceptance.framework.loan.EditLoanAccountStatusParameters; import org.mifos.test.acceptance.framework.loan.LoanAccountPage; import org.mifos.test.acceptance.framework.loan.PaymentParameters; import org.mifos.test.acceptance.framework.loan.ViewRepaymentSchedulePage; import org.mifos.test.acceptance.framework.loanproduct.DefineNewLoanProductPage; import org.mifos.test.acceptance.framework.testhelpers.FormParametersHelper; import org.mifos.test.acceptance.framework.testhelpers.LoanTestHelper; import org.mifos.test.acceptance.framework.testhelpers.NavigationHelper; import org.mifos.test.acceptance.framework.util.UiTestUtils; import org.mifos.test.acceptance.loanproduct.LoanProductTestHelper; import org.mifos.test.acceptance.remote.DateTimeUpdaterRemoteTestingService; import org.mifos.test.acceptance.util.ApplicationDatabaseOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @SuppressWarnings("PMD") @ContextConfiguration(locations = {"classpath:ui-test-context.xml"}) @Test(singleThreaded = true, groups = {"loan", "acceptance", "ui", "no_db_unit"}) public class CreateLSIMClientLoanAccountTest extends UiTestCaseBase { private NavigationHelper navigationHelper; private LoanTestHelper loanTestHelper; private LoanProductTestHelper loanProductTestHelper; private String expectedDate; @Autowired private ApplicationDatabaseOperation applicationDatabaseOperation; @Override @SuppressWarnings("PMD.SignatureDeclareThrowsException") // one of the dependent methods throws Exception @BeforeMethod(alwaysRun = true) public void setUp() throws Exception { super.setUp(); applicationDatabaseOperation.updateLSIM(1); navigationHelper = new NavigationHelper(selenium); loanTestHelper = new LoanTestHelper(selenium); loanProductTestHelper = new LoanProductTestHelper(selenium); DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium); DateTime targetTime = new DateTime(2010, 1, 22, 10, 55, 0, 0); dateTimeUpdaterRemoteTestingService.setDateTime(targetTime); } @AfterMethod(alwaysRun = true) public void logOut() throws SQLException { applicationDatabaseOperation.updateLSIM(0); (new MifosPage(selenium)).logout(); } @Test(enabled=true, groups = {"loan", "acceptance", "ui"}) @SuppressWarnings("PMD.SignatureDeclareThrowsException") // http://mifosforge.jira.com/browse/MIFOSTEST-127 public void newWeeklyLSIMClientLoanAccount() throws Exception { CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters(); searchParameters.setSearchString("Stu1233171716380 Client1233171716380"); searchParameters.setLoanProduct("WeeklyFlatLoanWithOneTimeFees"); expectedDate = "29-Jan-2010"; CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters(); submitAccountParameters.setAmount("9012.0"); submitAccountParameters.setLsimFrequencyWeeks("on"); submitAccountParameters.setLsimWeekFrequency("1"); submitAccountParameters.setLsimWeekDay("Friday"); submitAccountParameters.setLoanPurpose("0008-Animal Trading"); createLSIMLoanAndCheckAmountAndInstallmentDate(searchParameters, submitAccountParameters, expectedDate); } @SuppressWarnings("PMD.SignatureDeclareThrowsException") // one of the dependent methods throws Exception @Test(enabled=true) public void newMonthlyClientLoanAccountWithMeetingOnSpecificDayOfMonth() throws Exception { CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters(); searchParameters.setSearchString("Client - Mary Monthly1"); searchParameters.setLoanProduct("MonthlyClientFlatLoan1stOfMonth"); expectedDate = "05-Feb-2010"; CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters(); submitAccountParameters.setAmount("1234.0"); submitAccountParameters.setLoanPurpose("0008-Animal Trading"); // create LSIM loan that has repayments on 5th of every month submitAccountParameters.setLsimFrequencyMonths("on"); submitAccountParameters.setLsimMonthTypeDayOfMonth("on"); submitAccountParameters.setLsimDayOfMonth("5"); submitAccountParameters.setLoanPurpose("0010-Camel"); createLSIMLoanAndCheckAmountAndInstallmentDate(searchParameters, submitAccountParameters, expectedDate); } @SuppressWarnings("PMD.SignatureDeclareThrowsException") // one of the dependent methods throws Exception // https://mifosforge.jira.com/browse/MIFOS-5852 @Test(enabled=true) public void newMonthlyClientLoanAccountWithMeetingOnSameWeekAndWeekday() throws Exception { //Given DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium); DateTime targetTime = new DateTime(2010, 5, 22, 10, 55, 0, 0); dateTimeUpdaterRemoteTestingService.setDateTime(targetTime); //Then CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters(); searchParameters.setSearchString("Monthly3rdFriday"); searchParameters.setLoanProduct("MonthlyClientFlatLoanThirdFridayOfMonth"); expectedDate = "08-Jul-2010"; CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters(); submitAccountParameters.setAmount("2765.0"); submitAccountParameters.setLoanPurpose("0008-Animal Trading"); // create LSIM loan that has repayments on 2nd Thursday of each month submitAccountParameters.setLsimFrequencyMonths("on"); submitAccountParameters.setLsimMonthTypeNthWeekdayOfMonth("on"); submitAccountParameters.setLsimMonthRank("Second"); submitAccountParameters.setLsimWeekDay("Thursday"); submitAccountParameters.setLoanPurpose("0010-Camel"); createLSIMLoanAndCheckAmountAndInstallmentDate(searchParameters, submitAccountParameters, expectedDate); } // http://mifosforge.jira.com/browse/MIFOSTEST-123 @Test(enabled=true) public void createLoanAccountWithNonMeetingDatesForDisburseAndRepay() throws Exception { //Given setTime(2011, 03, 24); String errorMessage = ""; CreateLoanAccountSearchParameters formParameters = new CreateLoanAccountSearchParameters(); formParameters.setLoanProduct("ClientEmergencyLoan"); formParameters.setSearchString("UpdateCustomProperties TestClient"); for(int i=0;i<2;i++) { CreateLoanAccountSearchPage createLoanAccountSearchPage = navigationHelper.navigateToClientsAndAccountsPage().navigateToCreateLoanAccountUsingLeftMenu(); formParameters.setSearchString("1"); createLoanAccountSearchPage = createLoanAccountSearchPage.navigateToCreateLoanAccountEntryPage(formParameters); errorMessage = "No text <Stu12332659912419 Client12332659912419:ID0002-000000030> present on the page"; createLoanAccountSearchPage.verifyTextPresent("Stu12332659912419 Client12332659912419:ID0002-000000030", errorMessage); createLoanAccountSearchPage = navigationHelper.navigateToClientsAndAccountsPage().navigateToCreateLoanAccountUsingLeftMenu(); formParameters.setSearchString(" "); createLoanAccountSearchPage = createLoanAccountSearchPage.navigateToCreateLoanAccountEntryPage(formParameters); errorMessage = "No text <Stu1233266063395 Client1233266063395:ID0002-000000003> present on the page"; createLoanAccountSearchPage.verifyTextPresent("Stu1233266063395 Client1233266063395:ID0002-000000003", errorMessage); createLoanAccountSearchPage = navigationHelper.navigateToClientsAndAccountsPage().navigateToCreateLoanAccountUsingLeftMenu(); formParameters.setSearchString("%"); createLoanAccountSearchPage = createLoanAccountSearchPage.navigateToCreateLoanAccountEntryPage(formParameters); createLoanAccountSearchPage.waitForElementToPresent("name=customerSearchResults_length"); verify10SearchResults(); verify25SearchResults(); verify50SearchResults(); verify100SearchResults(); formParameters.setSearchString("UpdateCustomProperties TestClient"); navigationHelper.navigateToClientsAndAccountsPage().navigateToCreateLoanAccountUsingLeftMenu().verifyNoSelectLoanProduct(formParameters, "Please select a Loan product name"); createLoanAccountSearchPage = navigationHelper.navigateToClientsAndAccountsPage().navigateToCreateLoanAccountUsingLeftMenu(); formParameters.setSearchString("UpdateCustomProperties TestClient"); CreateLoanAccountEntryPage createLoanAccountEntryPage = createLoanAccountSearchPage.searchAndNavigateToCreateLoanAccountPage(formParameters); createLoanAccountEntryPage = navigationHelper.navigateToClientsAndAccountsPage().navigateToCreateLoanAccountUsingLeftMenu().searchAndNavigateToCreateLoanAccountPage(formParameters); createLoanAccountEntryPage.verifyAllowedAmounts("1,000", "10,000", "1000.0"); createLoanAccountEntryPage.verifyDisbsursalDate("25", "3", "2011"); createLoanAccountEntryPage.setAmount(""); createLoanAccountEntryPage.setInstallments(""); createLoanAccountEntryPage.setDisbursalDate("", "", ""); createLoanAccountEntryPage.setInterestRate(""); createLoanAccountEntryPage.setLonaPurpose("0008-Animal Trading"); createLoanAccountEntryPage = createLoanAccountEntryPage.clickContinueButExpectValidationFailure(); createLoanAccountEntryPage.verifyError("Please specify valid Amount. Amount should be a value between 1,000 and 10,000, inclusive."); createLoanAccountEntryPage.verifyError("Please specify valid Interest rate. Interest rate should be a value between 0 and 0, inclusive."); createLoanAccountEntryPage.verifyError("Please specify valid No. of installments. No. of installments should be a value between 1 and 10, inclusive."); createLoanAccountEntryPage.verifyError("You have entered an invalid disbursal date. Please check the date format."); createLoanAccountEntryPage.setDisbursalDate("26", "02", "2011"); createLoanAccountEntryPage = createLoanAccountEntryPage.clickContinueButExpectValidationFailure(); createLoanAccountEntryPage.verifyError("The disbursement date is invalid. Disbursement date must be on or after todays date."); createLoanAccountEntryPage.setDisbursalDate("21", "01", "2012"); createLoanAccountEntryPage = createLoanAccountEntryPage.clickContinueButExpectValidationFailure(); if(i%2 == 0) { createLoanAccountEntryPage.verifyNoError("The disbursement date is invalid. It must fall on a valid customer meeting schedule."); } else { createLoanAccountEntryPage.verifyError("The disbursement date is invalid. It must fall on a valid customer meeting schedule."); } createLoanAccountEntryPage.setDisbursalDate("25", "3", "2011"); createLoanAccountEntryPage.setAmount("999999999999999999.88888888"); createLoanAccountEntryPage.setInterestRate("999999999999.88888888"); createLoanAccountEntryPage = createLoanAccountEntryPage.clickContinueButExpectValidationFailure(); createLoanAccountEntryPage.verifyError("The interest rate is invalid as the number of digits after the decimal separator exceeds the allowed number of 5."); createLoanAccountEntryPage.verifyError("The amount is invalid because the number of digits before the decimal separator exceeds the allowed number of 14."); createLoanAccountEntryPage.setAmount("12345678901234"); createLoanAccountEntryPage.setInterestRate("999999999999.88888888"); createLoanAccountEntryPage = createLoanAccountEntryPage.clickContinueButExpectValidationFailure(); createLoanAccountEntryPage.verifyError("The interest rate is invalid as the number of digits after the decimal separator exceeds the allowed number of 5."); CreateLoanAccountSubmitParameters formParametersFees = new CreateLoanAccountSubmitParameters(); formParametersFees.setAdditionalFee1("loanWeeklyFee"); formParametersFees.setAdditionalFee2("oneTimeFee"); createLoanAccountEntryPage.setAmount("5000"); createLoanAccountEntryPage.setInterestRate("0.0"); createLoanAccountEntryPage.setInstallments("10"); createLoanAccountEntryPage.fillAdditionalFee(formParametersFees); CreateLoanAccountReviewInstallmentPage createLoanAccountReviewInstallmentPage = createLoanAccountEntryPage.clickContinue(); createLoanAccountReviewInstallmentPage.verifyLoanAmount("5,000"); createLoanAccountReviewInstallmentPage.verifyDueDate(1, "01/04/11"); createLoanAccountReviewInstallmentPage.verifyDueDate(2, "08/04/11"); createLoanAccountReviewInstallmentPage.verifyDueDate(10, "03/06/11"); CreateLoanAccountPreviewPage createLoanAccountPreviewPage = createLoanAccountReviewInstallmentPage.clickPreviewAndNavigateToPreviewPage(); createLoanAccountPreviewPage.verifyLoanAmount("5,000"); createLoanAccountPreviewPage.verifyInterestTypeInLoanPreview("Flat"); createLoanAccountPreviewPage.verifyDueDate(1, "01-Apr-2011"); createLoanAccountPreviewPage.verifyDueDate(2, "08-Apr-2011"); createLoanAccountPreviewPage.verifyDueDate(10, "03-Jun-2011"); createLoanAccountEntryPage = createLoanAccountPreviewPage.editAccountInformation(); createLoanAccountEntryPage.setAmount("2000.0"); createLoanAccountPreviewPage = createLoanAccountEntryPage.clickContinue().clickPreviewAndNavigateToPreviewPage(); createLoanAccountPreviewPage.verifyLoanAmount("2,000"); CreateLoanAccountConfirmationPage createLoanAccountConfirmationPage = createLoanAccountPreviewPage.submitForApprovalAndNavigateToConfirmationPage(); errorMessage = "No text <View loan account details now> present on the page"; createLoanAccountConfirmationPage.verifyTextPresent("View loan account details now", errorMessage); LoanAccountPage loanAccountPage = createLoanAccountConfirmationPage.navigateToLoanAccountDetailsPage(); loanAccountPage.verifyStatus("Application Pending Approval"); loanAccountPage.verifyDisbursalDate("25/03/2011"); String[][] accountSummaryTable = {{"", "Original Loan", "Amount paid", "Loan balance"}, {"Principal", "2,000", "0", "2,000"}, {"Interest", "0", "0", "0"}, {"Fees", "1,010", "0", "1,010"}, {"Penalty", "0", "0", "0"}, {"Total", "3,010", "0", "3,010"}}; loanAccountPage.verifyAccountSummary(accountSummaryTable); loanAccountPage.verifyInterestRate("0"); ViewRepaymentSchedulePage viewRepaymentSchedulePage = loanAccountPage.navigateToRepaymentSchedulePage(); viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(3, "01-Apr-2011"); viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(4, "08-Apr-2011"); viewRepaymentSchedulePage.verifyRepaymentScheduleTableDueDate(6, "22-Apr-2011"); loanAccountPage = viewRepaymentSchedulePage.navigateToLoanAccountPage(); EditLoanAccountInformationPage editLoanAccountInformationPage = loanAccountPage.navigateToEditAccountInformation(); editLoanAccountInformationPage.setAmount("3000.0"); loanAccountPage = editLoanAccountInformationPage.submitAndNavigateToAccountInformationPreviewPage().submitAndNavigateToLoanAccountPage(); loanAccountPage.verifyLoanAmount("3000.0"); applicationDatabaseOperation.updateLSIM(0); } } private void verify10SearchResults() { selenium.select("name=customerSearchResults_length", "value=10"); UiTestUtils.sleep(3000); Assert.assertEquals(selenium.getXpathCount("//table[@id='customerSearchResults']/tbody/tr").intValue(), 10); } private void verify25SearchResults() { selenium.select("name=customerSearchResults_length", "value=25"); UiTestUtils.sleep(3000); Assert.assertEquals(selenium.getXpathCount("//table[@id='customerSearchResults']/tbody/tr").intValue(), 25); } private void verify50SearchResults() { selenium.select("name=customerSearchResults_length", "value=50"); UiTestUtils.sleep(3000); Assert.assertTrue(selenium.getXpathCount("//table[@id='customerSearchResults']/tbody/tr").intValue() > 30); } private void verify100SearchResults() { selenium.select("name=customerSearchResults_length", "value=100"); UiTestUtils.sleep(3000); Assert.assertTrue(selenium.getXpathCount("//table[@id='customerSearchResults']/tbody/tr").intValue() > 30); } private void setTime(int year, int monthOfYear, int dayOfMonth) throws UnsupportedEncodingException { DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium); DateTime systemTime = new DateTime(year, monthOfYear, dayOfMonth, 12, 0, 0, 0); dateTimeUpdaterRemoteTestingService.setDateTime(systemTime); } // http://mifosforge.jira.com/browse/MIFOSTEST-121 @Test(enabled=true) public void createWeeklyLoanAccountWithNonMeetingDatesForDisburseAndRepay() throws Exception { //Given setTime(2011, 02, 23); //When DefineNewLoanProductPage.SubmitFormParameters defineNewLoanProductformParameters = FormParametersHelper.getWeeklyLoanProductParameters(); CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters(); searchParameters.setSearchString("Stu1233171716380 Client1233171716380"); searchParameters.setLoanProduct(defineNewLoanProductformParameters.getOfferingName()); CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters(); submitAccountParameters = createSearchParameters("23","02","2011"); submitAccountParameters.setLoanPurpose("0008-Animal Trading"); EditLoanAccountStatusParameters editLoanAccountStatusParameters = new EditLoanAccountStatusParameters(); editLoanAccountStatusParameters.setStatus(AccountStatus.LOAN_APPROVED.getStatusText()); editLoanAccountStatusParameters.setNote("activate account"); DisburseLoanParameters disburseLoanParameters = new DisburseLoanParameters(); disburseLoanParameters=createDisubreseLoanParameters("24","02","2011"); loanProductTestHelper.defineNewLoanProduct(defineNewLoanProductformParameters); String loanId = loanTestHelper.createLoanAccount(searchParameters, submitAccountParameters).getAccountId(); loanTestHelper.changeLoanAccountStatus(loanId, editLoanAccountStatusParameters); //Then loanTestHelper.disburseLoanWithWrongParams(loanId, disburseLoanParameters,"Date of transaction can not be a future date."); disburseLoanParameters.setDisbursalDateDD("23"); loanTestHelper.disburseLoan(loanId, disburseLoanParameters); //loanTestHelper.disburseLoan(loanId, disburseLoanParameters); loanTestHelper.repayLoan(loanId); } // http://mifosforge.jira.com/browse/MIFOSTEST-124 @Test(enabled=true) public void verifyGracePeriodEffectOnLoanSchedule() throws Exception{ //Given applicationDatabaseOperation.updateLSIM(1); DefineNewLoanProductPage.SubmitFormParameters formParameters = FormParametersHelper.getWeeklyLoanProductParameters(); formParameters.setGracePeriodType(DefineNewLoanProductPage.SubmitFormParameters.PRINCIPAL_ONLY_GRACE); formParameters.setGracePeriodDuration("3"); CreateLoanAccountSearchParameters searchParameters = new CreateLoanAccountSearchParameters(); searchParameters.setSearchString("Stu1233266063395 Client1233266063395"); searchParameters.setLoanProduct(formParameters.getOfferingName()); //When / Then loanProductTestHelper .navigateToDefineNewLoanPageAndFillMandatoryFields(formParameters) .verifyVariableInstalmentOptionsDefaults() .checkConfigureVariableInstalmentsCheckbox() .submitAndGotoNewLoanProductPreviewPage() .submit(); CreateLoanAccountSubmitParameters createLoanAccountSubmitParameters = new CreateLoanAccountSubmitParameters(); createLoanAccountSubmitParameters.setDd("22"); createLoanAccountSubmitParameters.setMm("2"); createLoanAccountSubmitParameters.setYy("2011"); createLoanAccountSubmitParameters.setLoanPurpose("0008-Animal Trading"); //Then loanTestHelper.createLoanAccount(searchParameters, createLoanAccountSubmitParameters) .navigateToRepaymentSchedulePage() .verifySchedulePrincipalWithGrace(Integer.parseInt(formParameters.getGracePeriodDuration())); } private CreateLoanAccountSubmitParameters createSearchParameters(String d, String m, String y){ CreateLoanAccountSubmitParameters submitAccountParameters = new CreateLoanAccountSubmitParameters(); submitAccountParameters.setDd(d); submitAccountParameters.setMm(m); submitAccountParameters.setYy(y); return submitAccountParameters; } private DisburseLoanParameters createDisubreseLoanParameters(String d, String m, String y){ DisburseLoanParameters disburseLoanParameters = new DisburseLoanParameters(); disburseLoanParameters.setDisbursalDateDD(d); disburseLoanParameters.setDisbursalDateMM(m); disburseLoanParameters.setDisbursalDateYYYY(y); disburseLoanParameters.setPaymentType(PaymentParameters.CASH); return disburseLoanParameters; } private String createLSIMLoanAndCheckAmountAndInstallmentDate(CreateLoanAccountSearchParameters searchParameters, CreateLoanAccountSubmitParameters submitAccountParameters, String expectedDate) { LoanAccountPage loanAccountPage = loanTestHelper.createLoanAccount(searchParameters, submitAccountParameters); loanAccountPage.verifyLoanAmount(submitAccountParameters.getAmount()); String loanId = loanAccountPage.getAccountId(); ViewRepaymentSchedulePage viewRepaymentSchedulePage = loanAccountPage.navigateToViewRepaymentSchedule(); viewRepaymentSchedulePage.verifyFirstInstallmentDate(4, 2, expectedDate); return loanId; } }