package org.jenkinsci.plugins.quarantine;
import hudson.model.FreeStyleBuild;
import hudson.tasks.junit.TestResult;
import hudson.tasks.junit.TestResultAction;
import hudson.tasks.junit.CaseResult;
import hudson.model.Descriptor;
import hudson.model.FreeStyleProject;
import hudson.security.FullControlOnceLoggedInAuthorizationStrategy;
import hudson.tasks.junit.TestDataPublisher;
import hudson.util.DescribableList;
import org.jvnet.hudson.test.HudsonTestCase;
import org.jvnet.hudson.test.TestBuilder;
import hudson.Launcher;
import hudson.model.BuildListener;
import hudson.model.AbstractBuild;
import java.io.IOException;
import org.xml.sax.SAXException;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlTextArea;
public class QuarantineUiTest extends HudsonTestCase {
private String projectName = "x";
protected String quarantineText = "quarantineReason";
protected FreeStyleProject project;
@Override
protected void setUp() throws Exception {
super.setUp();
java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(java.util.logging.Level.SEVERE);
project = createFreeStyleProject(projectName);
DescribableList<TestDataPublisher, Descriptor<TestDataPublisher>> publishers = new DescribableList<TestDataPublisher, Descriptor<TestDataPublisher>>(
project);
publishers.add(new QuarantineTestDataPublisher());
QuarantinableJUnitResultArchiver archiver = new QuarantinableJUnitResultArchiver("*.xml");
archiver.setTestDataPublishers(publishers);
project.getPublishersList().add(archiver);
hudson.setAuthorizationStrategy(new FullControlOnceLoggedInAuthorizationStrategy());
hudson.setSecurityRealm(createDummySecurityRealm());
}
protected FreeStyleBuild runBuildWithJUnitResult(final String xmlFileName) throws Exception {
FreeStyleBuild build;
project.getBuildersList().add(new TestBuilder() {
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener)
throws InterruptedException, IOException {
build.getWorkspace().child("junit.xml").copyFrom(getClass().getResource(xmlFileName));
return true;
}
});
build = project.scheduleBuild2(0).get();
project.getBuildersList().clear();
return build;
}
protected TestResult getResultsFromJUnitResult(final String xmlFileName) throws Exception {
return runBuildWithJUnitResult(xmlFileName).getAction(TestResultAction.class).getResult();
}
public void testTextSummaryForUnquarantinedTestAuthenticated() throws Exception {
FreeStyleBuild build = runBuildWithJUnitResult("junit-1-failure.xml");
TestResult tr = build.getAction(TestResultAction.class).getResult();
HtmlPage page = whenNavigatingToTestCase(tr.getSuite("SuiteA").getCase("TestA"), true);
assertTrue(pageShowsText(page, "This test was not quarantined. Quarantine it."));
}
public void testTextSummaryForUnquarantinedTestNotAuthenticated() throws Exception {
FreeStyleBuild build = runBuildWithJUnitResult("junit-1-failure.xml");
TestResult tr = build.getAction(TestResultAction.class).getResult();
HtmlPage page = whenNavigatingToTestCase(tr.getSuite("SuiteA").getCase("TestA"), false);
assertTrue(pageShowsText(page, "This test was not quarantined."));
assertFalse(pageShowsText(page, "Quarantine it."));
}
public void testWhenQuarantiningTestSaysQuarantinedBy() throws Exception {
FreeStyleBuild build = runBuildWithJUnitResult("junit-1-failure.xml");
TestResult tr = build.getAction(TestResultAction.class).getResult();
HtmlPage page = whenNavigatingToTestCase(tr.getSuite("SuiteA").getCase("TestA"), true);
whenQuarantiningTestOnPage(page);
page = whenNavigatingToTestCase(tr.getSuite("SuiteA").getCase("TestA"), false);
assertTrue(pageShowsText(page, "This test was quarantined by user1"));
}
public void testCanNavigateToQuarantineReport() throws Exception {
FreeStyleBuild build = runBuildWithJUnitResult("junit-1-failure.xml");
WebClient wc = new WebClient();
wc.login("user1", "user1");
HtmlPage page = wc.goTo("quarantine/");
assertNotNull(page);
}
private HtmlPage whenNavigatingToTestCase(CaseResult testCase, boolean authenticate) throws Exception, IOException,
SAXException {
WebClient wc = new WebClient();
if (authenticate) {
wc.login("user1", "user1");
}
HtmlPage page = wc.goTo(testCase.getOwner().getUrl() + "testReport/" + testCase.getUrl());
return page;
}
private void whenQuarantiningTestOnPage(HtmlPage page) throws Exception {
((HtmlAnchor) page.getElementById("quarantine")).click();
HtmlForm form = page.getFormByName("quarantine");
HtmlTextArea textArea = (HtmlTextArea) last(form.selectNodes(".//textarea"));
textArea.setText(quarantineText);
form.submit((HtmlButton) last(form.selectNodes(".//button")));
}
private boolean pageShowsText(HtmlPage page, String text) {
boolean found = page.asText().indexOf(text) != -1;
System.out.println("didn't find text <" + text + "> in the following page:");
System.out.println(page.asText());
return found;
}
}