package hudson.plugins.testng.results;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.gargoylesoftware.htmlunit.html.DomNodeUtil;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.BuildListener;
import hudson.model.FreeStyleBuild;
import hudson.model.FreeStyleProject;
import hudson.plugins.testng.CommonUtil;
import hudson.plugins.testng.Constants;
import hudson.plugins.testng.PluginImpl;
import hudson.plugins.testng.Publisher;
import hudson.tasks.test.AbstractTestResultAction;
import static org.junit.Assert.*;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.TestBuilder;
/**
* Tests for {@link PackageResult}'s view page
*
* TODO: add tests for checking fail and skip diffs between two test runs
*
* @author nullin
*/
public class PackageResultTest {
@Rule
public JenkinsRule r = new JenkinsRule();
/**
* Test using precheckins
*
* 1. verify links to classes are correct
* 2. verify all cells have a value
* 3. verify all classes are present
* 4. verify only first 25 test methods are shown
* 5. verify that clicking to see all, gets all methods
* 6. verify that the links for all methods are correct
*
* @throws Exception
*/
@Test
public void testPrecheckinPackageResults() throws Exception {
FreeStyleProject p = r.createFreeStyleProject();
Publisher publisher = new Publisher();
publisher.setReportFilenamePattern("testng.xml");
p.getPublishersList().add(publisher);
p.onCreatedFromScratch(); //to setup project action
p.getBuildersList().add(new TestBuilder() {
@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher,
BuildListener listener) throws InterruptedException, IOException {
String contents = CommonUtil.getContents(Constants.TESTNG_XML_PRECHECKINS);
build.getWorkspace().child("testng.xml").write(contents,"UTF-8");
return true;
}
});
//run build
FreeStyleBuild build = p.scheduleBuild2(0).get();
TestNGResult testngResult = (TestNGResult) build.getAction(AbstractTestResultAction.class).getResult();
PackageResult pkgResult = (PackageResult) testngResult.findCorrespondingResult(PluginImpl.URL + "/precheckins");
//Get page
String urlPrefix = build.getUrl() + PluginImpl.URL;
HtmlPage page = r.createWebClient().goTo(urlPrefix + "/precheckins");
List<HtmlElement> elements = DomNodeUtil.selectNodes(page, "//table[@id='allClasses']/tbody/tr/td/a");
//ensure correct number of classes is displayed
assertEquals(pkgResult.getChildren().size(), elements.size());
//verify links to classes
List<String> linksInPage = new ArrayList<String>();
for (HtmlElement element : elements) {
linksInPage.add(element.getAttribute("href"));
}
Collections.sort(linksInPage);
List<String> linksFromResult = new ArrayList<String>();
for (ClassResult cr : pkgResult.getChildren()) {
//would have used cr.getUpUrl() but for some reason
//as part of test, Jenkins.instance.rootUrl() returns 'null'
linksFromResult.add(r.getURL() + cr.getRun().getUrl() + cr.getId());
}
Collections.sort(linksFromResult);
assertEquals(linksFromResult, linksInPage);
//verify that all cells have a value (are not empty)
elements = DomNodeUtil.selectNodes(page, "//table[@id='allClasses']/tbody/tr/td");
for (HtmlElement element : elements) {
assertNotSame("", element.getTextContent());
}
//verify only first 25 methods are shown
HtmlElement divShowAllLink = page.getElementById("showAllLink", true);
assertNotNull(divShowAllLink);
assertEquals("Showing only first " + PackageResult.MAX_EXEC_MTHD_LIST_SIZE + " test methods. Click to see all",
divShowAllLink.getTextContent());
elements = DomNodeUtil.selectNodes(page, "//tbody[@id='sortedMethods']/tr");
assertEquals(PackageResult.MAX_EXEC_MTHD_LIST_SIZE, elements.size());
//verify clicking on link gets all methods back
divShowAllLink.getElementsByTagName("a").get(0).click(); //click to get all test methods
elements = DomNodeUtil.selectNodes(page, "//tbody[@id='sortedMethods']/tr/td/a");
assertEquals(pkgResult.getSortedTestMethodsByStartTime().size(), elements.size());
//verify links for test methods
linksInPage.clear();
for (HtmlElement element : elements) {
linksInPage.add(element.getAttribute("href"));
}
Collections.sort(linksInPage);
linksFromResult.clear();
for (MethodResult mr : pkgResult.getSortedTestMethodsByStartTime()) {
//would have used mr.getUpUrl() but for some reason
//as part of test, Jenkins.instance.rootUrl() returns 'null'
linksFromResult.add(r.getURL() + mr.getRun().getUrl() + mr.getId());
}
Collections.sort(linksFromResult);
assertEquals(linksFromResult, linksInPage);
//assert that link to get all methods is no longer visible
r.assertStringContains(divShowAllLink.getAttribute("style"), "none");
//verify bar
HtmlElement element = page.getElementById("fail-skip", true);
r.assertStringContains(element.getTextContent(), "1 failure");
assertFalse(element.getTextContent().contains("failures"));
r.assertStringContains(element.getTextContent(), "1 skipped");
element = page.getElementById("pass", true);
r.assertStringContains(element.getTextContent(), "38 tests");
}
/**
* Test using my.package package
*
* 1. verify that there are 0 failures and 1 test
* 2. verify there is no section to get all methods
*
* @throws Exception
*/
@Test
public void testMyPackagePackageResults() throws Exception {
FreeStyleProject p = r.createFreeStyleProject();
Publisher publisher = new Publisher();
publisher.setReportFilenamePattern("testng.xml");
p.getPublishersList().add(publisher);
p.onCreatedFromScratch(); //to setup project action
p.getBuildersList().add(new TestBuilder() {
@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher,
BuildListener listener) throws InterruptedException, IOException {
String contents = CommonUtil.getContents(Constants.TESTNG_XML_EMPTY_EXCEPTION);
build.getWorkspace().child("testng.xml").write(contents,"UTF-8");
return true;
}
});
//run build
FreeStyleBuild build = p.scheduleBuild2(0).get();
//Get page
String urlPrefix = build.getUrl() + PluginImpl.URL;
HtmlPage page = r.createWebClient().goTo(urlPrefix + "/my.package");
//verify only first 25 methods are shown
assertNull(page.getElementById("showAllLink"));
//verify bar
HtmlElement element = page.getElementById("fail-skip", true);
r.assertStringContains(element.getTextContent(), "0 failures");
assertFalse(element.getTextContent().contains("skipped"));
element = page.getElementById("pass", true);
r.assertStringContains(element.getTextContent(), "1 test");
assertFalse(element.getTextContent().contains("tests"));
}
}