/* * 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.framework.loan; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.mifos.test.acceptance.framework.AbstractPage; import org.mifos.test.acceptance.framework.ClientsAndAccountsHomepage; import org.mifos.test.acceptance.framework.HomePage; import org.mifos.test.acceptance.util.StringUtil; import org.testng.Assert; import com.thoughtworks.selenium.Selenium; import com.thoughtworks.selenium.SeleniumException; public class CreateLoanAccountReviewInstallmentPage extends AbstractPage { String validateButton = "_eventId_validate"; // TODO - English locale hard-coded DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("dd/MM/yyyy").withLocale(Locale.ENGLISH); DateTimeFormatter dateTimeFormatter2 = DateTimeFormat.forPattern("dd/MM/yy").withLocale(Locale.ENGLISH); SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH); String tableXpath = "//table[@id='cashflow']"; String previewButton = "_eventId_preview"; Map<String,Integer> monthsMap = new HashMap<String,Integer>(); public CreateLoanAccountReviewInstallmentPage(Selenium selenium) { super(selenium); monthsMap.put("January", 0); monthsMap.put("February", 1); monthsMap.put("March", 2); monthsMap.put("April", 3); monthsMap.put("May", 4); monthsMap.put("June", 5); monthsMap.put("July", 6); monthsMap.put("August", 7); monthsMap.put("September", 8); monthsMap.put("October", 9); monthsMap.put("November", 10); monthsMap.put("December", 11); this.verifyPage("SchedulePreview"); } public CreateLoanAccountReviewInstallmentPage submitWithErrors(String error) { selenium.click(previewButton); selenium.waitForPageToLoad("3000"); selenium.isTextPresent(error); return this; } public CreateLoanAccountReviewInstallmentPage validate(){ selenium.click("schedulePreview.button.validate"); selenium.waitForPageToLoad("3000"); return this; } public CreateLoanAccountReviewInstallmentPage verifyPage() { this.verifyPage("SchedulePreview"); return this; } public void verifyErrorsOnPage(String... errors) { for (String error : errors) { Assert.assertTrue(selenium.isTextPresent(error)); } } public HomePage navigateToHomePage() { selenium.click("id=header.link.home"); waitForPageToLoad(); return new HomePage(selenium); } public CreateLoanAccountReviewInstallmentPage validateRepaymentScheduleFieldDefault(int defInstallments) { for (int instalment = 0; instalment < defInstallments-1 ; instalment++) { Assert.assertTrue(selenium.isEditable("installment.dueDate." + instalment)); } for (int instalment = 0; instalment < defInstallments-2 ; instalment++) { Assert.assertTrue(selenium.isEditable("installmentAmounts[" + instalment + "]")); } Assert.assertTrue(!selenium.isElementPresent("installments[" + (defInstallments - 1) + "].total")); return this; } public CreateLoanAccountReviewInstallmentPage validateDateFieldValidations(DateTime disbursalDate, int minGap, int maxGap, int noOfInstallments) { validateBlankDate(noOfInstallments); validateInvalidDateFormat(noOfInstallments,disbursalDate,"dd/MM/yy", minGap); validateDateOrder(disbursalDate,minGap,noOfInstallments); validateErrorForSameDate(disbursalDate,minGap,noOfInstallments); validateGapForFirstDateAndDisbursalDate(disbursalDate); validateErrorForInstallmentGapsLessThanMinGap(minGap, noOfInstallments, disbursalDate); validateErrorForInstallmentGapsGraterThanMaxGap(maxGap, noOfInstallments, disbursalDate); return this; } private void validateErrorForSameDate(DateTime disbursalDate, int minGap, int noOfInstallments) { DateTime nextInstallmentDate = getValidDate(disbursalDate, minGap, true); for (int iterator = 0; iterator < noOfInstallments-1 ; iterator++) { fillDate(disbursalDate, minGap, noOfInstallments, true); DateTime currentInstallmentDate = nextInstallmentDate; nextInstallmentDate = getValidDate(currentInstallmentDate, minGap, true); setInstallmentDate(String.valueOf(iterator), dateTimeFormatter.print(currentInstallmentDate)); setInstallmentDate(String.valueOf(iterator+1), dateTimeFormatter.print(currentInstallmentDate)); clickValidateAndWaitForPageToLoad(); String s = "Installments [" + (iterator + 1) + ", " + (iterator + 2) + "] have the same due date"; isTextPresentInPage(s); } DateTime validDate = getValidDate(disbursalDate, minGap, true); setInstallmentDate("0", dateTimeFormatter.print(validDate)); StringBuffer stringBuffer = new StringBuffer("1"); for (int iterator = 1; iterator < noOfInstallments ; iterator++) { setInstallmentDate(String.valueOf(iterator), dateTimeFormatter.print(validDate)); stringBuffer = stringBuffer.append(", ").append(iterator+1); } clickValidateAndWaitForPageToLoad(); isTextPresentInPage("Installments [" + stringBuffer.toString() .trim() +"] have the same due date"); } private void isTextPresentInPage(String validationMessage) { if (!selenium.isTextPresent(validationMessage)) { Assert.fail(validationMessage + " was expected but not found on: " + selenium.getLocation() + " source code <br/> " + selenium.getHtmlSource()); } Assert.assertTrue(!selenium.isElementPresent("//span[@id='schedulePreview.error.message']/li[text()='']"), "Blank Error message is thrown"); Assert.assertTrue(!selenium.isElementPresent("//span[@id='schedulePreview.error.message']/li[text()=' ']"), "Blank Error message is thrown"); } private void validateErrorForInstallmentGapsGraterThanMaxGap(int maxGap, int noOfInstallments, DateTime disbursalDate) { DateTime nextInstallment = getValidDate(disbursalDate, maxGap, true); for (int installment = 0; installment < noOfInstallments; installment++) { setInstallmentDate(String.valueOf(installment), dateTimeFormatter.print(nextInstallment)); nextInstallment=getValidDate(nextInstallment, maxGap+1, true); } clickValidateAndWaitForPageToLoad(); for (int installment = 1; installment < noOfInstallments-1; installment++) { isTextPresentInPage("Gap between the due dates of installment "+(installment+1)+" and the previous installment is more than allowed"); } } private void validateDateOrder(DateTime disbursalDate, int minGap, int noOfInstallments) { DateTime nextInstallmentDate = getValidDate(disbursalDate, minGap, true); for (int iterator = 0; iterator < noOfInstallments-1 ; iterator++) { fillDate(disbursalDate, minGap, noOfInstallments, true); DateTime currentInstallmentDate = nextInstallmentDate; nextInstallmentDate = getValidDate(currentInstallmentDate, minGap, true); setInstallmentDate(String.valueOf(iterator), dateTimeFormatter.print(nextInstallmentDate)); setInstallmentDate(String.valueOf(iterator+1), dateTimeFormatter.print(currentInstallmentDate)); clickValidateAndWaitForPageToLoad(); isTextPresentInPage("Installment " + (iterator+2) + " has an invalid due date. Installment due dates should be in ascending order"); } } private void fillDate(DateTime disbursalDate, int gap, int noOfInstallments, boolean IsGapMinimumGap) { DateTime nextInstallment = disbursalDate; for (int installment = 0; installment < noOfInstallments; installment++) { nextInstallment = getValidDate(nextInstallment,gap, IsGapMinimumGap); setInstallmentDate(String.valueOf(installment), dateTimeFormatter.print(nextInstallment)); } } private void verifyAllDatesFields(DateTime disbursalDate, int gap, int noOfInstallments, boolean IsGapMinimumGap) { DateTime nextInstallment = disbursalDate; for (int installment = 0; installment < noOfInstallments; installment++) { nextInstallment = getValidDate(nextInstallment,gap, IsGapMinimumGap); Assert.assertEquals(selenium.getValue("installment.dueDate." + installment), dateTimeFormatter2.print(nextInstallment)); } } private void validateBlankDate(double noOfInstallment) { for (int installment = 0; installment < noOfInstallment ; installment++) { setInstallmentDate(String.valueOf(installment), ""); } clickValidateAndWaitForPageToLoad(); for (int installment = 0; installment < noOfInstallment ; installment++) { isTextPresentInPage("The due date field for installment " + (installment+1) +" is blank."); } } private void validateInvalidDateFormat(int noOfInstallments, DateTime disbursalDate, String dateFormat, int minGap) { DateTime nextInstallment = disbursalDate; for (int installment = 0; installment < noOfInstallments; installment++) { nextInstallment = nextInstallment.plusDays(minGap); setInstallmentDate(String.valueOf(installment), DateTimeFormat.forPattern(dateFormat).print(nextInstallment)); } clickValidateAndWaitForPageToLoad(); for (int installment = 0; installment < noOfInstallments; installment++) { // Assert.Assert.assertTrue(selenium.isTextPresent("Installment " + (installment+1) +" has an invalid due date. An example due date is 23-Apr-2010")); } } private void validateErrorForInstallmentGapsLessThanMinGap(int minGap, int noOfInstallments, DateTime disbursalDate) { DateTime nextInstalment = getValidDate(disbursalDate,minGap, true); for (int installment = 0; installment < noOfInstallments; installment++) { setInstallmentDate(String.valueOf(installment), dateTimeFormatter.print(nextInstalment)); nextInstalment = getValidDate(nextInstalment,minGap-1, true); } clickValidateAndWaitForPageToLoad(); for (int installment = 1; installment < noOfInstallments-1; installment++) { isTextPresentInPage("Gap between the due dates of installment "+ (installment+1)+" and the previous installment is less than allowed"); } // Assert.Assert.assertTrue(selenium.isTextPresent("Gap between disbursal date and due date of first installment is less than the allowable minimum gap")); } private DateTime getValidDate(DateTime disbursalDate, int minGap, boolean isGapIsMinimumGap) { DateTime dateTime = disbursalDate.plusDays(minGap); if (dateTime.getDayOfWeek()==7) { if (isGapIsMinimumGap) { dateTime = dateTime.plusDays(1); } else { dateTime = dateTime.minusDays(1); } } return dateTime; } private void validateGapForFirstDateAndDisbursalDate(DateTime disbursalDate) { setInstallmentDate("0", dateTimeFormatter.print(disbursalDate)); clickValidateAndWaitForPageToLoad(); isTextPresentInPage("Installment 1 has due date which falls on the disbursal date"); setInstallmentDate("0", dateTimeFormatter.print(disbursalDate.minusDays(1))); clickValidateAndWaitForPageToLoad(); isTextPresentInPage("Installment 1 has due date which falls before the disbursal date"); } private void clickValidateAndWaitForPageToLoad() { selenium.click(validateButton); selenium.waitForPageToLoad("3000"); } public CreateLoanAccountReviewInstallmentPage verifyInstallmentTotalValidations(int noOfInstallments, int minInstalmentAmount, DateTime disbursalDate, int gap) { verifyBlankTotalField(noOfInstallments); verifyErrorForTotalLessThanMinAmount(minInstalmentAmount,noOfInstallments, disbursalDate, gap); verifyErrorForInvalidTotal(noOfInstallments); return this; } private void verifyErrorForInvalidTotal(int noOfInstallments) { fillAllTotalFields(noOfInstallments, "abcd123"); clickValidateAndWaitForPageToLoad(); for (int installment = 0; installment < noOfInstallments-1; installment++) { isTextPresentInPage("Invalid data"); } } private void verifyErrorForTotalLessThanMinAmount(int minInstalmentAmount, int noOfInstallments, DateTime disbursalDate, int gap) { fillDate(disbursalDate, gap,noOfInstallments, true); fillAllTotalFields(noOfInstallments, String.valueOf(minInstalmentAmount-1)); clickValidateAndWaitForPageToLoad(); for (int installment = 0; installment < noOfInstallments-1; installment++) { isTextPresentInPage("Installment "+(installment+1)+" has total amount less than the allowed value"); } } private void verifyBlankTotalField(int noOfInstallments) { fillAllTotalFields(noOfInstallments, ""); clickValidateAndWaitForPageToLoad(); for (int installment = 0; installment < noOfInstallments-1; installment++) { isTextPresentInPage("The total amount field for installment "+(installment+1)+" was blank and has been defaulted to zero."); } } private void fillAllTotalFields(int noOfInstallments, String installmentAmount) { for (int installment = 0; installment < noOfInstallments-1; installment++) { selenium.type("installmentAmounts["+installment+"]", installmentAmount); } } public CreateLoanAccountReviewInstallmentPage verifyValidData(int noOfInstallments, int minGap, int minInstalmentAmount, DateTime disbursalDate, int maxGap) { fillAllTotalFields(noOfInstallments, String.valueOf(minInstalmentAmount)); fillDate(disbursalDate,minGap,noOfInstallments, true); clickValidateAndWaitForPageToLoad(); verifyNoErrorMessageIsThrown(); fillDate(disbursalDate,maxGap,noOfInstallments, false); verifyNoErrorMessageIsThrown(); return this; } private void verifyNoErrorMessageIsThrown() { Assert.assertTrue(!selenium.isElementPresent("//span[@id='schedulePreview.error.message']/li")); } public CreateLoanAccountReviewInstallmentPage verifyCashFlow(double cashFlowIncremental, double loanAmount) { int noOfMonths = selenium.getXpathCount(tableXpath + "//tr").intValue() - 1; double cashFlow = cashFlowIncremental; boolean cashflowAdded = false; // TODO - English locale hard-coded //DecimalFormat df = new DecimalFormat("#.0", new DecimalFormatSymbols(Locale.ENGLISH)); for (int rowIndex = 0; rowIndex < noOfMonths - 1; rowIndex++) { String cashFlowDisplayed = selenium.getText(tableXpath + "//tr[" + (rowIndex + 1) + "]/td[2]"); Assert.assertEquals(StringUtil.formatNumber(String.valueOf(cashFlowDisplayed)), StringUtil.formatNumber(String.valueOf(cashFlow))); Assert.assertEquals(selenium.getText(tableXpath + "//tr[" + (rowIndex + 1) + "]/td[5]"), "notes" + (rowIndex+1)); if(!cashflowAdded){ cashFlow += loanAmount; cashflowAdded = true; } cashFlow = cashFlow + cashFlowIncremental; } return this; } public CreateLoanAccountReviewInstallmentPage verifyCashFlow(double cashFlowIncremental, double loanAmount, String[] cumulativeCashFlowTIAPM, String[] totalInstallmentAmount) { int rowIndex = 1; for(String cash : cumulativeCashFlowTIAPM) { Assert.assertEquals(selenium.getText(tableXpath + "//tr[" + rowIndex + "]/td[3]"), cash); rowIndex++; } rowIndex = 1; for(String cash : totalInstallmentAmount) { Assert.assertEquals(selenium.getText(tableXpath + "//tr[" + rowIndex + "]/td[4]"), cash); rowIndex++; } return verifyCashFlow(cashFlowIncremental, loanAmount); } public void verifyCashFlowCalcualted(int cashFlowIncremental) { Assert.assertTrue(true); } public CreateLoanAccountReviewInstallmentPage verifyCashFlowDefaultValues() { // verifyCellValueOfCashFlow(3,1,"Cumulative cash flow-Total installment amount per month"); verifyCellValueOfCashFlow(3,1,"1"); verifyCellValueOfCashFlow(3,2,"330"); verifyCellValueOfCashFlow(3,3,"667.4"); verifyCellValueOfCashFlow(3,4,"1004"); // verifyCellValueOfCashFlow(4,1,"Total installment amount per month as % of cash flow"); verifyCellValueOfCashFlow(4,1,"0"); // verifyCellValueOfCashFlow(4,2,"33600.00"); // verifyCellValueOfCashFlow(4,3,"11189.33"); verifyCellValueOfCashFlow(4,4,"0"); return this; } private void verifyCellValueOfCashFlow(int column, int row, String value) { Assert.assertEquals(selenium.getText(tableXpath + "//tbody//tr[" + (row) + "]/td[" + (column) + "]"), value); } public CreateLoanAccountReviewInstallmentPage verifyRecalculationOfCashFlow() { verifyRecalculation(validateButton); verifyRecalculationForForSameMonth(validateButton); verifyRecalculation(previewButton); verifyRecalculationForForSameMonth(previewButton); return this; } public CreateLoanAccountReviewInstallmentPage verifyWarningThresholdMessageOnReviewSchedulePage(double warningThreshold) { verifyWarningThresholdMessageOnReviewSchedulePage(validateButton,warningThreshold); verifyWarningThresholdMessageOnReviewSchedulePage(previewButton, warningThreshold); return this; } public void verifyInstallmentDatesOutOfCashFlowCaptured() { verifyErrorMessageOnDatesOutOfCashFlow(validateButton); verifyErrorMessageOnDatesOutOfCashFlow(previewButton); } private void verifyRecalculation(String button) { setInstallmentDate("0", "02-Sep-2010"); setInstallmentDate("1", "02-Oct-2010"); setInstallmentDate("2", "02-Nov-2010"); setFirstAndSecondInstallmentTotal("1"); selenium.click(button); selenium.waitForPageToLoad("3000"); verifyCellValueOfCashFlow(3,2,"0"); verifyCellValueOfCashFlow(3,3,"1"); verifyCellValueOfCashFlow(4,2,"100"); verifyCellValueOfCashFlow(4,3,"50"); } private void verifyRecalculationForForSameMonth(String button) { setInstallmentDate("0", "02-Sep-2010"); setInstallmentDate("1", "02-Sep-2010"); setInstallmentDate("2", "02-Nov-2010"); setFirstAndSecondInstallmentTotal("1"); selenium.click(button); selenium.waitForPageToLoad("3000"); verifyCellValueOfCashFlow(3,2,"-1"); verifyCellValueOfCashFlow(3,3,"2"); verifyCellValueOfCashFlow(4,2,"200"); verifyCellValueOfCashFlow(4,3,"0"); } private void setInstallmentDate(String installment, String date) { selenium.type("installments["+installment+"]", date); } private void setFirstAndSecondInstallmentTotal(String total) { selenium.type("installmentAmounts[0]", total); selenium.type("installmentAmounts[1]", total); } private void verifyWarningThresholdMessageOnReviewSchedulePage(String button, double warningThreshold) { setInstallmentDate("0","19-Oct-2010"); setInstallmentDate("1","26-Oct-2010"); setInstallmentDate("2","02-Nov-2010"); setFirstAndSecondInstallmentTotal("336.0"); selenium.click(button); selenium.waitForPageToLoad("3000"); // Assert.Assert.assertTrue(selenium.isTextPresent("Installment amount for September 2010 as % of warning threshold exceeds the allowed warning threshold of " + warningThreshold+ "%")); isTextPresentInPage("Installment amount for October 2010 as % of warning threshold exceeds the allowed warning threshold of " + warningThreshold+ "%"); isTextPresentInPage("Installment amount for November 2010 as % of warning threshold exceeds the allowed warning threshold of " + warningThreshold+ "%"); } private void verifyErrorMessageOnDatesOutOfCashFlow(String button) { setInstallmentDate("0","02-Aug-2010"); setInstallmentDate("1","26-Oct-2010"); setInstallmentDate("2","02-Jan-2011"); setFirstAndSecondInstallmentTotal("336.0"); selenium.click(button); selenium.waitForPageToLoad("3000"); isTextPresentInPage("Cash flow is not available for August 2010. Due date should be entered for a month for which cash flow is available"); isTextPresentInPage("Cash flow is not available for January 2011. Due date should be entered for a month for which cash flow is available"); } public void verifyRecalculationWhenDateAndTotalChange() { setInstallmentTotal(1,"200"); setInstallmentTotal(2,"150"); setInstallmentTotal(3,"250"); setInstallmentDate("0","18-Oct-2010"); setInstallmentDate("1","27-Oct-2010"); setInstallmentDate("2","04-Nov-2010"); setInstallmentDate("3","10-Nov-2010"); clickValidateAndWaitForPageToLoad(); // principal verifyCellValueOfInstallments(1,3, "248.2"); verifyCellValueOfInstallments(2,3, "249.1"); verifyCellValueOfInstallments(3,3, "250.1"); verifyCellValueOfInstallments(4,3, "252.6"); // interest values verifyCellValueOfInstallments(1,4, "3.8"); verifyCellValueOfInstallments(2,4, "2.9"); verifyCellValueOfInstallments(3,4, "1.9"); verifyCellValueOfInstallments(4,4, "0.9"); } private void verifyCellValueOfInstallments(int row, int column, String value) { String result = selenium.getText("//table[@id='installments']//tbody//tr[" + (row ) + "]/td[" + column + "]"); Assert.assertEquals(result, value, "expected was: " + result + " but was: " + value); } private void setInstallmentTotal(int installment, String total) { selenium.type("installmentAmounts["+ (installment-1) +"]",total); } public CreateLoanAccountReviewInstallmentPage verifyLoanScheduleForDecliningPrincipal() { verifyCellValueOfInstallments(1,3,"332.2"); verifyCellValueOfInstallments(2,3,"333.4"); verifyCellValueOfInstallments(3,3,"334.4"); verifyCellValueOfInstallments(1,4,"3.8"); verifyCellValueOfInstallments(2,4,"2.6"); verifyCellValueOfInstallments(3,4,"1.3"); verifyCellValueOfInstallments(1,6,"336.0"); verifyCellValueOfInstallments(2,6,"336.0"); verifyCellValueOfInstallments(3,6,"335.7"); return this; } public CreateLoanAccountPreviewPage clickPreviewAndGoToReviewLoanAccountPage() { selenium.click(previewButton); selenium.waitForPageToLoad("3000"); return new CreateLoanAccountPreviewPage(selenium); } public void verifySchedulePersistOnEdit(int noOfInstallments, int minGap, int minInstalmentAmount, DateTime disbursalDate, int maxGap) { verifyAllTotalFields(noOfInstallments,String.valueOf(minInstalmentAmount)); verifyAllDatesFields(disbursalDate,maxGap,noOfInstallments, false); verifyCellValueOfInstallments(1,3,"94.5"); verifyCellValueOfInstallments(2,3,"95.1"); verifyCellValueOfInstallments(3,3,"95.6"); verifyCellValueOfInstallments(4,3,"96.5"); verifyCellValueOfInstallments(5,3,"618.2"); verifyCellValueOfInstallments(1,4,"5.5"); verifyCellValueOfInstallments(2,4,"4.9"); verifyCellValueOfInstallments(3,4,"4.4"); verifyCellValueOfInstallments(4,4,"3.5"); verifyCellValueOfInstallments(5,4,"3.3"); } private void verifyAllTotalFields(int noOfInstallments, String installmentAmount) { for (int installment = 0; installment < noOfInstallments-1; installment++) { Assert.assertEquals(selenium.getValue("installmentAmounts[" + installment + "]"), installmentAmount); } } public CreateLoanAccountReviewInstallmentPage verifyRecalculationOfCashFlowOnValidate() { verifyRecalculation(validateButton); verifyRecalculationForForSameMonth(validateButton); return this; } public CreateLoanAccountReviewInstallmentPage verifyWarningThresholdMessageOnValidate(double warningThreshold) { verifyWarningThresholdMessageOnReviewSchedulePage(validateButton,warningThreshold); return this; } public CreateLoanAccountReviewInstallmentPage verifyRecalculationOfCashFlowOnPreview() { verifyRecalculation(previewButton); verifyRecalculationForForSameMonth(previewButton); return this; } public CreateLoanAccountReviewInstallmentPage verifyWarningThresholdMessageOnPreview(double warningThreshold) { verifyWarningThresholdMessageOnReviewSchedulePage(previewButton,warningThreshold); this.verifyPage("CreateLoanPreview"); return this; } public CreateLoanAccountReviewInstallmentPage verifyInstallmentDatesOutOfCashFlowCapturedOnValidate() { verifyErrorMessageOnDatesOutOfCashFlow(validateButton); return this; } public CreateLoanAccountReviewInstallmentPage verifyInstallmentDatesOutOfCashFlowCapturedOnPreview() { verifyErrorMessageOnDatesOutOfCashFlow(previewButton); return this; } public CreateLoanAccountPreviewPage verifyRepaymentCapacityOnPreview(String expectedRc, String minRc) { CreateLoanAccountPreviewPage previewPage = clickPreviewAndNavigateToPreviewPage(); //isTextPresentInPage("Repayment Capacity of the client is " + expectedRc + " % which should be greater than the required value of " + minRc + " %"); return previewPage; } public CreateLoanAccountReviewInstallmentPage clickPreview() { selenium.click(previewButton); waitForPageToLoad(); return this; } public CreateLoanAccountPreviewPage clickPreviewAndNavigateToPreviewPage() { selenium.click(previewButton); waitForPageToLoad(); return new CreateLoanAccountPreviewPage(this.selenium); } public CreateLoanAccountReviewInstallmentPage verifyRepaymentCapacityOnValidate(String expectedRc, String minRc) { clickValidateAndWaitForPageToLoad(); verifyPage("SchedulePreview"); isTextPresentInPage("Repayment Capacity of the client is " + expectedRc + " % which should be greater than the required value of " + minRc + " %"); return this; } public void verifyLoanAmount(String amount) { try { Assert.assertEquals(getLoanAmount(), amount); } catch (AssertionError assertionError) { Assert.assertEquals(getLoanAmount() + ".0", amount); } } public String getLoanAmount() { String loanAmount = ""; try { loanAmount = selenium.getText("//span[@id='schedulepreview.text.loanamount']"); } catch (SeleniumException e) { Assert.fail("cant find span with id: schedulepreview.text.loanamount on page" + selenium.getLocation()); } return loanAmount; } public ClientsAndAccountsHomepage cancel(){ selenium.click("schedulePreview.button.cancel"); waitForPageToLoad(); return new ClientsAndAccountsHomepage(selenium); } public CreateLoanAccountCashFlowPage editCashFlow() { selenium.click("_eventId_editCashflow"); waitForPageToLoad(); return new CreateLoanAccountCashFlowPage(selenium); } public void verifyDueDate(int installement, String dueDate) { Assert.assertEquals(selenium.getText("//table[@id='installments']//tbody//tr[" + (installement ) + "]/td[2]"), dueDate); } private Integer getMonthFromCalendar(){ return monthsMap.get(selenium.getText("//div[@id='ui-datepicker-div']/div/div/span[1]")); } private Integer getYearFromCalendar(){ return Integer.parseInt(selenium.getText("//div[@id='ui-datepicker-div']/div/div/span[2]")); } private void clickNextMonth(){ selenium.click("//div[@id='ui-datepicker-div']/div/a[2]/span"); } private void clickPrevMonth(){ selenium.click("//div[@id='ui-datepicker-div']/div/a[1]/span"); } private void chooseDay(Integer day){ selenium.click("link=" + day); } public String getDueDateForInstallment(Integer installment){ return selenium.getValue("installment.dueDate." + (installment-1)); } public String getTotalForInstallment(Integer installment){ return selenium.getValue("name=installmentAmounts[" + (installment-1) + "]"); } public void setTotalForInstallment(Integer installment, String total){ selenium.type("name=installmentAmounts[" + (installment-1) + "]", total); } public void setDueDateForInstallment(Integer installment, String dueDate){ selenium.type("installment.dueDate." + (installment-1), dueDate); } public String getFeesForInstallment(Integer installment){ return selenium.getValue("//table[@id='installments']/tbody/tr[" + installment + "]/td[5]"); } public String getInterestForInstallment(Integer installment){ return selenium.getValue("//table[@id='installments']/tbody/tr[" + installment + "]/td[4]"); } public void typeInstallmentDueDateByPicker(Integer installment, Calendar dueDate){ selenium.click("//table[@id='installments']/tbody/tr[" + installment + "]/td[2]/img"); Calendar calendar =Calendar.getInstance(); calendar.set(getYearFromCalendar(), getMonthFromCalendar(), dueDate.get(Calendar.DATE)); Integer months = 0; if(calendar.before(dueDate)){ if(calendar.get(Calendar.YEAR)==dueDate.get(Calendar.YEAR)){ months = dueDate.get(Calendar.MONTH)-calendar.get(Calendar.MONTH); }else{ months = dueDate.get(Calendar.YEAR)-calendar.get(Calendar.YEAR)*12+(dueDate.get(Calendar.MONTH)+1)+calendar.get(Calendar.MONTH); } for(int i=0; i<months; i++){ clickNextMonth(); } }else if(calendar.after(dueDate)){ if(calendar.get(Calendar.YEAR)==dueDate.get(Calendar.YEAR)){ months = calendar.get(Calendar.MONTH)-dueDate.get(Calendar.MONTH); }else{ months = calendar.get(Calendar.YEAR)-dueDate.get(Calendar.YEAR)*12+(calendar.get(Calendar.MONTH)+1)+dueDate.get(Calendar.MONTH); } for(int i=0; i<months; i++){ clickPrevMonth(); } } chooseDay(dueDate.get(Calendar.DATE)); Assert.assertEquals(getDueDateForInstallment(installment), format.format(dueDate.getTime())); } public void isDueDatesEditable(Integer noOfIntallments){ for(int i=0;i<noOfIntallments;i++){ Assert.assertTrue(selenium.isEditable("installment.dueDate."+i)); } } public void isTotalsEditable(Integer noOfIntallments){ for(int i=0;i<(noOfIntallments-1);i++){ Assert.assertTrue(selenium.isEditable("name=installmentAmounts["+i+"]")); } Assert.assertFalse(selenium.isEditable("name=installmentAmounts["+(noOfIntallments-1)+"]")); } public List<String> getDueDatesInstallments(Integer noOfIntallments){ List<String> dueDates = new ArrayList<String>(); for(int i=1;i<=noOfIntallments;i++){ dueDates.add(getDueDateForInstallment(i)); } return dueDates; } public List<String> getTotalsInstallments(Integer noOfIntallments){ List<String> totals = new ArrayList<String>(); for(int i=1;i<=noOfIntallments;i++){ totals.add(getTotalForInstallment(i)); } return totals; } }