All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.tapack.satisfy.steps.webelements.BaseCalendarSteps Maven / Gradle / Ivy

/*
 * Copyright © 2015 Tapack, and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * The Research Projects is dual-licensed under the GNU General Public
 * License, version 2.0 (GPLv2) and the Tapack Commercial License.
 *
 * Solely for non-commercial purposes. A purpose is non-commercial only if
 * it is in no manner primarily intended for or directed toward commercial
 * advantage or private monetary compensation.
 *
 * This Tapack Software is supplied to you by Tapack in consideration of your
 * agreement to the following terms, and your use, installation, modification
 * or redistribution of this Tapack Software constitutes acceptance of these
 * terms. If you do not agree with these terms, please do not use, install,
 * modify or redistribute this Tapack Software.
 *
 * Neither the name, trademarks, service marks or logos of Tapack may be used
 * to endorse or promote products derived from the Tapack Software without
 * specific prior written permission from Tapack.
 *
 * The Tapack Software is provided by Tapack on an "AS IS" basis. TAPACK
 * MAKES NO
 * WARRANTIES, EXPRESS  OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
 * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE, REGARDING THE TAPACK SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
 * COMBINATION WITH YOUR PRODUCTS.
 *
 * IN NO EVENT SHALL TAPACK BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION
 * AND/OR DISTRIBUTION OF THE TAPACK SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER
 * THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR
 * OTHERWISE, EVEN IF TAPACK HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * A copy of the GNU General Public License is included in the distribution in
 * the file LICENSE and at
 *
 *     http://www.gnu.org/licenses/gpl-2.0.html
 *
 * If you are using the Research Projects for commercial purposes, we
 * encourage you to visit
 *
 *     http://products.tapack.io/license
 *
 * for more details.
 *
 * This software or hardware and documentation may provide access to
 * or information on content, products, and services from third parties.
 * Tapack and its affiliates are not responsible for and expressly disclaim
 * all warranties of any kind with respect to third-party content, products,
 * and services. Tapack and its affiliates will not be responsible for any loss,
 * costs, or damages incurred due to your access to or use of third-party
 * content, products, or services. If a third-party content exists, the
 * additional copyright notices and license terms applicable to portions of the
 * software are set forth in the THIRD_PARTY_LICENSE_README file.
 *
 * Please contact Tapack or visit www.tapack.io if you need additional
 * information or have any questions.
 */

package io.tapack.satisfy.steps.webelements;

import io.tapack.satisfy.steps.spi.CalendarSteps;
import io.tapack.satisfy.steps.spi.WebPage;
import io.tapack.satisfy.steps.spi.WebStepsFactory;
import org.junit.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class BaseCalendarSteps implements CalendarSteps {

    public static final String INPUT_TAG_NAME = "input";
    public static final String DATE_FORMAT = "MM/dd/yyyy";
    public static final DateFormat MONTH_DAY_YEAR_FORMAT = new
            SimpleDateFormat(DATE_FORMAT);
    public static final DateFormat MONTH_DAY_YEAR_EXTENDED_FORMAT = new
            SimpleDateFormat("MMMM/dd/yyyy");
    private static final By DATE_PICKER = By.cssSelector(":not(" +
            ".ui-datepicker-inline).ui-datepicker.ui-widget");
    private static final By MONTH = By.cssSelector(".ui-datepicker-month");
    private static final By YEAR = By.cssSelector(".ui-datepicker-year");
    private static final By NEXT_BUTTON = By.cssSelector(".ui-datepicker-next");
    private static final By PREV_BUTTON = By.cssSelector(".ui-datepicker-prev");

    private final By identity;
    private final WebPage webPage;

    private WebElement datePicker;

    public BaseCalendarSteps(By identity) {
        this.identity = identity;
        webPage = WebStepsFactory.getPage();
    }

    @Override
    public void fillDateIntoCalendarField(String date) {
        WebElement calendarInputField = findInputField(identity);
        calendarInputField.clear();
        calendarInputField.sendKeys(date);
    }

    @Override
    public void selectDateFromPicker(String date) {
        openPopupCalendar(identity);
        Calendar expectedCalendar = getExpectedCalendar(date);
        navigateToExpectedMonth(expectedCalendar);
        getDayToSelect(expectedCalendar).click();
    }

    @Override
    public void verifyDateAppearedInCalendarField(String date) {
        Assert.assertEquals(date, findInputField(identity).getAttribute
                ("value"));
    }

    @Override
    public boolean accept(By identity) {
        String cssClasses = webPage.element(identity).getAttribute("class");
        return cssClasses.contains("hasDatepicker") && !cssClasses.contains
                ("ui-widget");
    }

    private WebElement findInputField(By identity) {
        WebElement calendarElement = webPage.element(identity);
        return calendarElement.getTagName().equals(INPUT_TAG_NAME) ?
                calendarElement : calendarElement.findElement(By.tagName
                (INPUT_TAG_NAME));
    }

    private void openPopupCalendar(By identity) {
        webPage.element(identity).click();
        webPage.shouldBeVisible(DATE_PICKER);
        datePicker = webPage.element(DATE_PICKER);
    }

    private Calendar getExpectedCalendar(String dateString) {
        Calendar expectedCalendar = Calendar.getInstance();
        expectedCalendar.setTime(parseDateString(dateString,
                MONTH_DAY_YEAR_FORMAT));
        return expectedCalendar;
    }

    private void navigateToExpectedMonth(Calendar expectedCalendar) {
        Calendar actualCalendar = Calendar.getInstance();
        actualCalendar.setTime(getActualTime());
        do {
            switchMonth(expectedCalendar, actualCalendar);
        } while (isNotMonthAndYearAreEquals(expectedCalendar, actualCalendar));
    }

    private void switchMonth(Calendar expectedCalendar, Calendar
            actualCalendar) {
        if (actualCalendar.after(expectedCalendar)) {
            clickPrevArrow();
        } else if (actualCalendar.before(expectedCalendar)) {
            clickNextArrow();
        }
        actualCalendar.setTime(getActualTime());
    }

    private void clickPrevArrow() {
        datePicker.findElement(PREV_BUTTON).click();
    }

    private void clickNextArrow() {
        datePicker.findElement(NEXT_BUTTON).click();
    }

    private WebElement getDayToSelect(Calendar calendar) {
        return datePicker.findElement(By.xpath("" +
                ".//*[@data-handler='selectDay']/a[text()='" + calendar.get
                (Calendar.DAY_OF_MONTH) + "']"));
    }

    private boolean isNotMonthAndYearAreEquals(Calendar expected, Calendar
            actual) {
        return isNotEqualsFields(expected, actual, Calendar.YEAR) ||
                isNotEqualsFields(expected, actual, Calendar.MONTH);
    }

    private boolean isNotEqualsFields(Calendar expectedCalendar, Calendar
            actualCalendar, int fieldId) {
        return actualCalendar.get(fieldId) != expectedCalendar.get(fieldId);
    }

    private Date getActualTime() {
        return parseDateString(getCurrentDateAsString(),
                MONTH_DAY_YEAR_EXTENDED_FORMAT);
    }

    private Date parseDateString(String dateAsString, DateFormat format) {
        try {
            return format.parse(dateAsString);
        } catch (ParseException e) {
            throw new IllegalArgumentException("Date parsing failed "
                    + dateAsString);
        }
    }

    private String getCurrentDateAsString() {
        return getTextInDatePicker(MONTH) + "/01/" + getTextInDatePicker(YEAR);
    }

    private String getTextInDatePicker(By identity) {
        return datePicker.findElement(identity).getText();
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy