View Javadoc

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   * Test case for {@link com.atlassian.webdriver.testing.rule.WebDriverScreenshotRule}.
29   *
30   * @since 2.1
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()); // should still create the directory
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 }