org.openlmis.pageobjects.TemplateConfigPage.java Source code

Java tutorial

Introduction

Here is the source code for org.openlmis.pageobjects.TemplateConfigPage.java

Source

/*
 * 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.openlmis.UiUtils.TestWebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory;
import org.openqa.selenium.support.ui.Select;

import static com.thoughtworks.selenium.SeleneseTestBase.assertFalse;
import static com.thoughtworks.selenium.SeleneseTestBase.assertTrue;
import static com.thoughtworks.selenium.SeleneseTestNgHelper.assertEquals;

public class TemplateConfigPage extends Page {

    @FindBy(how = How.XPATH, using = "//input[@value='Save']")
    private static WebElement SaveButton = null;

    @FindBy(how = How.XPATH, using = "//div[@id='saveSuccessMsgDiv' and @ng-show='message']")
    private static WebElement saveSuccessMsg = null;

    @FindBy(how = How.XPATH, using = "//li[@id='stockInHand']/span[@class='tpl-source']/span/select")
    private static WebElement stockInHandDropDown = null;

    @FindBy(how = How.XPATH, using = "//li[@id='quantityDispensed']/span[@class='tpl-source']/span/select")
    private static WebElement dropDownTotalConsumedQuantity = null;

    @FindBy(how = How.XPATH, using = "//li[@id='reasonForRequestedQuantity']/span[@class='tpl-error']/div")
    private static WebElement requestedQtyExplanationErrorMessage = null;

    @FindBy(how = How.XPATH, using = "//li[@id='quantityRequested']/span[@class='tpl-error']/div")
    private static WebElement requestedQtyErrorMessage = null;

    @FindBy(how = How.XPATH, using = "//li[@id='quantityDispensed']/span[@class='tpl-error']/div")
    private static WebElement totalConsumedQtyErrorMessage = null;

    @FindBy(how = How.XPATH, using = "//li[@id='stockInHand']/span[@class='tpl-error']/div")
    private static WebElement stockOnHandQtyErrorMessage = null;

    @FindBy(how = How.XPATH, using = "//li[@id='productCode']/span[@class='tpl-label']/input")
    private static WebElement productCode = null;

    @FindBy(how = How.XPATH, using = "//li[@id='productCode']/span[@class='tpl-source']/span[2]")
    private static WebElement productCodeSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='product']/span[@class='tpl-label']/input")
    private static WebElement productName = null;

    @FindBy(how = How.XPATH, using = "//li[@id='product']/span[@class='tpl-source']/span[2]")
    private static WebElement productNameSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='dispensingUnit']/span[@class='tpl-label']/input")
    private static WebElement unitOfIssue = null;

    @FindBy(how = How.XPATH, using = "//li[@id='dispensingUnit']/span[@class='tpl-source']/span[2]")
    private static WebElement unitOfIssueSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='beginningBalance']/span[@class='tpl-label']/input")
    private static WebElement beginningBalance = null;

    @FindBy(how = How.XPATH, using = "//li[@id='beginningBalance']/span[@class='tpl-source']/span[2]")
    private static WebElement beginningBalanceSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='quantityReceived']/span[@class='tpl-label']/input")
    private static WebElement totalReceivedQuantity = null;

    @FindBy(how = How.XPATH, using = "//li[@id='quantityReceived']/span[@class='tpl-source']/span[2]")
    private static WebElement totalReceivedQuantitySource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='quantityDispensed']/span[@class='tpl-label']/input")
    private static WebElement totalConsumedQuantity = null;

    @FindBy(how = How.XPATH, using = "//li[@id='quantityDispensed']/span[@class='tpl-source']/span/select/option[@selected='selected']")
    private static WebElement totalConsumedQuantitySource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='quantityDispensed']/span/input")
    private static WebElement totalConsumedQuantityCheckBox = null;

    @FindBy(how = How.XPATH, using = "//li[@id='reasonForRequestedQuantity']/span/input")
    private static WebElement requestedQuantityCheckBox = null;

    @FindBy(how = How.XPATH, using = "//li[@id='expirationDate']/span/input")
    private static WebElement expirationDateCheckBox = null;

    @FindBy(how = How.XPATH, using = "//li[@id='expirationDate']/span[@class='tpl-label']/input")
    private static WebElement expirationDateTextBox = null;

    @FindBy(how = How.XPATH, using = "//li[@id='expirationDate']/span[@class='tpl-source']/span[2]")
    private static WebElement expirationDateSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='quantityRequested']/span/input")
    private static WebElement requestedQuantityExplanationCheckBox = null;

    @FindBy(how = How.XPATH, using = "//li[@id='total']/span/input")
    private static WebElement totalCheckBox = null;

    @FindBy(how = How.XPATH, using = "//li[@id='total']/span[@class='tpl-label']/input")
    private static WebElement totalTextBox = null;

    @FindBy(how = How.XPATH, using = "//li[@id='total']/span[@class='tpl-source']/span[2]")
    private static WebElement totalSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='product']/span/input")
    private static WebElement productNameCheckBox = null;

    @FindBy(how = How.XPATH, using = "//li[@id='lossesAndAdjustments']/span[@class='tpl-label']/input")
    private static WebElement lossesAndAdj = null;

    @FindBy(how = How.XPATH, using = "//li[@id='lossesAndAdjustments']/span[@class='tpl-source']/span[2]")
    private static WebElement lossesAndAdjSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='stockInHand']/span[@class='tpl-label']/input")
    private static WebElement stockOnHand = null;

    @FindBy(how = How.XPATH, using = "//li[@id='stockInHand']/span[@class='tpl-source']/span/select/option[@selected='selected']")
    private static WebElement stockOnHandSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='stockInHand']/span/input")
    private static WebElement stockOnHandCheckBox = null;

    @FindBy(how = How.XPATH, using = "//li[@id='newPatientCount']/span[@class='tpl-label']/input")
    private static WebElement newPatients = null;

    @FindBy(how = How.XPATH, using = "//li[@id='newPatientCount']/span[@class='tpl-source']/span[2]")
    private static WebElement newPatientsSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='stockOutDays']/span[@class='tpl-label']/input")
    private static WebElement stockOutDays = null;

    @FindBy(how = How.XPATH, using = "//li[@id='stockOutDays']/span[@class='tpl-source']/span[2]")
    private static WebElement stockOutDaysSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='normalizedConsumption']/span[@class='tpl-label']/input")
    private static WebElement adjustedTotalConsumption = null;

    @FindBy(how = How.XPATH, using = "//li[@id='normalizedConsumption']/span[@class='tpl-source']/span[2]")
    private static WebElement adjustedTotalConsumptionSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='maxStockQuantity']/span[@class='tpl-label']/input")
    private static WebElement maxStockQuantity = null;

    @FindBy(how = How.XPATH, using = "//li[@id='maxStockQuantity']/span[@class='tpl-source']/span[2]")
    private static WebElement maxStockQuantitySource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='calculatedOrderQuantity']/span[@class='tpl-label']/input")
    private static WebElement calculatedOrderQuantity = null;

    @FindBy(how = How.XPATH, using = "//li[@id='calculatedOrderQuantity']/span[@class='tpl-source']/span[2]")
    private static WebElement calculatedOrderQuantitySource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='quantityRequested']/span[@class='tpl-label']/input")
    private static WebElement requestedQuantity = null;

    @FindBy(how = How.XPATH, using = "//li[@id='quantityRequested']/span[@class='tpl-source']/span[2]")
    private static WebElement requestedQuantitySource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='reasonForRequestedQuantity']/span[@class='tpl-label']/input")
    private static WebElement requestedQuantityExplanation = null;

    @FindBy(how = How.XPATH, using = "//li[@id='reasonForRequestedQuantity']/span[@class='tpl-source']/span[2]")
    private static WebElement requestedQuantityExplanationSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='packsToShip']/span[@class='tpl-label']/input")
    private static WebElement packsToShip = null;

    @FindBy(how = How.XPATH, using = "//li[@id='packsToShip']/span[@class='tpl-source']/span[2]")
    private static WebElement packsToShipSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='price']/span[@class='tpl-label']/input")
    private static WebElement pricePerPack = null;

    @FindBy(how = How.XPATH, using = "//li[@id='price']/span[@class='tpl-source']/span[2]")
    private static WebElement pricePerPackSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='cost']/span[@class='tpl-label']/input")
    private static WebElement totalCost = null;

    @FindBy(how = How.XPATH, using = "//li[@id='cost']/span[@class='tpl-source']/span[2]")
    private static WebElement totalCostSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='remarks']/span[@class='tpl-label']/input")
    private static WebElement remarks = null;

    @FindBy(how = How.XPATH, using = "//li[@id='remarks']/span[@class='tpl-source']/span[2]")
    private static WebElement remarksSource = null;

    @FindBy(how = How.XPATH, using = "//li[@id='quantityApproved']/span[@class='tpl-label']/input")
    private static WebElement approvedQuantity = null;

    @FindBy(how = How.XPATH, using = "//li[@id='quantityApproved']/span[@class='tpl-source']/span[2]")
    private static WebElement approvedQuantitySource = null;

    @FindBy(how = How.XPATH, using = "//a[contains(text(),'Turn OFF')]")
    private static WebElement turnOffButton = null;

    @FindBy(how = How.XPATH, using = "//a[contains(text(),'Turn ON')]")
    private static WebElement turnOnButton = null;

    @FindBy(how = How.XPATH, using = "//div[@ng-show='arithmeticValidationMessageShown']/div/div/strong")
    private static WebElement OffOnIndicator = null;

    @FindBy(how = How.XPATH, using = "//div[@id='saveErrorMsgDiv']")
    private static WebElement errorMessageDiv = null;

    @FindBy(how = How.XPATH, using = "//li[@id='skipped']/span[1]/input")
    private static WebElement skipCheckBox = null;

    @FindBy(how = How.XPATH, using = "//li[@id='skipped']/span[3]/input")
    private static WebElement skipTextBox = null;

    @FindBy(how = How.XPATH, using = "//*[@id='newPatientCount']/span[5]/span/select/option[1]")
    private static WebElement patientOption1 = null;

    @FindBy(how = How.XPATH, using = "//*[@id='newPatientCount']/span[5]/span/select/option[2]")
    private static WebElement patientOption2 = null;

    private static String USER_INPUT = "User Input";
    private static String CALCULATED = "Calculated";

    public TemplateConfigPage(TestWebDriver driver) {
        super(driver);
        PageFactory.initElements(new AjaxElementLocatorFactory(TestWebDriver.getDriver(), 10), this);
        testWebDriver.setImplicitWait(10);
    }

    public void verifySourceForTotalConsumedQuantity(String optionToBeVerified) {
        Select select = new Select(dropDownTotalConsumedQuantity);
        assertEquals(select.getFirstSelectedOption().getText(), optionToBeVerified);
    }

    public void verifySourceForStockOnHand(String optionToBeVerified) {
        Select select = new Select(stockInHandDropDown);
        assertEquals(select.getFirstSelectedOption().getText(), optionToBeVerified);
    }

    public void clickTotalConsumedQuantity() {
        clickCheckBox(totalConsumedQuantityCheckBox);
    }

    public void unClickTotalConsumedQuantity() {
        unClickCheckBox(totalConsumedQuantityCheckBox);
    }

    public void clickRequestedQuantity() {
        clickCheckBox(requestedQuantityCheckBox);
    }

    public void unClickRequestedQuantity() {
        unClickCheckBox(requestedQuantityCheckBox);
    }

    public void clickRequestedQuantityExplanation() {
        clickCheckBox(requestedQuantityExplanationCheckBox);
    }

    public void unClickRequestedQuantityExplanation() {
        unClickCheckBox(requestedQuantityExplanationCheckBox);
    }

    public void unClickExpirationDate() {
        unClickCheckBox(expirationDateCheckBox);
    }

    public void unClickTotal() {
        unClickCheckBox(totalCheckBox);
    }

    public void clickStockOnHand() {
        clickCheckBox(stockOnHandCheckBox);
    }

    public void unClickStockOnHand() {
        unClickCheckBox(stockOnHandCheckBox);
    }

    public void selectFromTotalConsumedQuantityDropDown(String optionToBeSelected) {
        testWebDriver.waitForElementToAppear(dropDownTotalConsumedQuantity);
        testWebDriver.selectByVisibleText(dropDownTotalConsumedQuantity, optionToBeSelected);
        testWebDriver.sleep(100);
    }

    public void selectFromStockOnHandDropDown(String optionToBeSelected) {
        testWebDriver.waitForElementToAppear(stockInHandDropDown);
        testWebDriver.selectByVisibleText(stockInHandDropDown, optionToBeSelected);
        testWebDriver.sleep(100);
    }

    public HomePage clickSaveButton() {
        testWebDriver.waitForElementToAppear(SaveButton);
        SaveButton.click();
        testWebDriver.sleep(100);
        return PageObjectFactory.getHomePage(testWebDriver);
    }

    public void verifyErrorMessageDivTotalConsumedQuantity(String totalConsumedQuantityError) {
        testWebDriver.waitForElementToAppear(totalConsumedQtyErrorMessage);
        assertTrue("Error message not displaying", totalConsumedQtyErrorMessage.isDisplayed());
        assertTrue("Error message saying '" + totalConsumedQuantityError + "' not displaying",
                totalConsumedQtyErrorMessage.getText().equals(totalConsumedQuantityError));
    }

    public void verifyErrorMessageDivStockOnHand(String stockOnHandError) {
        testWebDriver.waitForElementToAppear(stockOnHandQtyErrorMessage);
        assertTrue("Error message not displaying", stockOnHandQtyErrorMessage.isDisplayed());
        assertTrue("Error message saying '" + stockOnHandError + "' not displaying",
                stockOnHandQtyErrorMessage.getText().equals(stockOnHandError));
    }

    public void verifyErrorMessageDivRequestedQuantity(String requestedQuantityError) {
        testWebDriver.waitForElementToAppear(requestedQtyErrorMessage);
        assertTrue("Error message not displaying", requestedQtyErrorMessage.isDisplayed());
        assertTrue("Error message saying '" + requestedQuantityError + "' not displaying",
                requestedQtyErrorMessage.getText().equals(requestedQuantityError));
    }

    public void verifyErrorMessageRequestedQuantityExplanation(String requestedQuantityExplanation) {
        testWebDriver.waitForElementToAppear(requestedQtyExplanationErrorMessage);
        assertTrue("Error message not displaying", requestedQtyExplanationErrorMessage.isDisplayed());
        assertTrue("Error message saying '" + requestedQuantityExplanation + "' not displaying",
                requestedQtyExplanationErrorMessage.getText().equals(requestedQuantityExplanation));
    }

    public void verifyErrorMessageDivFooter() {
        testWebDriver.waitForElementToAppear(errorMessageDiv);
        assertTrue("Error message not displaying", errorMessageDiv.isDisplayed());
        String footerErrorMessage = "There are some errors in the form. Please resolve them.";
        assertTrue("Error message saying '" + footerErrorMessage + "' not displaying",
                errorMessageDiv.getText().equalsIgnoreCase(footerErrorMessage));
    }

    public void verifyTurnOffOnButtonAvailable(String messageToShow) {
        testWebDriver.waitForElementToAppear(turnOffButton);
        assertTrue(messageToShow, turnOffButton.isDisplayed());
    }

    public void verifyTurnOffOnButtonNotAvailable(String messageToShow) {
        testWebDriver.sleep(100);
        assertFalse(messageToShow, turnOffButton.isDisplayed());
    }

    public void clickTurnOffOnButton(WebElement button) {
        testWebDriver.waitForElementToAppear(button);
        button.click();
        testWebDriver.sleep(100);
    }

    public void verifyTextOffOnButton(WebElement button, String textToVerify, String messageToShow) {
        testWebDriver.waitForElementToAppear(button);
        assertTrue(messageToShow, button.getText().equalsIgnoreCase(textToVerify));
    }

    public void verifyONOffIndicatorOnScreen(WebElement indicator, String textToVerify) {
        testWebDriver.waitForElementToAppear(indicator);
        assertEquals(textToVerify, indicator.getText().trim());
    }

    public void verifySaveSuccessDiv() {
        testWebDriver.waitForElementToAppear(saveSuccessMsg);
        assertTrue("Success message should display", saveSuccessMsg.isDisplayed());
    }

    private void verifyCAndEUserInputsAndShouldBeDisplayed() {
        testWebDriver.waitForElementToAppear(SaveButton);
        unClickTotalConsumedQuantity();
        unClickStockOnHand();
        selectFromTotalConsumedQuantityDropDown(USER_INPUT);
        selectFromStockOnHandDropDown(USER_INPUT);
        clickSaveButton();
        verifyErrorMessageDivFooter();
        verifyErrorMessageDivTotalConsumedQuantity(
                "If 'Total Consumed Quantity' is user input then it should be visible");
        verifyErrorMessageDivStockOnHand("If 'Stock on Hand' is user input then it should be visible");
    }

    private void verifyArithmeticValidationOnOff() {
        clickTotalConsumedQuantity();
        clickStockOnHand();
        selectFromTotalConsumedQuantityDropDown(USER_INPUT);
        verifyTurnOffOnButtonAvailable("Option to choose to switch Arithmetic Validation ON/OFF is not available");
        clickTurnOffOnButton(turnOffButton);

        verifyTextOffOnButton(turnOnButton, "Turn On", "Should show 'Turn ON' on button");
        verifyONOffIndicatorOnScreen(OffOnIndicator, "OFF");
        clickTurnOffOnButton(turnOnButton);

        verifyTextOffOnButton(turnOffButton, "Turn OFF", "Should show 'Turn OFF' on button");
        verifyONOffIndicatorOnScreen(OffOnIndicator, "ON");
        selectFromStockOnHandDropDown(CALCULATED);
        verifyTurnOffOnButtonNotAvailable(
                "Option to choose to switch Arithmetic Validation ON/OFF should not be visible");
    }

    private void verifyCDerivedEMustViceVersa(String program) {
        selectFromTotalConsumedQuantityDropDown(CALCULATED);
        selectFromStockOnHandDropDown(USER_INPUT);
        unClickStockOnHand();
        clickSaveButton();
        verifyErrorMessageDivFooter();
        verifyErrorMessageDivTotalConsumedQuantity(
                "User needs to enter 'Stock on Hand' to calculate 'Total Consumed Quantity'");
        verifyErrorMessageDivStockOnHand("If 'Stock on Hand' is user input then it should be visible");

        clickStockOnHand();
        selectFromTotalConsumedQuantityDropDown(USER_INPUT);
        selectFromStockOnHandDropDown(CALCULATED);
        HomePage homePage = clickSaveButton();
        verifySaveSuccessDiv();
        homePage.selectProgramToConfigTemplate(program);
        unClickTotalConsumedQuantity();
        clickSaveButton();

        verifyErrorMessageDivFooter();
        verifyErrorMessageDivStockOnHand(
                "User needs to enter 'Total Consumed Quantity' to calculate 'Stock on Hand'");
        verifyErrorMessageDivTotalConsumedQuantity(
                "If 'Total Consumed Quantity' is user input then it should be visible");
    }

    public void verifyArithmeticValidations(String program) {
        verifyCAndEUserInputsAndShouldBeDisplayed();
        verifyArithmeticValidationOnOff();
        verifyCDerivedEMustViceVersa(program);
    }

    private void prepareDataForBusinessRuleCE() {
        clickTotalConsumedQuantity();
        clickStockOnHand();
        selectFromTotalConsumedQuantityDropDown(CALCULATED);
        selectFromStockOnHandDropDown(CALCULATED);
        clickSaveButton();
    }

    private void verifyBusinessRuleCE() {
        String independentFieldsCalculatedError = "Interdependent fields ('Total Consumed Quantity', 'Stock on Hand') cannot be of type Calculated at the same time";
        verifyErrorMessageDivStockOnHand(independentFieldsCalculatedError);
        verifyErrorMessageDivTotalConsumedQuantity(independentFieldsCalculatedError);
        verifyErrorMessageDivFooter();
    }

    private void prepareDataForBusinessRuleWJ() {
        clickRequestedQuantity();
        unClickRequestedQuantityExplanation();
        clickSaveButton();
    }

    private void prepareDataForBusinessRuleJW() {
        unClickRequestedQuantity();
        clickRequestedQuantityExplanation();
        clickSaveButton();
    }

    private void verifyBusinessRuleJW() {
        verifyErrorMessageDivRequestedQuantity(
                "If 'Requested Quantity' is displayed, then 'Requested Quantity Explanation' must also be displayed");
        verifyErrorMessageDivFooter();
    }

    private void verifyBusinessRuleWJ() {
        verifyErrorMessageRequestedQuantityExplanation(
                "If 'Requested Quantity Explanation' is displayed, then 'Requested Quantity' must also be displayed");
        verifyErrorMessageDivFooter();
    }

    public void verifyBusinessRules() {
        prepareDataForBusinessRuleCE();
        verifyBusinessRuleCE();
        prepareDataForBusinessRuleWJ();
        verifyBusinessRuleWJ();
        prepareDataForBusinessRuleJW();
        verifyBusinessRuleJW();
    }

    public void verifyColumnLabels() {
        testWebDriver.waitForElementToAppear(SaveButton);
        assertTrue("product code is not showing up", productCode.isDisplayed());
        assertTrue("product name is not showing up", productName.isDisplayed());
        assertTrue("unit of issue is not showing up", unitOfIssue.isDisplayed());
        assertTrue("beginning balance is not showing up", beginningBalance.isDisplayed());
        assertTrue("totalReceivedQuantity is not showing up", totalReceivedQuantity.isDisplayed());
        assertTrue("totalConsumedQuantity is not showing up", totalConsumedQuantity.isDisplayed());
        assertTrue("lossesAndAdj is not showing up", lossesAndAdj.isDisplayed());
        assertTrue("stockOnHand is not showing up", stockOnHand.isDisplayed());
        assertTrue("newPatients is not showing up", newPatients.isDisplayed());
        assertTrue("stockOutDays is not showing up", stockOutDays.isDisplayed());
        assertTrue("adjustedTotalConsumption is not showing up", adjustedTotalConsumption.isDisplayed());
        assertTrue("maxStockQuantity is not showing up", maxStockQuantity.isDisplayed());
        assertTrue("calculatedOrderQuantity is not showing up", calculatedOrderQuantity.isDisplayed());
        assertTrue("requestedQuantity is not showing up", requestedQuantity.isDisplayed());
        assertTrue("requestedQuantityExplanation is not showing up", requestedQuantityExplanation.isDisplayed());
        assertTrue("packsToShip is not showing up", packsToShip.isDisplayed());
        assertTrue("pricePerPack is not showing up", pricePerPack.isDisplayed());
        assertTrue("totalCost is not showing up", totalCost.isDisplayed());
        assertTrue("remarks is not showing up", remarks.isDisplayed());
        assertTrue("approvedQuantity is not showing up", approvedQuantity.isDisplayed());
        assertTrue("Expiration Date is not showing up", expirationDateTextBox.isDisplayed());
        assertTrue("Total is not showing up", totalTextBox.isDisplayed());
    }

    public void verifyColumnSource() {
        String REFERENCE_DATA = "Reference Data";
        testWebDriver.waitForElementToAppear(SaveButton);
        assertEquals(productCodeSource.getText().trim(), REFERENCE_DATA);
        assertEquals(productNameSource.getText().trim(), REFERENCE_DATA);
        assertEquals(unitOfIssueSource.getText().trim(), REFERENCE_DATA);
        assertEquals(beginningBalanceSource.getText().trim(), USER_INPUT);
        assertEquals(totalReceivedQuantitySource.getText().trim(), USER_INPUT);
        assertEquals(totalConsumedQuantitySource.getText().trim(), USER_INPUT);
        assertEquals(lossesAndAdjSource.getText().trim(), USER_INPUT);
        assertEquals(stockOnHandSource.getText().trim(), USER_INPUT);
        assertEquals(newPatientsSource.getText().trim(), USER_INPUT);
        assertEquals(stockOutDaysSource.getText().trim(), USER_INPUT);
        assertEquals(adjustedTotalConsumptionSource.getText().trim(), CALCULATED);
        assertEquals(maxStockQuantitySource.getText().trim(), CALCULATED);
        assertEquals(calculatedOrderQuantitySource.getText().trim(), CALCULATED);
        assertEquals(requestedQuantitySource.getText().trim(), USER_INPUT);
        assertEquals(requestedQuantityExplanationSource.getText().trim(), USER_INPUT);
        assertEquals(packsToShipSource.getText().trim(), CALCULATED);
        assertEquals(pricePerPackSource.getText().trim(), REFERENCE_DATA);
        assertEquals(totalCostSource.getText().trim(), CALCULATED);
        assertEquals(remarksSource.getText().trim(), USER_INPUT);
        assertEquals(approvedQuantitySource.getText().trim(), USER_INPUT);
        assertEquals(expirationDateSource.getText().trim(), USER_INPUT);
        assertEquals(totalSource.getText().trim(), CALCULATED);
    }

    private void verifyMandatoryColumnsEditable(WebElement mandatoryElement) {
        testWebDriver.waitForElementToAppear(mandatoryElement);
        assertTrue("Mandatory columns should be non-editable",
                mandatoryElement.getAttribute("disabled").trim().equalsIgnoreCase("true"));
    }

    public void verifyMandatoryColumns() {
        verifyMandatoryColumnsEditable(productNameCheckBox);
    }

    public void configureTemplate() {
        testWebDriver.waitForElementToAppear(SaveButton);
        verifySourceForTotalConsumedQuantity(USER_INPUT);
        verifySourceForStockOnHand(USER_INPUT);
        testWebDriver.selectByVisibleText(stockInHandDropDown, CALCULATED);
        testWebDriver.sleep(1500);
        SaveButton.click();
        testWebDriver.sleep(2000);
        verifySuccessDiv();
    }

    public void alterBeginningBalanceLabel(String columnHeadingToBeAltered) {
        testWebDriver.waitForElementToAppear(SaveButton);
        beginningBalance.clear();
        beginningBalance.sendKeys(columnHeadingToBeAltered);
    }

    public void saveConfiguration() {
        clickSaveButton();
        verifySuccessDiv();
    }

    private void verifySuccessDiv() {
        String saveSuccessfullyMessage = "Template saved successfully!";
        assertTrue("'" + saveSuccessfullyMessage + "' div not showing up", saveSuccessMsg.isDisplayed());
        assertTrue("'" + saveSuccessfullyMessage + "' not showing up",
                saveSuccessMsg.getText().equals(saveSuccessfullyMessage));
    }

    private void clickCheckBox(WebElement chkBox) {
        testWebDriver.waitForElementToAppear(chkBox);
        if (!chkBox.isSelected())
            chkBox.click();
        testWebDriver.sleep(100);
    }

    private void unClickCheckBox(WebElement chkBox) {
        testWebDriver.waitForElementToAppear(chkBox);
        if (chkBox.isSelected())
            chkBox.click();
        testWebDriver.sleep(100);
    }

    public void checkSkip() {
        clickCheckBox(skipCheckBox);
    }

    public void setSkipTextBox(String text) {
        sendKeys(skipTextBox, text);
    }

    public boolean isPatientOption1Selected() {
        testWebDriver.waitForElementToAppear(patientOption1);
        return patientOption1.isSelected();
    }

    public boolean isPatientOption2Selected() {
        testWebDriver.waitForElementToAppear(patientOption2);
        return patientOption2.isSelected();
    }

    public void selectPatientOption2() {
        testWebDriver.sleep(1000);
        testWebDriver.waitForElementToAppear(patientOption2);
        patientOption2.click();
        testWebDriver.sleep(2000);
        assertTrue(isPatientOption2Selected());
    }
}