package org.fluentlenium.adapter;
import org.fluentlenium.configuration.ConfigurationProperties.DriverLifecycle;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.openqa.selenium.WebDriver;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.function.Supplier;
import static org.assertj.core.api.Assertions.assertThat;
public class SharedWebDriverContainerTest implements Supplier<WebDriver> {
private SharedWebDriverContainer.Impl container;
@Before
public void before() {
container = new SharedWebDriverContainer.Impl();
}
@After
public void after() {
container.quitAll();
assertThat(container.getAllDrivers()).isEmpty();
}
@Test
public void getOrCreateDriverWithSameTestNamesCreatesOneInstance() {
SharedWebDriver driver = container.getOrCreateDriver(this, Object.class, "test", DriverLifecycle.METHOD);
assertThat(container.getAllDrivers()).containsOnly(driver);
assertThat(container.getTestClassDrivers(Object.class)).containsOnly(driver);
SharedWebDriver driver2 = container.getOrCreateDriver(this, Object.class, "test", DriverLifecycle.METHOD);
assertThat(driver).isEqualTo(driver2);
assertThat(container.getAllDrivers()).containsOnly(driver);
assertThat(container.getTestClassDrivers(Object.class)).containsOnly(driver);
container.quit(driver);
assertThat(container.getAllDrivers()).isEmpty();
assertThat(container.getTestClassDrivers(Object.class)).isEmpty();
}
@Test
public void getOrCreateDriverWithDifferentTestNamesCreatesDistinctInstances() {
SharedWebDriver driver = container.getOrCreateDriver(this, Object.class, "test", DriverLifecycle.METHOD);
assertThat(container.getAllDrivers()).containsOnly(driver);
assertThat(container.getTestClassDrivers(Object.class)).containsOnly(driver);
SharedWebDriver driver2 = container.getOrCreateDriver(this, Object.class, "otherTest", DriverLifecycle.METHOD);
assertThat(driver).isNotEqualTo(driver2);
assertThat(container.getAllDrivers()).containsOnly(driver, driver2);
assertThat(container.getTestClassDrivers(Object.class)).containsOnly(driver, driver2);
assertThat(container.getAllDrivers().size()).isEqualTo(2);
container.quit(driver);
assertThat(container.getAllDrivers().size()).isEqualTo(1);
assertThat(container.getAllDrivers().get(0)).isEqualTo(driver2);
container.quit(driver2);
assertThat(container.getAllDrivers()).isEmpty();
assertThat(container.getTestClassDrivers(Object.class)).isEmpty();
}
@Test
public void getOrCreateDriverWithDifferentTestClassesCreatesDistinctInstances() {
SharedWebDriver driver = container.getOrCreateDriver(this, Object.class, "test", DriverLifecycle.METHOD);
assertThat(container.getAllDrivers()).containsOnly(driver);
assertThat(container.getTestClassDrivers(Object.class)).containsOnly(driver);
assertThat(container.getTestClassDrivers(String.class)).isEmpty();
SharedWebDriver driver2 = container.getOrCreateDriver(this, String.class, "test", DriverLifecycle.METHOD);
assertThat(driver).isNotEqualTo(driver2);
assertThat(container.getAllDrivers()).containsOnly(driver, driver2);
assertThat(container.getTestClassDrivers(Object.class)).containsOnly(driver);
assertThat(container.getTestClassDrivers(String.class)).containsOnly(driver2);
assertThat(container.getAllDrivers().size()).isEqualTo(2);
container.quit(driver);
assertThat(container.getAllDrivers().size()).isEqualTo(1);
assertThat(container.getAllDrivers().get(0)).isEqualTo(driver2);
container.quit(driver2);
assertThat(container.getAllDrivers()).isEmpty();
assertThat(container.getTestClassDrivers(Object.class)).isEmpty();
assertThat(container.getTestClassDrivers(String.class)).isEmpty();
}
@Test
public void getOrCreateDriverWithDifferentTestNamesAndStrategyPerClassCreatesOneInstance() {
SharedWebDriver driver = container.getOrCreateDriver(this, Object.class, "test", DriverLifecycle.CLASS);
assertThat(container.getAllDrivers()).containsOnly(driver);
assertThat(container.getTestClassDrivers(Object.class)).containsOnly(driver);
SharedWebDriver driver2 = container.getOrCreateDriver(this, Object.class, "otherTest", DriverLifecycle.CLASS);
assertThat(driver).isEqualTo(driver2);
assertThat(container.getAllDrivers()).containsOnly(driver);
assertThat(container.getTestClassDrivers(Object.class)).containsOnly(driver);
container.quit(driver);
assertThat(container.getAllDrivers()).isEmpty();
assertThat(container.getTestClassDrivers(Object.class)).isEmpty();
}
@Test
public void getOrCreateDriverWithDifferentTestNamesAndDifferentTestClassAndStrategyPerClassCreatesDistinctInstance() {
SharedWebDriver driver = container.getOrCreateDriver(this, Object.class, "test", DriverLifecycle.CLASS);
assertThat(container.getAllDrivers()).containsOnly(driver);
assertThat(container.getTestClassDrivers(Object.class)).containsOnly(driver);
assertThat(container.getTestClassDrivers(String.class)).isEmpty();
SharedWebDriver driver2 = container.getOrCreateDriver(this, String.class, "otherTest", DriverLifecycle.CLASS);
assertThat(driver).isNotEqualTo(driver2);
assertThat(container.getAllDrivers()).containsOnly(driver, driver2);
assertThat(container.getTestClassDrivers(Object.class)).containsOnly(driver);
assertThat(container.getTestClassDrivers(String.class)).containsOnly(driver2);
assertThat(container.getAllDrivers().size()).isEqualTo(2);
container.quit(driver2);
assertThat(container.getAllDrivers().size()).isEqualTo(1);
assertThat(container.getAllDrivers().get(0)).isEqualTo(driver);
container.quit(driver);
assertThat(container.getAllDrivers()).isEmpty();
assertThat(container.getTestClassDrivers(Object.class)).isEmpty();
assertThat(container.getTestClassDrivers(String.class)).isEmpty();
}
@Test
public void getOrCreateDriverWithDifferentTestNamesAndDifferentTestClassAndStrategyOnceCreatesOneInstance() {
SharedWebDriver driver = container.getOrCreateDriver(this, Object.class, "test", DriverLifecycle.JVM);
assertThat(container.getAllDrivers()).containsOnly(driver);
assertThat(container.getTestClassDrivers(Object.class)).isEmpty();
assertThat(container.getTestClassDrivers(String.class)).isEmpty();
SharedWebDriver driver2 = container.getOrCreateDriver(this, String.class, "otherTest", DriverLifecycle.JVM);
assertThat(driver).isEqualTo(driver2);
assertThat(container.getAllDrivers()).containsOnly(driver);
assertThat(container.getTestClassDrivers(Object.class)).isEmpty();
assertThat(container.getTestClassDrivers(String.class)).isEmpty();
container.quit(driver);
assertThat(container.getAllDrivers()).isEmpty();
assertThat(container.getTestClassDrivers(Object.class)).isEmpty();
assertThat(container.getTestClassDrivers(String.class)).isEmpty();
}
@Test
public void quitAllShouldQuitAllDrivers() {
SharedWebDriver driver = container.getOrCreateDriver(this, Object.class, "test", DriverLifecycle.METHOD);
SharedWebDriver driver2 = container.getOrCreateDriver(this, String.class, "test", DriverLifecycle.METHOD);
SharedWebDriver driver3 = container.getOrCreateDriver(this, Object.class, "test", DriverLifecycle.CLASS);
SharedWebDriver driver4 = container.getOrCreateDriver(this, String.class, "otherTest", DriverLifecycle.CLASS);
SharedWebDriver driver5 = container.getOrCreateDriver(this, Object.class, "test", DriverLifecycle.JVM);
SharedWebDriver driver6 = container.getOrCreateDriver(this, String.class, "otherTest", DriverLifecycle.JVM);
Set<SharedWebDriver> drivers = new LinkedHashSet<>();
drivers.add(driver);
drivers.add(driver2);
drivers.add(driver3);
drivers.add(driver4);
drivers.add(driver5);
drivers.add(driver6);
assertThat(container.getAllDrivers()).containsOnly(drivers.toArray(new SharedWebDriver[drivers.size()]));
assertThat(container.getTestClassDrivers(Object.class)).isNotEmpty();
assertThat(container.getTestClassDrivers(String.class)).isNotEmpty();
container.quitAll();
assertThat(container.getAllDrivers()).isEmpty();
assertThat(container.getTestClassDrivers(Object.class)).isEmpty();
assertThat(container.getTestClassDrivers(String.class)).isEmpty();
}
@Test
public void testSharedDriverBean() {
WebDriver webDriver = get();
Class<Object> testClass = Object.class;
String testName = "test";
DriverLifecycle driverLifecycle = DriverLifecycle.METHOD;
SharedWebDriver sharedWebDriver = new SharedWebDriver(webDriver, testClass, testName, driverLifecycle);
assertThat(sharedWebDriver.getDriver()).isSameAs(webDriver);
assertThat(sharedWebDriver.getWrappedDriver()).isSameAs(webDriver);
assertThat(sharedWebDriver.getTestClass()).isSameAs(testClass);
assertThat(sharedWebDriver.getTestName()).isSameAs(testName);
assertThat(sharedWebDriver.getDriverLifecycle()).isSameAs(driverLifecycle);
assertThat(sharedWebDriver.toString()).contains(webDriver.toString());
}
@Override
public WebDriver get() {
return Mockito.mock(WebDriver.class);
}
}