1 package com.atlassian.webdriver.rule;
2
3 import com.atlassian.webdriver.testing.rule.WebDriverScreenshotRule;
4 import com.google.common.base.Suppliers;
5 import org.apache.commons.io.FileUtils;
6 import org.junit.Before;
7 import org.junit.Rule;
8 import org.junit.Test;
9 import org.junit.rules.TemporaryFolder;
10 import org.junit.runner.Description;
11 import org.junit.runner.RunWith;
12 import org.junit.runners.model.Statement;
13 import org.mockito.Mock;
14 import org.mockito.runners.MockitoJUnitRunner;
15 import org.openqa.selenium.OutputType;
16 import org.openqa.selenium.TakesScreenshot;
17 import org.openqa.selenium.WebDriver;
18
19 import java.io.File;
20
21 import static com.atlassian.webdriver.matchers.FileMatchers.*;
22 import static org.apache.commons.io.FileUtils.readFileToString;
23 import static org.hamcrest.Matchers.not;
24 import static org.junit.Assert.*;
25 import static org.mockito.Mockito.*;
26
27
28
29
30
31
32 @RunWith(MockitoJUnitRunner.class)
33 public class TestWebDriverScreenshotRule
34 {
35
36 @Mock private Statement mockTest;
37
38 private WebDriver webDriver;
39
40 @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
41
42 @Before
43 public void initWebDriver()
44 {
45 webDriver = mock(WebDriver.class, withSettings().extraInterfaces(TakesScreenshot.class));
46 }
47
48 @Test
49 public void shouldTakeScreenshotAndPageDump() throws Throwable
50 {
51 final File fakeScreenshot = temporaryFolder.newFile("fake.png");
52 FileUtils.writeStringToFile(fakeScreenshot, "FAKE SCREENSHOT!");
53 when(webDriver.getCurrentUrl()).thenReturn("something");
54 when(webDriver.getPageSource()).thenReturn("<html>some source</html>");
55 when(asTakingScreenshot().getScreenshotAs(OutputType.FILE)).thenReturn(fakeScreenshot);
56 doThrow(new RuntimeException("failed")).when(mockTest).evaluate();
57 final WebDriverScreenshotRule rule = new WebDriverScreenshotRule(Suppliers.ofInstance(webDriver),
58 temporaryFolder.getRoot());
59 final Description description = Description.createTestDescription(TestWebDriverScreenshotRule.class, "someTest");
60 new SafeStatementInvoker(rule.apply(mockTest, description)).invokeSafely();
61 assertThat(expectedTargetDir(), isDirectory());
62 assertThat(expectedTargetFile("someTest.html"), isFile());
63 assertEquals("<html>some source</html>", readFileToString(expectedTargetFile("someTest.html")));
64 assertThat(expectedTargetFile("someTest.png"), isFile());
65 assertEquals("FAKE SCREENSHOT!", readFileToString(expectedTargetFile("someTest.png")));
66
67 }
68
69 @Test
70 public void shouldNotTakeScreenshotIfNotFailed() throws Throwable
71 {
72 when(webDriver.getCurrentUrl()).thenReturn("something");
73 when(webDriver.getPageSource()).thenReturn("<html>some source</html>");
74 final WebDriverScreenshotRule rule = new WebDriverScreenshotRule(Suppliers.ofInstance(webDriver),
75 temporaryFolder.getRoot());
76 final Description description = Description.createTestDescription(TestWebDriverScreenshotRule.class, "someTest");
77 new SafeStatementInvoker(rule.apply(mockTest, description)).invokeSafely();
78 verifyZeroInteractions(webDriver);
79 assertThat(expectedTargetDir(), isDirectory());
80 assertThat(expectedTargetFile("someTest.html"), not(exists()));
81 assertThat(expectedTargetFile("someTest.png"), not(exists()));
82 }
83
84 private TakesScreenshot asTakingScreenshot()
85 {
86 return (TakesScreenshot) webDriver;
87 }
88
89 private File expectedTargetDir()
90 {
91 return new File(temporaryFolder.getRoot(), TestWebDriverScreenshotRule.class.getName());
92 }
93
94 private File expectedTargetFile(String name)
95 {
96 return new File(expectedTargetDir(), name);
97 }
98
99
100 }