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

org.jboss.windup.testutil.html.TestJavaApplicationOverviewUtil Maven / Gradle / Ivy

There is a newer version: 6.3.9.Final
Show newest version
package org.jboss.windup.testutil.html;

import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.jboss.windup.util.exception.WindupException;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

/**
 * Contains methods for testing the Java Application Overview report.
 *
 * @author Jesse Sightler
 */
public class TestJavaApplicationOverviewUtil extends TestChromeDriverReportUtil {

    /**
     * Loads the given page w/ the {@link WebDriver}
     */
    @Override
    public void loadPage(Path filePath) {
        try {
            Path modifiedPath = filePath.getParent().resolve(filePath.getFileName().toString() + "_modified.html");
            String contents = FileUtils.readFileToString(filePath.toFile(), Charset.defaultCharset());

            // remove some libraries that htmlunit has issues with... we don't really test these through htmlunit anyway
            contents = contents.replace("$.plot", "");
            contents = contents.replace("",
                    "");
            contents = contents.replace("", "");
            // RenderApplicationPieChartDirective
            contents = contents.replace("",
                    "");

            try (FileWriter writer = new FileWriter(modifiedPath.toFile())) {
                writer.append(contents);
            }

            getDriver().get(modifiedPath.toUri().toString());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public void checkApplicationMessage(String message) {
        // application-message
        List applicationMessageElements = getDriver()
                .findElements(By.className("application-message"));

        for (WebElement applicationMessageElement : applicationMessageElements) {
            if (message.equals(applicationMessageElement.getText()))
                return;
        }

        throw new CheckFailedException("Could not find an application message with text: " + message);
    }

    public void checkMainEffort(int expectedEffort) {
        WebElement effortElement = getDriver()
                .findElement(By.xpath(
                        ".//div[contains(@class, 'container') and contains(@class, 'mainGraphContainer')]//div[@class = 'points']/div[@class = 'number']"));
        String effortString = effortElement.getText().trim();
        effortString = effortString.replace(",", "");

        int effort;
        try {
            effort = Integer.parseInt(effortString);
        } catch (Exception e) {
            throw new CheckFailedException("Effort: " + effortString + " could not be parsed as numeric!");
        }
        if (effort != expectedEffort)
            throw new CheckFailedException("Effort was " + effort + " but was expected to be " + expectedEffort);
    }

    public void checkAppSectionEffort(String appSection, int expectedEffort) {
        WebElement appSectionEl = getAppSectionElement(appSection);
        if (appSectionEl == null) {
            throw new CheckFailedException("Unable to find app section with name: " + appSection);
        }

        String xpath = getElementXPath(getDriver(), appSectionEl) + "/"
                + "../..//div[@class = \\'points\\']/div[text() = \\'Story Points\\']/../div[@class = \\'number\\']";

        String effortString = getStringValueForXpathElement(getDriver(), xpath).trim();
        effortString = effortString.replace(",", "");

        try {
            int effort = Integer.parseInt(effortString);
            if (effort != expectedEffort)
                throw new CheckFailedException("Effort was " + effort + " but was expected to be " + expectedEffort);
        } catch (Exception e) {
            throw new CheckFailedException("Effort: " + effortString + " could not be parsed as numeric!");
        }
    }

    /**
     * Checks if the given App section, filepath, and effort level can be seen in the report.
     * 

* For example checkFilePathEffort("src_example", "src/main/resources/test.properties", 13) will ensure that an application called "src_example" * is in the report, with a line referencing "src/main/resources/test.properties" and that this line contains the effort level 13). */ public void checkFilePathEffort(String appSection, String filePath, int effort) { WebElement appSectionEl = getAppSectionElement(appSection); if (appSectionEl == null) { throw new CheckFailedException("Unable to find app section with name: " + appSection); } WebElement fileRowElement = getFileRowElement(appSection, filePath); if (fileRowElement == null) { throw new CheckFailedException("Unable to find row for filePath: " + filePath); } List elements = fileRowElement.findElements(By.xpath("./td[position() = 4]")); for (WebElement element : elements) { if (element.getText() != null) { try { int number = Integer.parseInt(getTextForElement(element)); if (number == effort) { return; } else { throw new CheckFailedException("Found row with appSection: " + appSection + " and filePath: " + filePath + ", but effort was: " + number + " (expected value: " + effort + ")"); } } catch (NumberFormatException e) { // ignore } } } throw new CheckFailedException("Unable to find app: " + appSection + " file: " + filePath + " with effort: " + effort); } /** * Checks if the given App section, filepath, and tag can be found in the report. *

* For example calling checkFilePathAndIssues("src_example", "src/main/resources/test.properties", "Web Servlet again") will ensure that an * application called "src_example" is in the report, with a line referencing "src/main/resources/test.properties" and that this line contains * text in the issues section saying "Web Servlet again"). */ public void checkFilePathAndIssues(String appSection, String filePath, String text) { WebElement appSectionEl = getAppSectionElement(appSection); if (appSectionEl == null) { throw new CheckFailedException("Unable to find app section with name: " + appSection); } WebElement fileRowElement = getFileRowElement(appSection, filePath); if (fileRowElement == null) { throw new CheckFailedException("Unable to find row for filePath: " + filePath); } List elements = fileRowElement.findElements(By.xpath("./td[position() = 3]")); for (WebElement element : elements) { String elementText = getTextForElement(element); if (elementText != null && elementText.contains(text)) { return; } } throw new CheckFailedException("Unable to find app: " + appSection + " file: " + filePath + " with issue: " + text); } /** * Checks if the given App section, filepath, and tag can be found in the report. *

* For example calling checkFilePathAndTag("src_example", "src/main/resources/test.properties", "Properties") will ensure that an application * called "src_example" is in the report, with a line referencing "src/main/resources/test.properties" and that this file is tagged "Properties" */ public void checkFilePathAndTag(String appSection, String filePath, String tag) { WebElement appSectionEl = getAppSectionElement(appSection); if (appSectionEl == null) { throw new CheckFailedException("Unable to find app section with name: " + appSection); } WebElement fileRowElement = getFileRowElement(appSection, filePath); if (fileRowElement == null) { throw new CheckFailedException("Unable to find row for filePath: " + filePath); } List elements = fileRowElement.findElements(By.xpath("./td[position() = 2]/span")); for (WebElement element : elements) { String spanValue = getTextForElement(element); if (spanValue.equals(tag)) { return; } } throw new CheckFailedException("Unable to find app: " + appSection + " file: " + filePath + " with tag: " + tag); } /** * In case the element's css is display:none, selenium does not see it using getText(). Therefore this methods uses javascript to query the value * * @param element * @return */ private String getTextForElement(WebElement element) { String xpath = getElementXPath(driver, element); String result = getStringValueForXpathElement(driver, xpath); return result.trim(); } /** * Returns the xpath full path of the given element. E.g something like /html/body/div[2]/p * * @param driver * @param element * @return */ private String getElementXPath(WebDriver driver, WebElement element) { String xpath = (String) ((JavascriptExecutor) driver).executeScript( "gPt=function(c){if(c.id!==''){return'id(\"'+c.id+'\")'}if(c===document.body){return c.tagName}var a=0;var e=c.parentNode.childNodes;for(var b=0;b * For example calling checkFilePathAndTag("src_example", "src/main/resources/test.properties") will ensure that an application called * "src_example" is in the report, with a line referencing "src/main/resources/test.properties" */ public void checkFilePath(String appSection, String filePath) { WebElement appSectionEl = getAppSectionElement(appSection); if (appSectionEl == null) { throw new CheckFailedException("Unable to find app section with name: " + appSection); } WebElement fileRowElement = getFileRowElement(appSection, filePath); if (fileRowElement == null) { throw new CheckFailedException("Unable to find row for filePath: " + filePath); } return; } private WebElement getFileRowElement(String appSection, String filePath) { WebElement fileTable = getAppSectionElement(appSection).findElement(By.xpath("../../div[contains(@class,'panel-body')]/table")); WebElement fileRow = fileTable.findElement(By .xpath("./tbody/tr/td/a[normalize-space(text()) = '" + filePath + "']/../..")); return fileRow; } private WebElement getAppSectionElement(String appSection) { List titleElements = getDriver().findElements(By.className("panel-title")); for (WebElement el : titleElements) { String panelTitleText = el.getText(); if (panelTitleText != null) { panelTitleText = parseOutAppTitle(panelTitleText); if (appSection.equals(panelTitleText.trim())) { return el; } } } return null; } private String parseOutAppTitle(String input) { // remove story points information return input.replaceAll("\\(.*\\)", ""); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy