package net.thucydides.core.reports.integration;
import com.google.common.base.Optional;
import net.thucydides.core.model.*;
import net.thucydides.core.model.features.ApplicationFeature;
import net.thucydides.core.reports.xml.XMLTestOutcomeReporter;
import net.thucydides.core.util.ExtendedTemporaryFolder;
import org.apache.commons.io.FileUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class WhenReadingAnXMLReport {
@Rule
public ExtendedTemporaryFolder temporaryDirectory = new ExtendedTemporaryFolder();
private XMLTestOutcomeReporter outcomeReporter;
private File outputDirectory;
@Before
public void setupTestReporter() throws IOException {
outcomeReporter = new XMLTestOutcomeReporter();
outputDirectory = temporaryDirectory.newFolder();
outcomeReporter.setOutputDirectory(outputDirectory);
}
@Test
public void should_load_acceptance_test_report_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this' name='should_do_this' description='Some description' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS' timestamp='2013-01-01T00:00:00.000-05:00'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story' />\n"
+ " <issues>\n"
+ " <issue>#456</issue>\n"
+ " <issue>#789</issue>\n"
+ " <issue>#123</issue>\n"
+ " </issues>\n"
+ " <test-step result='SUCCESS'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
assertThat(testOutcome.get().getIssues(), hasItems("#123", "#456", "#789"));
assertThat(testOutcome.get().getStartTime(), notNullValue());
assertThat(testOutcome.get().getDescription(), is("Some description"));
}
@Test
public void should_load_manual_acceptance_test_report_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this' name='should_do_this' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS' timestamp='2013-01-01T00:00:00.000-05:00' manual='true'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story' />\n"
+ " <issues>\n"
+ " <issue>#456</issue>\n"
+ " <issue>#789</issue>\n"
+ " <issue>#123</issue>\n"
+ " </issues>\n"
+ " <test-step result='SUCCESS'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
assertThat(testOutcome.get().isManual(), is(true));
}
@Test
public void should_load_a_qualified_acceptance_test_report_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this [a qualifier]' qualifier='a qualifier' name='should_do_this' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story' />\n"
+ " <issues>\n"
+ " <issue>#456</issue>\n"
+ " <issue>#789</issue>\n"
+ " <issue>#123</issue>\n"
+ " </issues>\n"
+ " <test-step result='SUCCESS'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
assertThat(testOutcome.get().getQualifier().get(), is("a qualifier"));
assertThat(testOutcome.get().getTitle(), containsString("[a qualifier]"));
}
@Test
public void should_unescape_newline_in_the_title_and_qualifier_of_a_qualified_acceptance_test_report_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this [a qualifier with a new line]' qualifier='a qualifier with a new line' name='should_do_this' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story' />\n"
+ " <issues>\n"
+ " <issue>#456</issue>\n"
+ " <issue>#789</issue>\n"
+ " <issue>#123</issue>\n"
+ " </issues>\n"
+ " <test-step result='SUCCESS'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
assertThat(testOutcome.get().getQualifier().get(), is("a qualifier with \n a new line"));
assertThat(testOutcome.get().getTitle(), containsString("[a qualifier with \n a new line]"));
}
@Test
public void should_load_tags_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this' name='should_do_this' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS' duration='0'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.SomeTestScenarioWithTags' name='Some test scenario with tags' />\n"
+ " <tags>\n"
+ " <tag name='important feature' type='feature' />\n"
+ " <tag name='simple story' type='story' />\n"
+ " </tags>\n"
+ " <test-step result='SUCCESS' duration='0'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
assertThat(testOutcome.get().getTags().size(), is(2));
}
@Test
public void should_load_example_data_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this' name='should_do_this' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS' duration='0'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.SomeTestScenarioWithTags' name='Some test scenario with tags' />\n"
+ " <tags>\n"
+ " <tag name='important feature' type='feature' />\n"
+ " <tag name='simple story' type='story' />\n"
+ " </tags>\n"
+ " <examples>\n"
+ " <headers>\n"
+ " <header>firstName</header>\n"
+ " <header>lastName</header>\n"
+ " <header>age</header>\n"
+ " </headers>\n"
+ " <rows>\n"
+ " <row result='FAILURE'>\n"
+ " <value>Joe</value>\n"
+ " <value>Smith</value>\n"
+ " <value>20</value>\n"
+ " </row>\n"
+ " <row>\n"
+ " <value>Jack</value>\n"
+ " <value>Jones</value>\n"
+ " <value>21</value>\n"
+ " </row>\n"
+ " </rows>\n"
+ " </examples>\n"
+ " <test-step result='SUCCESS' duration='0'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
DataTable table = testOutcome.get().getDataTable();
assertThat(table.getHeaders(), hasItems("firstName","lastName","age"));
assertThat(table.getRows().size(), is(2));
assertThat(table.getRows().get(0).getStringValues(), hasItems("Joe","Smith","20"));
assertThat(table.getRows().get(0).getResult(), is(TestResult.FAILURE));
assertThat(table.getRows().get(1).getStringValues(), hasItems("Jack","Jones","21"));
assertThat(table.getRows().get(1).getResult(), is(TestResult.SUCCESS));
}
@Test
public void should_load_example_data_from_xml_file_with_a_title_and_description() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this' name='should_do_this' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS' duration='0'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.SomeTestScenarioWithTags' name='Some test scenario with tags' />\n"
+ " <tags>\n"
+ " <tag name='important feature' type='feature' />\n"
+ " <tag name='simple story' type='story' />\n"
+ " </tags>\n"
+ " <examples>\n"
+ " <headers>\n"
+ " <header>firstName</header>\n"
+ " <header>lastName</header>\n"
+ " <header>age</header>\n"
+ " </headers>\n"
+ " <rows>\n"
+ " <row result='FAILURE'>\n"
+ " <value>Joe</value>\n"
+ " <value>Smith</value>\n"
+ " <value>20</value>\n"
+ " </row>\n"
+ " <row>\n"
+ " <value>Jack</value>\n"
+ " <value>Jones</value>\n"
+ " <value>21</value>\n"
+ " </row>\n"
+ " </rows>\n"
+ " </examples>\n"
+ " <test-step result='SUCCESS' duration='0'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
DataTable table = testOutcome.get().getDataTable();
assertThat(table.getHeaders(), hasItems("firstName","lastName","age"));
assertThat(table.getRows().size(), is(2));
assertThat(table.getRows().get(0).getStringValues(), hasItems("Joe","Smith","20"));
assertThat(table.getRows().get(0).getResult(), is(TestResult.FAILURE));
assertThat(table.getRows().get(1).getStringValues(), hasItems("Jack","Jones","21"));
assertThat(table.getRows().get(1).getResult(), is(TestResult.SUCCESS));
}
@Test
public void should_load_acceptance_test_report_including_issues() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this' name='should_do_this' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story' />\n"
+ " <versions>\n"
+ " <version>Release 1</version>\n"
+ " <version>Version 1.1</version>\n"
+ " </versions>\n"
+ " <test-step result='SUCCESS'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
assertThat(testOutcome.get().getTitle(), is("Should do this"));
assertThat(testOutcome.get().getVersions(),hasItem("Release 1"));
assertThat(testOutcome.get().getVersions(),hasItem("Version 1.1"));
}
@Test
public void should_load_acceptance_test_report_including_versions() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this' name='should_do_this' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story' />\n"
+ " <test-step result='SUCCESS'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
assertThat(testOutcome.get().getTitle(), is("Should do this"));
}
@Test
public void should_load_test_step_details_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this' name='should_do_this' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story' />\n"
+ " <test-step result='SUCCESS'>\n"
+ " <screenshots>"
+ " <screenshot image='step_1.png' source='step_1.html' />"
+ " </screenshots>"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
TestStep testStep = (TestStep) testOutcome.get().getTestSteps().get(0);
assertThat(testOutcome.get().getTestSteps().size(), is(1));
assertThat(testStep.getResult(), is(TestResult.SUCCESS));
assertThat(testStep.getDescription(), is("step 1"));
assertThat(testStep.getScreenshots().get(0).getScreenshotFile().getName(), is("step_1.png"));
assertThat(testStep.getScreenshots().get(0).getHtmlSource().get().getName(), is("step_1.html"));
}
@Test
public void should_load_test_step_details_with_no_screenshot_source_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this' name='should_do_this' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story' />\n"
+ " <test-step result='SUCCESS'>\n"
+ " <screenshots>"
+ " <screenshot image='step_1.png'/>"
+ " </screenshots>"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
TestStep testStep = (TestStep) testOutcome.get().getTestSteps().get(0);
assertThat(testOutcome.get().getTestSteps().size(), is(1));
assertThat(testStep.getResult(), is(TestResult.SUCCESS));
assertThat(testStep.getDescription(), is("step 1"));
assertThat(testStep.getScreenshots().get(0).getScreenshotFile().getName(), is("step_1.png"));
assertThat(testStep.getScreenshots().get(0).getHtmlSource().isPresent(), is(false));
}
@Test
public void should_load_user_story_details_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this' name='should_do_this' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story' />\n"
+ " <test-step result='SUCCESS'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
assertThat(testOutcome.get().getUserStory(), is(Story.withId("net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory", "A user story")));
}
@Test
public void should_load_feature_details_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this' name='should_do_this' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story' path='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport'>\n"
+ " <feature id='myapp.myfeatures.SomeFeature' name='Some feature' />\n"
+ " </user-story>"
+ " <test-step result='SUCCESS'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
testOutcome.get().getFeature();
ApplicationFeature expectedFeature = new ApplicationFeature("myapp.myfeatures.SomeFeature", "Some feature");
assertThat(testOutcome.get().getFeature().getId(), is("myapp.myfeatures.SomeFeature"));
assertThat(testOutcome.get().getFeature().getName(), is("Some feature"));
assertThat(testOutcome.get().getPath(), is("net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport"));
}
@Test
public void should_load_the_session_id_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Should do this' name='should_do_this' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS' session-id='1234'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story'>\n"
+ " <feature id='myapp.myfeatures.SomeFeature' name='Some feature' />\n"
+ " </user-story>"
+ " <test-step result='SUCCESS'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
assertThat(testOutcome.get().getSessionId(), is("1234"));
}
@Test
public void should_return_null_feature_if_no_feature_is_present() {
TestOutcome testOutcome = new TestOutcome("aTestMethod");
assertThat(testOutcome.getFeature(), is(nullValue()));
}
@Test
public void should_load_acceptance_test_report_with_nested_groups_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='A nested test case' name='a_nested_test_case' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story' />\n"
+ " <test-group name='Group 1' result='SUCCESS'>\n"
+ " <test-group name='Group 1.1' result='SUCCESS'>\n"
+ " <test-group name='Group 1.1.1' result='SUCCESS'>\n"
+ " <test-step result='SUCCESS'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ " </test-group>\n"
+ " </test-group>\n"
+ " </test-group>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
assertThat(testOutcome.get().getTitle(), is("A nested test case"));
TestStep group1 = testOutcome.get().getTestSteps().get(0);
assertThat(testOutcome.get().getTestSteps().size(), is(1));
}
@Test
public void should_load_acceptance_test_report_with_simple_nested_groups_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='A nested test case' name='a_nested_test_case' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story' />\n"
+ " <test-group name='Group 1' result='SUCCESS'>\n"
+ " <test-group name='Group 1.1' result='SUCCESS'>\n"
+ " <test-step result='SUCCESS'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ " </test-group>\n"
+ " </test-group>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
assertThat(testOutcome.get().getTitle(), is("A nested test case"));
TestStep group1 = testOutcome.get().getTestSteps().get(0);
assertThat(testOutcome.get().getTestSteps().size(), is(1));
}
@Test
public void should_load_acceptance_test_report_with_multiple_test_steps_from_xml_file() throws Exception {
String storedReportXML =
"<acceptance-test-run title='A simple test case' name='a_simple_test_case' steps='1' successful='1' failures='0' skipped='0' ignored='0' pending='0' result='SUCCESS'>\n"
+ " <user-story id='net.thucydides.core.reports.integration.WhenGeneratingAnXMLReport.AUserStory' name='A user story' />\n"
+ " <test-step result='SUCCESS'>\n"
+ " <description>step 1</description>\n"
+ " </test-step>\n"
+ " <test-step result='FAILURE'>\n"
+ " <description>step 2</description>\n"
+ " </test-step>\n"
+ "</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
assertThat(testOutcome.get().getTitle(), is("A simple test case"));
assertThat(testOutcome.get().getTestSteps().size(), is(2));
assertThat(testOutcome.get().getTestSteps().get(0).getResult(), is(TestResult.SUCCESS));
assertThat(testOutcome.get().getTestSteps().get(0).getDescription(), is("step 1"));
assertThat(testOutcome.get().getTestSteps().get(1).getResult(), is(TestResult.FAILURE));
assertThat(testOutcome.get().getTestSteps().get(1).getDescription(), is("step 2"));
}
@Test
public void should_load_qualified_acceptance_test_report_with_a_qualified_name() throws Exception {
String storedReportXML =
"<acceptance-test-run title='Search for news [euro]' name='searchForNews[0]' qualifier='euro' steps='0' successful='0' failures='0' skipped='0' ignored='0' pending='0' result='PENDING' duration='85'>\n"+
" <user-story id='samples.ParametrizedTest' name='Parametrized test'/>\n"+
" <tags>\n"+
" <tag name='Parametrized test' type='story'/>\n"+
" </tags>\n"+
"</acceptance-test-run>";
File report = temporaryDirectory.newFile("saved-report.xml");
FileUtils.writeStringToFile(report, storedReportXML);
Optional<TestOutcome> testOutcome = outcomeReporter.loadReportFrom(report);
assertThat(testOutcome.get().getTitle(), is("Search for news [euro]"));
assertThat(testOutcome.get().getTitleWithLinks(), is("Search for news [euro]"));
}
}