org.eclipse.che.selenium.pageobject.PullRequestPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.che.selenium.pageobject.PullRequestPanel.java

Source

/*
 * Copyright (c) 2012-2018 Red Hat, Inc.
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *   Red Hat, Inc. - initial API and implementation
 */
package org.eclipse.che.selenium.pageobject;

import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.eclipse.che.selenium.core.constant.TestTimeoutsConstants.ATTACHING_ELEM_TO_DOM_SEC;
import static org.eclipse.che.selenium.core.constant.TestTimeoutsConstants.ELEMENT_TIMEOUT_SEC;
import static org.eclipse.che.selenium.core.constant.TestTimeoutsConstants.WIDGET_TIMEOUT_SEC;
import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOfElementLocated;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.selenium.core.SeleniumWebDriver;
import org.eclipse.che.selenium.core.webdriver.SeleniumWebDriverHelper;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;

/**
 * @author Andrey chzhikov
 * @author Aleksandr Shmaraiev
 */
@Singleton
public class PullRequestPanel {

    private final SeleniumWebDriverHelper seleniumWebDriverHelper;
    private final SeleniumWebDriver seleniumWebDriver;

    @Inject
    private Loader loader;

    @Inject
    public PullRequestPanel(SeleniumWebDriver seleniumWebDriver, SeleniumWebDriverHelper seleniumWebDriverHelper,
            SeleniumWebDriver seleniumWebDriver1) {
        this.seleniumWebDriverHelper = seleniumWebDriverHelper;
        this.seleniumWebDriver = seleniumWebDriver1;
        PageFactory.initElements(seleniumWebDriver, this);
    }

    private static final class PullRequestLocators {
        static final String PANEL = "gwt-debug-toolPanel";
        static final String SELECT_BRANCH = "//div[text()='Branch name:']/following-sibling::div/div";
        static final String TITLE_INPUT = "//div[text()='Title:']/following::input";
        static final String COMMENT_TEXTAREA = "//div[text()='Comment:']/following::textarea";
        static final String UPDATE_PR_BTN = "//button[text()='Update PR']";
        static final String CREATE_PR_BTN = "//button[text()='Create PR']";
        static final String OPEN_GITHUB_BTN = "//button[text()='Open on GitHub']";
        static final String PULL_REQUEST_BTN = "gwt-debug-partButton-Pull Request";
        static final String BRANCH_NAME = "//div[text()='Branch name:']/following-sibling::div//span/label[text()='%s']";
        static final String REFRESH_BRANCH_BUTTON = "gwt-debug-refreshContributionBranchButton";
        static final String OK_COMMIT_BTN = "commit-dialog-ok";
        static final String STATUS_OK = "//div[text()='%s']/parent::div//i[@class='fa fa-check']";
        static final String MESSAGE = "gwt-debug-statusSectionMessage";
        static final String PROJECT_ITEM = "//div[text()='Repository']/parent::div//i[contains(@class,'fa-bookmark')]/following-sibling::div[text()='%s']";
        static final String BRANCH_ITEM = "//div[text()='Repository']/parent::div//i[contains(@class,'fa-code-fork')]/following-sibling::div[text()='%s']";
        static final String URL_ITEM = "//div[text()='Repository']/parent::div//i[contains(@class,'fa-link')]/following-sibling::a[@href='%s']";
        static final String MENU_BUTTON_XPATH = "(//div[@id='gwt-debug-menuButton'])[position()=2]";
        static final String CONTEXT_HIDE_BUTTON_ID = "gwt-debug-contextMenu/Hide";
        static final String HIDE_BUTTON_XPATH = "(//div[@id='gwt-debug-hideButton'])[position()=2]";

        private PullRequestLocators() {
        }
    }

    public enum Status {
        BRANCH_PUSHED_ON_YOUR_ORIGIN("Branch pushed on your origin"), PULL_REQUEST_ISSUED(
                "Pull request issued"), NEW_COMMITS_PUSHED("New commits pushed"), PULL_REQUEST_UPDATED(
                        "Pull request updated"), FORK_CREATED(
                                "Fork created"), BRANCH_PUSHED_ON_YOUR_FORK("Branch pushed on your fork");

        private final String message;

        Status(String message) {
            this.message = message;
        }

        public String getMessage() {
            return message;
        }
    }

    @FindBy(id = PullRequestLocators.PANEL)
    WebElement panel;

    @FindBy(xpath = PullRequestLocators.SELECT_BRANCH)
    WebElement selectBranch;

    @FindBy(xpath = PullRequestLocators.TITLE_INPUT)
    WebElement titleInput;

    @FindBy(xpath = PullRequestLocators.COMMENT_TEXTAREA)
    WebElement commentTextarea;

    @FindBy(xpath = PullRequestLocators.CREATE_PR_BTN)
    WebElement createPRBtn;

    @FindBy(xpath = PullRequestLocators.UPDATE_PR_BTN)
    WebElement updatePRBtn;

    @FindBy(id = PullRequestLocators.PULL_REQUEST_BTN)
    WebElement pullRequestBtn;

    @FindBy(id = PullRequestLocators.OK_COMMIT_BTN)
    WebElement okCommitBtn;

    @FindBy(xpath = PullRequestLocators.HIDE_BUTTON_XPATH)
    WebElement hideButton;

    @FindBy(xpath = PullRequestLocators.MENU_BUTTON_XPATH)
    WebElement menuButton;

    @FindBy(id = PullRequestLocators.CONTEXT_HIDE_BUTTON_ID)
    WebElement contextHideButton;

    @FindBy(id = PullRequestLocators.REFRESH_BRANCH_BUTTON)
    WebElement refreshBranchListButton;

    /** Wait that 'Pull Request' panel is open */
    public void waitOpenPanel() {
        seleniumWebDriverHelper.waitVisibility(panel);
    }

    /** Wait that 'Pull Request' panel is close */
    public void waitClosePanel() {
        seleniumWebDriverHelper.waitInvisibility(By.xpath(PullRequestLocators.PANEL));
    }

    /**
     * Wait text in the PR panel if a project does not provide VCS
     *
     * @param expText expected text which should be in the PR panel
     */
    public void waitTextNotVcsProject(String expText) {
        seleniumWebDriverHelper.waitTextEqualsTo(panel, expText);
    }

    /**
     * Fill the 'Title:' on the 'Pull Request' panel
     *
     * @param title text of title
     */
    public void enterTitle(String title) {
        seleniumWebDriverHelper.waitAndSendKeysTo(titleInput, title);
    }

    /**
     * Fill the 'Comment:' on the 'Pull Request' panel
     *
     * @param comment text of comment
     */
    public void enterComment(String comment) {
        seleniumWebDriverHelper.waitAndSendKeysTo(commentTextarea, comment);
    }

    /** Click 'Create PR' button on the 'Pull Request' panel */
    public void clickCreatePullRequestButton() {
        seleniumWebDriverHelper.waitAndClick(createPRBtn);
    }

    /** Click 'Update PR' button on the 'Pull Request' panel */
    public void clickUpdatePullRequestButton() {
        seleniumWebDriverHelper.waitAndClick(updatePRBtn, ELEMENT_TIMEOUT_SEC);
    }

    /** Click 'Pull Request' button on right panel in the IDE */
    public void clickPullRequestBtn() {
        seleniumWebDriverHelper.waitAndClick(pullRequestBtn, ELEMENT_TIMEOUT_SEC);
    }

    /**
     * Select branch on the 'Pull Request' panel
     *
     * @param branchName name of branch
     */
    public void selectBranch(String branchName) {
        seleniumWebDriverHelper.waitAndClick(selectBranch);
        seleniumWebDriverHelper.waitAndClick(By.xpath(String.format(PullRequestLocators.BRANCH_NAME, branchName)));
    }

    /** Click 'refresh branch list' button on the 'Pull Request' panel */
    public void clickRefreshBranchListButton() {
        seleniumWebDriverHelper.waitAndClick(refreshBranchListButton);
    }

    /** Click 'Ok' button in the 'Commit your changes' window */
    public void clickOkCommitBtn() {
        seleniumWebDriverHelper.waitAndClick(okCommitBtn);
    }

    /** Wait status is 'Ok' in the 'Pull Request' panel */
    public void waitStatusOk(Status status) {
        seleniumWebDriverHelper.waitVisibility(
                By.xpath(String.format(PullRequestLocators.STATUS_OK, status.getMessage())), WIDGET_TIMEOUT_SEC);
        loader.waitOnClosed();
    }

    /**
     * Wait message in the 'Pull Request' panel
     *
     * @param message text of message
     */
    public void waitMessage(String message) {
        seleniumWebDriverHelper.waitTextEqualsTo(By.id(PullRequestLocators.MESSAGE), message);
    }

    /**
     * Wait project name in repository area on the 'Pull Request' panel
     *
     * @param project name of current project
     */
    public void waitProjectName(String project) {
        seleniumWebDriverHelper.waitVisibility(By.xpath(String.format(PullRequestLocators.PROJECT_ITEM, project)));
    }

    /**
     * Wait branch name in repository area on the 'Pull Request' panel
     *
     * @param branch name of branch
     */
    public void waitBranchName(String branch) {
        seleniumWebDriverHelper.waitVisibility(By.xpath(String.format(PullRequestLocators.BRANCH_ITEM, branch)));
    }

    /**
     * Wait branch name in repository area on the 'Pull Request' panel
     *
     * @param url URL of current project
     */
    public void waitRepoUrl(String url) {
        seleniumWebDriverHelper.waitVisibility(By.xpath(String.format(PullRequestLocators.URL_ITEM, url)));
    }

    public void openPullRequestOnGitHub() {
        Wait<WebDriver> wait = new FluentWait(seleniumWebDriver).withTimeout(ATTACHING_ELEM_TO_DOM_SEC, SECONDS)
                .pollingEvery(500, MILLISECONDS).ignoring(WebDriverException.class);
        wait.until(visibilityOfElementLocated(By.xpath(PullRequestLocators.OPEN_GITHUB_BTN))).click();
    }

    /** click on the 'Hide' button */
    public void closePanelByHideButton() {
        seleniumWebDriverHelper.waitAndClick(hideButton);
        waitClosePanel();
    }

    /** open the menu 'Options' */
    public void openOptionsMenu() {
        seleniumWebDriverHelper.waitAndClick(menuButton);
    }

    /** click on the 'Hide' button in the menu 'Options' */
    public void closePanelFromContextMenu() {
        seleniumWebDriverHelper.waitAndClick(contextHideButton);
        waitClosePanel();
    }
}