package org.fluentlenium.adapter.junit.integration; import net.jcip.annotations.NotThreadSafe; import org.apache.commons.io.FileUtils; import org.assertj.core.util.Files; import org.fluentlenium.adapter.SharedWebDriverContainer; import org.fluentlenium.adapter.junit.FluentTest; import org.fluentlenium.configuration.ConfigurationProperties.DriverLifecycle; import org.fluentlenium.configuration.FluentConfiguration; import org.fluentlenium.configuration.FluentConfiguration.BooleanValue; import org.junit.After; import org.junit.Test; import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.mockito.Mockito; import org.openqa.selenium.By; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import java.io.File; import java.io.IOError; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.fail; @NotThreadSafe public class FluentTestTest { private static List<WebDriver> drivers = new ArrayList<>(); private static List<WebDriver> sharedClassDrivers = new ArrayList<>(); private static List<WebDriver> sharedOnceDrivers = new ArrayList<>(); private static List<ScreenshotWebDriver> screenshotWebDrivers = new ArrayList<>(); private static File screenshotFile; private static String html = "<html>FluentLenium</html>"; private static byte[] screenshotData = {1, 4, 7, 9, 2, 4, 2, 4, 3}; private static File tmpPath = Files.newTemporaryFolder(); private static List<WebDriver.Options> sharedClassDriversOptions = new ArrayList<>(); private interface ScreenshotWebDriver extends WebDriver, TakesScreenshot { } public static class InternalTest extends FluentTest { @Override public WebDriver newWebDriver() { WebDriver webDriver = Mockito.mock(WebDriver.class); drivers.add(webDriver); return webDriver; } @Test public void okTest() { goTo("url"); } @Test public void okTest2() { goTo("url2"); } @Test public void failingTest() { fail("Failing Test"); } } @FluentConfiguration(driverLifecycle = DriverLifecycle.CLASS) public static class InternalTestSharedClass extends FluentTest { @Override public WebDriver newWebDriver() { WebDriver webDriver = Mockito.mock(WebDriver.class); sharedClassDrivers.add(webDriver); return webDriver; } @Test public void okTest() { goTo("url"); } @Test public void okTest2() { goTo("url2"); } @Test public void failingTest() { fail("Failing Test"); } } @FluentConfiguration(driverLifecycle = DriverLifecycle.JVM) public static class InternalTestSharedOnce extends FluentTest { @Override public WebDriver newWebDriver() { WebDriver webDriver = Mockito.mock(WebDriver.class); sharedOnceDrivers.add(webDriver); return webDriver; } @Test public void okTest() { goTo("url"); } @Test public void okTest2() { goTo("url2"); } @Test public void failingTest() { fail("Failing Test"); } } @FluentConfiguration(driverLifecycle = DriverLifecycle.CLASS, deleteCookies = BooleanValue.TRUE) public static class ShouldDeleteCookiesTest extends FluentTest { @Override public WebDriver newWebDriver() { WebDriver webDriver = Mockito.mock(WebDriver.class); WebDriver.Options options = Mockito.mock(WebDriver.Options.class); sharedClassDriversOptions.add(options); Mockito.when(webDriver.manage()).thenReturn(options); sharedClassDrivers.add(webDriver); return webDriver; } @Test public void okTest() { goTo("url"); } @Test public void okTest2() { goTo("url2"); } @Test public void failingTest() { fail("Failing Test"); } } public static class AutomaticScreenShotTest extends FluentTest { public AutomaticScreenShotTest() { getConfiguration().setHtmlDumpPath(tmpPath.getPath()); getConfiguration().setHtmlDumpMode(TriggerMode.AUTOMATIC_ON_FAIL); getConfiguration().setScreenshotPath(tmpPath.getPath()); getConfiguration().setScreenshotMode(TriggerMode.AUTOMATIC_ON_FAIL); } @Override public WebDriver newWebDriver() { try { screenshotFile = File.createTempFile("FluentTestTest.java", ""); FileUtils.writeByteArrayToFile(screenshotFile, screenshotData); screenshotFile.deleteOnExit(); } catch (IOException e) { throw new IOError(e); } ScreenshotWebDriver webDriver = Mockito.mock(ScreenshotWebDriver.class); Mockito.when(webDriver.getScreenshotAs(OutputType.FILE)).thenReturn(screenshotFile); WebElement htmlElement = Mockito.mock(WebElement.class); Mockito.when(htmlElement.getAttribute("innerHTML")).thenReturn(html); Mockito.when(webDriver.findElements(By.cssSelector("html"))).thenReturn(Arrays.asList(htmlElement)); screenshotWebDrivers.add(webDriver); return webDriver; } @Test public void failingTest() { fail("Failing Test"); } } @After public void after() { drivers.clear(); sharedClassDrivers.clear(); sharedOnceDrivers.clear(); screenshotWebDrivers.clear(); SharedWebDriverContainer.INSTANCE.quitAll(); } @Test public void testFluentTest() { Result result = JUnitCore.runClasses(InternalTest.class); assertThat(result.getFailures()).hasSize(1); assertThat(result.getFailures().get(0).getMessage()).isEqualTo("Failing Test"); assertThat(drivers).hasSize(3); for (WebDriver driver : drivers) { Mockito.verify(driver).quit(); } assertThat(SharedWebDriverContainer.INSTANCE.getTestClassDrivers(InternalTest.class)).isEmpty(); } @Test public void testInternalTestSharedClass() { Result result = JUnitCore.runClasses(InternalTestSharedClass.class); assertThat(result.getFailures()).hasSize(1); assertThat(result.getFailures().get(0).getMessage()).isEqualTo("Failing Test"); assertThat(sharedClassDrivers).hasSize(1); for (WebDriver driver : sharedClassDrivers) { Mockito.verify(driver).quit(); } assertThat(SharedWebDriverContainer.INSTANCE.getTestClassDrivers(InternalTest.class)).isEmpty(); } @Test public void testInternalTestSharedOnce() { Result result = JUnitCore.runClasses(InternalTestSharedOnce.class); assertThat(result.getFailures()).hasSize(1); assertThat(result.getFailures().get(0).getMessage()).isEqualTo("Failing Test"); assertThat(sharedOnceDrivers).hasSize(1); for (WebDriver driver : sharedOnceDrivers) { Mockito.verify(driver, Mockito.never()).quit(); } assertThat(SharedWebDriverContainer.INSTANCE.getAllDrivers()).hasSize(1); } @Test public void testShouldDeleteCookiesTest() { Result result = JUnitCore.runClasses(ShouldDeleteCookiesTest.class); assertThat(result.getFailures()).hasSize(1); assertThat(result.getFailures().get(0).getMessage()).isEqualTo("Failing Test"); assertThat(sharedClassDrivers).hasSize(1); for (WebDriver driver : sharedClassDrivers) { Mockito.verify(driver).quit(); } for (WebDriver.Options options : sharedClassDriversOptions) { Mockito.verify(options, Mockito.times(3)).deleteAllCookies(); } assertThat(SharedWebDriverContainer.INSTANCE.getAllDrivers()).isEmpty(); } @Test public void testAutomaticScreenShotTest() throws IOException { Result result = JUnitCore.runClasses(AutomaticScreenShotTest.class); assertThat(result.getFailures()).hasSize(1); assertThat(result.getFailures().get(0).getMessage()).isEqualTo("Failing Test"); assertThat(screenshotWebDrivers).hasSize(1); ScreenshotWebDriver driver = screenshotWebDrivers.get(0); Mockito.verify(driver).getScreenshotAs(OutputType.FILE); Mockito.verify(driver).findElements(By.cssSelector("html")); assertThat(tmpPath.list()).contains("AutomaticScreenShotTest_failingTest(org.fluentlenium.adapter.junit.integration" + ".FluentTestTest$AutomaticScreenShotTest).html"); assertThat(tmpPath.list()).contains("AutomaticScreenShotTest_failingTest(org.fluentlenium.adapter.junit.integration" + ".FluentTestTest$AutomaticScreenShotTest).png"); File screenshotGeneratedFile = new File(tmpPath, "AutomaticScreenShotTest_failingTest(org.fluentlenium.adapter.junit.integration" + ".FluentTestTest$AutomaticScreenShotTest).png"); File htmlDumpFile = new File(tmpPath, "AutomaticScreenShotTest_failingTest(org.fluentlenium.adapter.junit.integration" + ".FluentTestTest$AutomaticScreenShotTest).html"); try { assertThat(FileUtils.readFileToByteArray(screenshotGeneratedFile)).isEqualTo(screenshotData); assertThat(FileUtils.readFileToString(htmlDumpFile)).isEqualTo(html); } finally { FileUtils.deleteQuietly(screenshotGeneratedFile); FileUtils.deleteQuietly(htmlDumpFile); } } }