Java tutorial
/* * 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; } }