package net.thucydides.junit.runners.integration;
import net.thucydides.core.steps.StepEventBus;
import net.thucydides.core.webdriver.*;
import net.thucydides.junit.rules.QuietThucydidesLoggingRule;
import net.thucydides.junit.rules.SaveWebdriverSystemPropertiesRule;
import net.thucydides.junit.runners.AbstractTestStepRunnerTest;
import net.thucydides.junit.runners.ThucydidesRunner;
import net.thucydides.samples.*;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.MethodRule;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.model.InitializationError;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
/**
* Managing the WebDriver instance during a test run
* The instance should be created once at the start of the test run,
* and closed once at the end of the tests.
*
* @author johnsmart
*
*/
public class WhenManagingAWebDriverInstance extends AbstractTestStepRunnerTest {
@Rule
public MethodRule saveSystemProperties = new SaveWebdriverSystemPropertiesRule();
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
WebdriverInstanceFactory webdriverInstanceFactory;
@Mock
FirefoxDriver firefoxDriver;
@Rule
public QuietThucydidesLoggingRule quietThucydidesLoggingRule = new QuietThucydidesLoggingRule();
WebDriverFactory webDriverFactory;
@Before
public void createATestableDriverFactory() throws Exception {
MockitoAnnotations.initMocks(this);
webdriverInstanceFactory = new WebdriverInstanceFactory() {
@Override
public WebDriver newFirefoxDriver(Capabilities profile) {
return firefoxDriver;
}
};
webDriverFactory = new WebDriverFactory(webdriverInstanceFactory, environmentVariables);
StepEventBus.getEventBus().clear();
}
@Test
public void the_driver_should_be_initialized_before_the_tests() throws InitializationError {
ThucydidesRunner runner = new ThucydidesRunner(SamplePassingScenario.class, webDriverFactory);
runner.run(new RunNotifier());
assertThat(firefoxDriver, is(notNullValue()));
}
@Mock
ThucydidesWebdriverManager manager;
@Test
public void the_driver_should_be_reset_after_each_test() throws InitializationError {
ThucydidesRunner runner = new ThucydidesRunner(MultipleTestScenario.class, webDriverFactory);
runner.run(new RunNotifier());
verify(firefoxDriver,times(3)).quit();
}
@Test
public void the_driver_should_only_be_reset_once_at_the_start_for_unique_session_tests() throws InitializationError {
ThucydidesRunner runner = new ThucydidesRunner(MultipleTestScenarioWithUniqueSession.class, webDriverFactory);
runner.run(new RunNotifier());
verify(firefoxDriver,times(1)).quit();
}
@Test
public void the_driver_should_be_quit_after_the_tests() throws InitializationError {
ThucydidesRunner runner = new ThucydidesRunner(SingleTestScenario.class, webDriverFactory);
runner.run(new RunNotifier());
verify(firefoxDriver).quit();
}
@Test
public void when_an_unsupported_driver_is_used_an_error_is_raised() throws InitializationError {
environmentVariables.setProperty("webdriver.driver", "netscape");
try {
ThucydidesRunner runner = getTestRunnerUsing(SingleTestScenario.class);
runner.run(new RunNotifier());
fail();
} catch (UnsupportedDriverException e) {
assertThat(e.getMessage(), containsString("Unsupported browser type: netscape"));
}
}
@Test
public void a_system_provided_url_should_override_the_default_url() throws InitializationError {
environmentVariables.setProperty("webdriver.base.url", "http://www.wikipedia.com");
ThucydidesRunner runner = getTestRunnerUsing(SingleWikipediaTestScenario.class);
runner.run(new RunNotifier());
verify(firefoxDriver).get("http://www.wikipedia.com");
}
@Override
protected ThucydidesRunner getTestRunnerUsing(Class<?> testClass) throws InitializationError {
Configuration configuration = new SystemPropertiesConfiguration(environmentVariables);
return new ThucydidesRunner(testClass, webDriverFactory, configuration);
}
}