/*
* This program is part of the OpenLMIS logistics management information system platform software.
* Copyright © 2013 VillageReach
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
* You should have received a copy of the GNU Affero General Public License along with this program. If not, see http://www.gnu.org/licenses. For additional information contact info@OpenLMIS.org.
*/
package org.openlmis.pageobjects;
import org.apache.commons.lang.StringUtils;
import org.openlmis.UiUtils.TestWebDriver;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import static com.thoughtworks.selenium.SeleneseTestBase.assertTrue;
import static com.thoughtworks.selenium.SeleneseTestNgHelper.assertEquals;
import static org.openqa.selenium.support.How.ID;
import static org.openqa.selenium.support.How.XPATH;
public class FacilityPage extends Page {
@FindBy(how = ID, using = "searchFacility")
private static WebElement searchFacilityTextField = null;
@FindBy(how = ID, using = "searchIcon")
private static WebElement searchIcon = null;
@FindBy(how = ID, using = "disableButton")
private static WebElement disableButton = null;
@FindBy(how = ID, using = "button_OK")
private static WebElement okButton = null;
@FindBy(how = ID, using = "dialogMessage")
private static WebElement dialogMessageOnAlert = null;
@FindBy(how = ID, using = "saveSuccessMsgDiv")
private static WebElement successMessageDiv = null;
@FindBy(how = ID, using = "saveErrorMsgDiv")
private static WebElement saveErrorMsgDiv = null;
@FindBy(how = XPATH, using = "//ng-switch/span")
private static WebElement enabledFlag = null;
@FindBy(how = ID, using = "facilityActiveFalse")
private static WebElement isActiveRadioNoOption = null;
@FindBy(how = ID, using = "enableButton")
private static WebElement enableButton = null;
@FindBy(how = ID, using = "remove0")
private static WebElement removeSupportedProgram = null;
@FindBy(how = ID, using = "code")
private static WebElement facilityCode = null;
@FindBy(how = ID, using = "name")
private static WebElement facilityName = null;
@FindBy(how = ID, using = "description")
private static WebElement facilityDescription = null;
@FindBy(how = ID, using = "gln")
private static WebElement gln = null;
@FindBy(how = ID, using = "main-phone")
private static WebElement phoneNumber = null;
@FindBy(how = ID, using = "fax-phone")
private static WebElement faxNumber = null;
@FindBy(how = ID, using = "address-1")
private static WebElement address1 = null;
@FindBy(how = ID, using = "address-2")
private static WebElement address2 = null;
@FindBy(how = ID, using = "geographic-zone")
private static WebElement geographicZone = null;
@FindBy(how = ID, using = "facility-type")
private static WebElement facilityType = null;
@FindBy(how = ID, using = "catchment-population")
private static WebElement catchmentPopulation = null;
@FindBy(how = ID, using = "latitude")
private static WebElement latitude = null;
@FindBy(how = ID, using = "longitude")
private static WebElement longitude = null;
@FindBy(how = ID, using = "altitude")
private static WebElement altitude = null;
@FindBy(how = ID, using = "operated-by")
private static WebElement operatedBy = null;
@FindBy(how = ID, using = "cold-storage-gross-capacity")
private static WebElement coldStorageGrossCapacity = null;
@FindBy(how = ID, using = "cold-storage-net-capacity")
private static WebElement coldStorageNetCapacity = null;
@FindBy(how = ID, using = "suppliesOthersYes")
private static WebElement facilitySuppliesOthersYes = null;
@FindBy(how = ID, using = "facilitySdpTrue")
private static WebElement serviceDeliveryPoint = null;
@FindBy(how = ID, using = "hasElectricityTrue")
private static WebElement hasElectricityTrue = null;
@FindBy(how = ID, using = "isOnlineTrue")
private static WebElement isOnlineTrue = null;
@FindBy(how = ID, using = "hasElectronicSccTrue")
private static WebElement hasElectronicSccTrue = null;
@FindBy(how = ID, using = "hasElectronicDARTrue")
private static WebElement hasElectronicDarTrue = null;
@FindBy(how = ID, using = "facilityActiveTrue")
private static WebElement isActiveTrue = null;
@FindBy(how = ID, using = "go-live-date")
private static WebElement goLiveDate = null;
@FindBy(how = ID, using = "go-down-date")
private static WebElement goDownDate = null;
@FindBy(how = ID, using = "comments")
private static WebElement comments = null;
@FindBy(how = ID, using = "programs-supported")
private static WebElement programsSupported = null;
@FindBy(how = ID, using = "supported-program-active")
private static WebElement programsSupportedActiveFlag = null;
@FindBy(how = XPATH, using = "//form[@id='create-facility']/div/div[3]/div/div/table/tbody/tr[1][@class='ng-scope']/td[2]/input")
private static WebElement programsSupportedFirstActiveFlag = null;
@FindBy(how = XPATH, using = "//form/div/div[3]/div/div/table/tbody/tr[1]/td[3]/input")
private static WebElement programsSupportedFirstStartDate = null;
@FindBy(how = ID, using = "supported-program-start-date")
private static WebElement programsSupportedStartDate = null;
@FindBy(how = XPATH, using = "//a[contains(text(),'25')]")
private static WebElement startDateCalender = null;
@FindBy(how = ID, using = "button_OK")
private static WebElement okAlert = null;
@FindBy(how = ID, using = "supported-program-add")
private static WebElement addSupportedProgram = null;
@FindBy(how = ID, using = "saveButton")
public static WebElement saveButton = null;
@FindBy(how = ID, using = "saveSuccessMsgDiv")
private static WebElement saveSuccessMsgDiv = null;
@FindBy(how = XPATH, using = "//a[contains(text(),'25')]")
private static WebElement goLiveDateCalender = null;
@FindBy(how = XPATH, using = "//a[contains(text(),'26')]")
private static WebElement goDownDateCalender = null;
@FindBy(how = ID, using = "addNewFacilityHeader")
private static WebElement facilityHeader = null;
@FindBy(how = ID, using = "edit-facility-header")
private static WebElement editFacilityHeader = null;
@FindBy(how = ID, using = "overrideIsaVACCINES")
private static WebElement modifyIsaValueLink = null;
@FindBy(how = ID, using = "overrideIsaTable")
private static WebElement overrideIsaTable = null;
@FindBy(how = ID, using = "override-isa0")
private static WebElement overrideIsaTextField = null;
@FindBy(how = ID, using = "calculated-isa0")
private static WebElement calculatedIsaTextField = null;
@FindBy(how = ID, using = "override-isa-values-button0")
private static WebElement overrideISAValuesButton = null;
@FindBy(how = ID, using = "isaDoneButton")
private static WebElement doneIsaButton = null;
@FindBy(how = ID, using = "isaCancelButton")
private static WebElement cancelIsaButton = null;
@FindBy(how = ID, using = "remove0")
private static WebElement removeFirstProgramSupportedLink = null;
@FindBy(how = ID, using = "noResultMessage")
private static WebElement noResultMessage = null;
@FindBy(how = ID, using = "nResultsMessage")
private static WebElement nResultsMessage = null;
@FindBy(how = ID, using = "closeButton")
private static WebElement closeButton = null;
@FindBy(how = ID, using = "facilitySearchLabel")
private static WebElement searchFacilityLabel = null;
@FindBy(how = ID, using = "searchOptionButton")
private static WebElement searchOptionButton = null;
@FindBy(how = ID, using = "searchOption1")
private static WebElement searchOption2 = null;
@FindBy(how = ID, using = "nameHeader")
private static WebElement nameHeader = null;
@FindBy(how = ID, using = "codeHeader")
private static WebElement codeHeader = null;
@FindBy(how = ID, using = "geographicZoneHeader")
private static WebElement geographicZoneHeader = null;
@FindBy(how = ID, using = "facilityTypeHeader")
private static WebElement facilityTypeHeader = null;
@FindBy(how = ID, using = "activeHeader")
private static WebElement activeHeader = null;
@FindBy(how = ID, using = "enabledHeader")
private static WebElement enabledHeader = null;
public FacilityPage(TestWebDriver driver) {
super(driver);
PageFactory.initElements(new AjaxElementLocatorFactory(TestWebDriver.getDriver(), 10), this);
testWebDriver.setImplicitWait(10);
}
public String getNewFacilityHeader() {
testWebDriver.waitForElementToAppear(facilityHeader);
return facilityHeader.getText().trim();
}
public String getEditFacilityHeader() {
testWebDriver.waitForElementToAppear(editFacilityHeader);
return editFacilityHeader.getText().trim();
}
public String enterValuesInFacilityAndClickSave(String facilityCodePrefix, String facilityNamePrefix, String program, String geoZone,
String facilityTypeValue, String operatedByValue, String population) {
String date_time = enterValuesInFacility(facilityCodePrefix, facilityNamePrefix, program, geoZone, facilityTypeValue,
operatedByValue, population, false);
saveButton.click();
return date_time;
}
public String enterValuesInFacility(String facilityCodePrefix, String facilityNamePrefix, String program,
String geoZone, String facilityTypeValue, String operatedByValue,
String population, boolean push) {
Date dObj = new Date();
SimpleDateFormat formatter_date_time = new SimpleDateFormat("yyyyMMdd-hhmmss");
String date_time = formatter_date_time.format(dObj);
String facilityCodeText = facilityCodePrefix + date_time;
String facilityNameText = facilityNamePrefix + date_time;
testWebDriver.waitForElementToAppear(facilityCode);
sendKeys(facilityCode, facilityCodeText);
sendKeys(facilityName, facilityNameText);
testWebDriver.selectByVisibleText(operatedBy, operatedByValue);
testWebDriver.clickForRadio(serviceDeliveryPoint);
testWebDriver.clickForRadio(isActiveTrue);
sendKeys(facilityDescription, "Testing description");
sendKeys(gln, "Testing Gln");
sendKeys(phoneNumber, "9711231305");
sendKeys(faxNumber, "9711231305");
sendKeys(address1, "Address1");
sendKeys(address2, "Address2");
testWebDriver.selectByVisibleText(facilityType, facilityTypeValue);
testWebDriver.scrollToElement(geographicZone);
testWebDriver.sleep(500);
testWebDriver.selectByVisibleText(geographicZone, geoZone);
testWebDriver.sleep(500);
goLiveDate.click();
testWebDriver.sleep(500);
goLiveDateCalender.click();
testWebDriver.sleep(500);
goDownDate.click();
testWebDriver.sleep(500);
goDownDateCalender.click();
addProgram(program, push);
testWebDriver.scrollToElement(altitude);
testWebDriver.sleep(500);
sendKeys(catchmentPopulation, population);
sendKeys(latitude, "-555.5555");
sendKeys(longitude, "444.4444");
sendKeys(altitude, "4545.4545");
testWebDriver.scrollToElement(coldStorageGrossCapacity);
testWebDriver.sleep(500);
sendKeys(coldStorageGrossCapacity, "3434.3434");
sendKeys(coldStorageNetCapacity, "3535.3535");
coldStorageNetCapacity.sendKeys(Keys.TAB);
hasElectricityTrue.click();
isOnlineTrue.click();
testWebDriver.handleScrollByPixels(0, 2000);
testWebDriver.sleep(500);
hasElectronicSccTrue.click();
hasElectronicDarTrue.click();
facilitySuppliesOthersYes.click();
sendKeys(comments, "Comments");
return date_time;
}
public void addProgram(String program, boolean push) {
testWebDriver.selectByVisibleText(programsSupported, program);
if (!push) {
programsSupportedActiveFlag.click();
testWebDriver.sleep(500);
programsSupportedStartDate.click();
startDateCalender.click();
testWebDriver.sleep(500);
okAlert.click();
testWebDriver.sleep(500);
}
addSupportedProgram.click();
}
public void activeInactiveFirstProgram() {
programsSupportedFirstActiveFlag.click();
testWebDriver.sleep(500);
programsSupportedStartDate.click();
programsSupportedFirstStartDate.click();
testWebDriver.handleScrollByPixels(0, 1000);
startDateCalender.click();
testWebDriver.sleep(500);
}
public void removeFirstProgram() {
removeFirstProgramSupportedLink.click();
okAlert.click();
}
public void verifyMessageOnFacilityScreen(String facilityName, String status) {
testWebDriver.sleep(500);
String message;
testWebDriver.waitForElementsToAppear(saveSuccessMsgDiv, saveErrorMsgDiv);
if (saveSuccessMsgDiv.isDisplayed()) {
message = testWebDriver.getText(saveSuccessMsgDiv);
} else {
message = testWebDriver.getText(saveErrorMsgDiv);
}
assertEquals(message, String.format("Facility \"%s\" %s successfully. View Here", facilityName, status));
}
public boolean isSuccessMessageDisplayed() {
testWebDriver.waitForElementToAppear(saveSuccessMsgDiv);
return saveSuccessMsgDiv.isDisplayed();
}
public void overrideIsa(String overriddenIsa, int rowNumber) {
modifyIsaValueLink.click();
testWebDriver.waitForElementToAppear(overrideIsaTable);
while (!StringUtils.isEmpty(overrideIsaTable.getAttribute("value")))
overrideIsaTable.sendKeys("\u0008"); // "\u0008" - is backspace char
sendKeys(testWebDriver.getElementById("override-isa" + (rowNumber - 1)), overriddenIsa);
}
public void editPopulation(String population) {
testWebDriver.waitForElementToAppear(catchmentPopulation);
sendKeys(catchmentPopulation, population);
}
public String getCalculatedIsa() {
testWebDriver.waitForElementToAppear(calculatedIsaTextField);
return calculatedIsaTextField.getText();
}
public void clickIsaDoneButton() {
testWebDriver.waitForElementToAppear(doneIsaButton);
doneIsaButton.click();
}
public void clickIsaCancelButton() {
testWebDriver.waitForElementToAppear(cancelIsaButton);
cancelIsaButton.click();
}
public void clickUseCalculatedIsaButton() {
testWebDriver.waitForElementToAppear(overrideISAValuesButton);
overrideISAValuesButton.click();
}
public void verifyOverriddenIsa(String expectedIsa) {
testWebDriver.handleScrollByPixels(0, 1000);
testWebDriver.waitForElementToAppear(modifyIsaValueLink);
modifyIsaValueLink.click();
testWebDriver.waitForElementToAppear(overrideIsaTable);
assertEquals(overrideIsaTextField.getAttribute("value"), expectedIsa);
clickIsaDoneButton();
testWebDriver.sleep(1000);
}
public void saveFacility() {
testWebDriver.waitForElementToAppear(saveButton);
saveButton.click();
}
public void searchFacility(String facilityCodeValue) {
testWebDriver.waitForElementToAppear(searchFacilityTextField);
sendKeys(searchFacilityTextField, facilityCodeValue);
searchIcon.click();
testWebDriver.waitForAjax();
}
public void clickFirstFacilityList() {
WebElement facilityName = testWebDriver.getElementById("name0");
testWebDriver.waitForElementToAppear(facilityName);
facilityName.click();
}
public void disableFacility(String facilityCodeValue, String facilityNameValue) {
String expectedMessageOnAlert = String.format("\"%s\" / \"%s\" will be disabled in the system.", facilityNameValue, facilityCodeValue);
testWebDriver.waitForElementToAppear(editFacilityHeader);
clickDisableButtonOnFacilityScreen();
assertEquals(getDisableAlertMessage(), expectedMessageOnAlert);
clickOkButtonOnAlert();
}
private void clickDisableButtonOnFacilityScreen() {
testWebDriver.waitForElementToAppear(disableButton);
disableButton.click();
}
private void clickOkButtonOnAlert() {
testWebDriver.sleep(1000);
okButton.click();
}
private String getDisableAlertMessage() {
testWebDriver.sleep(1000);
testWebDriver.waitForElementToAppear(dialogMessageOnAlert);
return dialogMessageOnAlert.getText();
}
public void verifyDisabledFacility(String facilityCodeValue, String facilityNameValue) {
String expectedMessageOnFacilityScreenAfterDisable = "\"" + facilityNameValue + "\" / \"" + facilityCodeValue + "\" is now disabled";
testWebDriver.waitForElementToAppear(successMessageDiv);
testWebDriver.sleep(1000);
String disableMessageOnFacilityScreenValue = successMessageDiv.getText();
assertEquals(disableMessageOnFacilityScreenValue, expectedMessageOnFacilityScreenAfterDisable);
String enableValue = enabledFlag.getText();
assertEquals(enableValue.trim(), "No");
assertTrue(isActiveRadioNoOption.isSelected());
}
public String getEnabledFacilityText() {
testWebDriver.sleep(1000);
return enabledFlag.getText();
}
public HomePage enableFacility() {
testWebDriver.waitForElementToAppear(enableButton);
testWebDriver.sleep(1000);
enableButton.click();
testWebDriver.waitForElementToAppear(dialogMessageOnAlert);
testWebDriver.sleep(1000);
okButton.click();
testWebDriver.sleep(1000);
return PageObjectFactory.getHomePage(testWebDriver);
}
public HomePage editFacility(String program, String catchmentPopulationValue, String latitudeValue, String longitudeValue,
String altitudeValue) {
testWebDriver.waitForElementToAppear(disableButton);
testWebDriver.sleep(1500);
testWebDriver.waitForElementToAppear(facilityCode);
sendKeys(catchmentPopulation, catchmentPopulationValue);
sendKeys(latitude, latitudeValue);
sendKeys(longitude, longitudeValue);
sendKeys(altitude, altitudeValue);
testWebDriver.selectByVisibleText(programsSupported, program);
programsSupportedActiveFlag.click();
testWebDriver.sleep(500);
programsSupportedStartDate.click();
startDateCalender.click();
testWebDriver.sleep(500);
okAlert.click();
testWebDriver.sleep(500);
addSupportedProgram.click();
saveButton.click();
return PageObjectFactory.getHomePage(testWebDriver);
}
public void verifyEditedFacility(String catchmentPopulationValue, String latitudeValue, String longitudeValue, String altitudeValue) {
assertEquals(testWebDriver.getAttribute(catchmentPopulation, "value"), catchmentPopulationValue);
assertEquals(testWebDriver.getAttribute(latitude, "value"), latitudeValue);
assertEquals(testWebDriver.getAttribute(longitude, "value"), longitudeValue);
assertEquals(testWebDriver.getAttribute(altitude, "value"), altitudeValue);
assertTrue(removeSupportedProgram.isDisplayed());
}
public HomePage verifyProgramSupported(List<String> programsSupported) {
testWebDriver.waitForElementToAppear(editFacilityHeader);
testWebDriver.sleep(1500);
String program;
for (int i = 0; i < programsSupported.size(); i++) {
program = programsSupported.get(i);
WebElement programsSupportedElement = testWebDriver.getElementByXpath("//table[@class='table table-striped table-bordered']/tbody/tr[" + (i + 1) + "]/td[1]");
WebElement programsActiveElement = testWebDriver.getElementByXpath("//table[@class='table table-striped table-bordered']/tbody/tr[" + (i + 1) + "]/td[2]/input");
assertEquals(programsSupportedElement.getText().trim(), program);
assertTrue("Program " + (i + 1) + " should be active", programsActiveElement.isSelected());
}
assertTrue(removeSupportedProgram.isDisplayed());
return PageObjectFactory.getHomePage(testWebDriver);
}
public void editFacilityType(String facilityTypeValue) {
testWebDriver.waitForElementToAppear(facilityType);
testWebDriver.selectByVisibleText(facilityType, facilityTypeValue);
}
public String getFacilityType() {
testWebDriver.waitForElementToAppear(facilityType);
return testWebDriver.getFirstSelectedOption(facilityType).getText();
}
public void editGeographicZone(String geographicZoneValue) {
testWebDriver.waitForElementToAppear(geographicZone);
testWebDriver.selectByVisibleText(geographicZone, geographicZoneValue);
}
public String getGeographicZone() {
testWebDriver.waitForElementToAppear(geographicZone);
return testWebDriver.getFirstSelectedOption(geographicZone).getText();
}
public String getProgramSupported(int serialNumber) {
testWebDriver.waitForElementToAppear(programsSupported);
return testWebDriver.getElementByXpath("//form[@id='create-facility']/div/div[3]/div/div/table/tbody/tr[" + serialNumber + "]/td[1]").getText();
}
public boolean getProgramSupportedActive(int serialNumber) {
testWebDriver.waitForElementToAppear(programsSupported);
return testWebDriver.getElementByXpath("//form[@id='create-facility']/div/div[3]/div/div/table/tbody/tr[" + serialNumber + "]/td[2]/input").isSelected();
}
public void overrideISA(String overriddenIsa, int productRowNumber, String facilityCode) {
searchFacility(facilityCode);
clickFirstFacilityList();
overrideIsa(overriddenIsa, productRowNumber);
clickIsaDoneButton();
saveFacility();
}
public String getSearchFacilityLabel() {
testWebDriver.waitForElementToAppear(searchFacilityLabel);
return searchFacilityLabel.getText();
}
public String getNResultsMessage() {
testWebDriver.waitForElementToAppear(nResultsMessage);
return nResultsMessage.getText();
}
public String getNoResultMessage() {
testWebDriver.waitForElementToAppear(noResultMessage);
return noResultMessage.getText();
}
public void closeSearchResults() {
testWebDriver.waitForElementToAppear(closeButton);
closeButton.click();
}
public void clickSearchOptionButton() {
testWebDriver.waitForElementToAppear(searchOptionButton);
searchOptionButton.click();
}
public String getSelectedSearchOption() {
testWebDriver.waitForElementToAppear(searchOptionButton);
return searchOptionButton.getText();
}
public void selectGeographicZoneAsSearchOption() {
testWebDriver.waitForElementToAppear(searchOption2);
searchOption2.click();
}
public String getNameHeader() {
testWebDriver.waitForElementToAppear(nameHeader);
return nameHeader.getText();
}
public String getCodeHeader() {
testWebDriver.waitForElementToAppear(codeHeader);
return codeHeader.getText();
}
public String getGeographicZoneHeader() {
testWebDriver.waitForElementToAppear(geographicZoneHeader);
return geographicZoneHeader.getText();
}
public String getTypeHeader() {
testWebDriver.waitForElementToAppear(facilityTypeHeader);
return facilityTypeHeader.getText();
}
public String getEnabledHeader() {
testWebDriver.waitForElementToAppear(enabledHeader);
return enabledHeader.getText();
}
public String getActiveHeader() {
testWebDriver.waitForElementToAppear(activeHeader);
return activeHeader.getText();
}
public String getName(int rowNumber) {
WebElement element = testWebDriver.getElementById("name" + (rowNumber - 1));
testWebDriver.waitForElementToAppear(element);
return element.getText();
}
public String getCode(int rowNumber) {
WebElement element = testWebDriver.getElementById("code" + (rowNumber - 1));
testWebDriver.waitForElementToAppear(element);
return element.getText();
}
public String getGeographicZone(int rowNumber) {
WebElement element = testWebDriver.getElementById("geographicZone" + (rowNumber - 1));
testWebDriver.waitForElementToAppear(element);
return element.getText();
}
public String getFacilityType(int rowNumber) {
WebElement element = testWebDriver.getElementById("type" + (rowNumber - 1));
testWebDriver.waitForElementToAppear(element);
return element.getText();
}
public boolean getIsEnabled(int rowNumber) {
WebElement element = testWebDriver.getElementById("enabledIconOk" + (rowNumber - 1));
return element.isDisplayed();
}
public boolean getIsActive(int rowNumber) {
WebElement element = testWebDriver.getElementById("activeIconOk" + (rowNumber - 1));
return element.isDisplayed();
}
public boolean isNameHeaderPresent() {
return nameHeader.isDisplayed();
}
}