package net.thucydides.core.steps.integration;
import net.thucydides.core.annotations.Step;
import net.thucydides.core.annotations.StepGroup;
import net.thucydides.core.pages.Pages;
import net.thucydides.core.steps.*;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.openqa.selenium.WebDriver;
import sample.csv.TestPageObject;
import java.io.IOException;
import static net.thucydides.core.steps.StepData.setDefaultStepFactory;
import static net.thucydides.core.steps.StepData.withTestDataFrom;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
public class WhenRunningStepsWithTestData {
@Mock
WebDriver driver;
@Mock
StepListener listener;
private StepFactory factory;
static class TestSteps extends ScenarioSteps {
private String name;
private String address;
private String dateOfBirth;
public TestPageObject testPage;
public void verifyPage(){
getDriver().get(testPage.toString());
}
public TestSteps(Pages pages) {
super(pages);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(String dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
@StepGroup
public void step_group1() {
step1();
step2();
}
@StepGroup
public void name_and_dob() {
step1();
step3();
}
@Step
public TestSteps step1() {
getDriver().get(name);
return this;
}
@Step
public TestSteps step2() {
getDriver().get(address);
return this;
}
@Step
public TestSteps step3() {
getDriver().get(dateOfBirth);
return this;
}
@Step
public void fail_sometimes() {
getDriver().get(name);
if (name.equals("Joe")) {
throw new AssertionError("Bad name");
}
}
}
static class DifferentTestSteps extends ScenarioSteps {
private String name;
private String address;
public DifferentTestSteps(Pages pages) {
super(pages);
}
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
@Step
public void nameStep() {
getDriver().get(name);
}
@Step
public void addressStep() {
getDriver().get(address);
}
}
public static class TestStepsWithNoSetters extends ScenarioSteps {
public String name;
public String address;
public TestStepsWithNoSetters(Pages pages) {
super(pages);
}
@Step
public void nameStep() {
getDriver().get(name);
}
@Step
public void addressStep() {
getDriver().get(address);
}
}
public static class TestStepsWithNoSettersAndInaccessibleFields extends ScenarioSteps {
private String name;
private String address;
public TestStepsWithNoSettersAndInaccessibleFields(Pages pages) {
super(pages);
}
@Step
public void nameStep() {
getDriver().get(name);
}
@Step
public void addressStep() {
getDriver().get(address);
}
}
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
factory = new StepFactory(new Pages(driver));
StepEventBus.getEventBus().clear();
StepEventBus.getEventBus().registerListener(listener);
setDefaultStepFactory(null);
}
@Test
public void should_invoke_step_method_for_each_row_in_the_csv_file() throws IOException {
TestSteps steps = factory.getStepLibraryFor(TestSteps.class);
withTestDataFrom("testdata/test.csv").usingFactory(factory).run(steps).step1();
verify(driver, times(3)).get(anyString());
}
@Test
public void should_pass_test_data_into_invoked_methods() throws IOException {
TestSteps steps = factory.getStepLibraryFor(TestSteps.class);
StepEventBus.getEventBus().testStarted("some test");
withTestDataFrom("testdata/test.csv").usingFactory(factory).run(steps).step1();
verify(driver).get("Bill");
verify(driver).get("Joe");
verify(driver).get("Mary");
}
@Test
public void should_execute_all_tests_even_if_one_of_the_steps_fails() throws IOException {
TestSteps steps = factory.getStepLibraryFor(TestSteps.class);
StepEventBus.getEventBus().testStarted("some test");
withTestDataFrom("testdata/test.csv").usingFactory(factory).run(steps).fail_sometimes();
verify(driver).get("Bill");
verify(driver).get("Joe");
verify(driver).get("Mary");
}
@Test
public void should_notify_listeners_if_one_of_the_steps_fails() throws IOException {
TestSteps steps = factory.getStepLibraryFor(TestSteps.class);
StepEventBus.getEventBus().testStarted("some test");
withTestDataFrom("testdata/test.csv")
.usingFactory(factory)
.run(steps).fail_sometimes();
verify(listener).stepFailed(any(StepFailure.class));
}
@Test
public void should_be_able_to_define_a_default_factory_before_the_step() throws IOException {
TestSteps steps = factory.getStepLibraryFor(TestSteps.class);
setDefaultStepFactory(factory);
StepEventBus.getEventBus().testStarted("some test");
withTestDataFrom("testdata/test.csv")
.run(steps).step1();
verify(driver).get("Bill");
verify(driver).get("Joe");
verify(driver).get("Mary");
}
@Test
public void should_be_able_to_define_a_default_test_step_class_before_the_step() throws IOException {
TestSteps steps = factory.getStepLibraryFor(TestSteps.class);
StepEventBus.getEventBus().testStarted("some test");
withTestDataFrom("testdata/test.csv").usingFactory(factory).run(steps).step1();
verify(driver).get("Bill");
verify(driver).get("Joe");
verify(driver).get("Mary");
}
@Test
public void should_be_able_to_define_default_factory_and_test_step_class_before_the_step() throws IOException {
TestSteps steps = factory.getStepLibraryFor(TestSteps.class);
setDefaultStepFactory(factory);
StepEventBus.getEventBus().testStarted("some test");
withTestDataFrom("testdata/test.csv").run(steps).step1();
verify(driver).get("Bill");
verify(driver).get("Joe");
verify(driver).get("Mary");
}
@Test
public void should_be_able_to_use_test_data_with_semicolons() throws IOException {
TestSteps steps = factory.getStepLibraryFor(TestSteps.class);
setDefaultStepFactory(factory);
StepEventBus.getEventBus().testStarted("some test");
withTestDataFrom("testdata/semicolon-test.csv").separatedBy(';').run(steps).step1();
verify(driver).get("Bill");
verify(driver).get("Joe");
verify(driver).get("Mary");
}
@Test
public void should_be_able_to_use_different_step_libraries_in_the_same_test() throws IOException {
TestSteps steps = factory.getStepLibraryFor(TestSteps.class);
DifferentTestSteps differentSteps = factory.getStepLibraryFor(DifferentTestSteps.class);
StepEventBus.getEventBus().testStarted("some test");
setDefaultStepFactory(factory);
withTestDataFrom("testdata/test.csv").run(steps).name_and_dob();
withTestDataFrom("testdata/test.csv").run(differentSteps).nameStep();
verify(driver, times(2)).get("Bill");
verify(driver, times(1)).get("10/10/1970");
}
@Test
public void should_be_able_to_use_a_step_library_with_public_fields_and_no_setters() throws IOException {
TestStepsWithNoSetters steps = factory.getStepLibraryFor(TestStepsWithNoSetters.class);
setDefaultStepFactory(factory);
StepEventBus.getEventBus().testStarted("some test");
withTestDataFrom("testdata/test.csv").run(steps).nameStep();
verify(driver).get("Bill");
verify(driver).get("Joe");
verify(driver).get("Mary");
}
@Test
public void should_work_with_private_fields() throws IOException {
TestStepsWithNoSettersAndInaccessibleFields steps
= factory.getStepLibraryFor(TestStepsWithNoSettersAndInaccessibleFields.class);
setDefaultStepFactory(factory);
StepEventBus.getEventBus().testStarted("some test");
withTestDataFrom("testdata/test.csv").run(steps).nameStep();
}
@Test
public void should_instantiate_any_uninitialized_page_objects_in_a_step_class_when_using_data_driven_approach()
throws IOException {
TestSteps steps = factory.getStepLibraryFor(TestSteps.class);
StepEventBus.getEventBus().testStarted("some test");
withTestDataFrom("testdata/test.csv").usingFactory(factory).run(steps).verifyPage();
verify(driver, times(3)).get("TestPageObject");
}
}