1   package com.atlassian.pageobjects.elements.test.query;
2   
3   import com.atlassian.pageobjects.elements.WebDriverLocatable;
4   import com.atlassian.pageobjects.elements.WebDriverLocators;
5   import com.atlassian.pageobjects.elements.query.Poller;
6   import com.atlassian.pageobjects.elements.query.TimedQuery;
7   import com.atlassian.pageobjects.elements.query.webdriver.WebDriverQueryFactory;
8   import com.atlassian.pageobjects.elements.timeout.MapBasedTimeouts;
9   import com.atlassian.pageobjects.elements.timeout.TimeoutType;
10  import com.atlassian.pageobjects.elements.timeout.Timeouts;
11  import com.atlassian.webdriver.AtlassianWebDriver;
12  import com.google.common.collect.ImmutableMap;
13  import org.junit.Test;
14  import org.openqa.selenium.By;
15  import org.openqa.selenium.NoSuchElementException;
16  import org.openqa.selenium.RenderedWebElement;
17  import org.openqa.selenium.WebElement;
18  
19  import static com.atlassian.pageobjects.elements.query.Poller.by;
20  import static com.atlassian.pageobjects.elements.query.Poller.byDefaultTimeout;
21  import static com.atlassian.pageobjects.elements.query.Poller.now;
22  import static org.hamcrest.Matchers.is;
23  import static org.junit.Assert.assertEquals;
24  import static org.mockito.Matchers.any;
25  import static org.mockito.Mockito.mock;
26  import static org.mockito.Mockito.when;
27  
28  /**
29   * Test case for {@link com.atlassian.pageobjects.elements.query.webdriver.WebDriverQueryFactory}.
30   *
31   */
32  public class TestWebDriverQueryFactory
33  {
34  
35      private Timeouts timeouts = new MapBasedTimeouts(ImmutableMap.<TimeoutType, Long>of(
36              TimeoutType.DEFAULT, 500L,
37              TimeoutType.EVALUATION_INTERVAL, 100L,
38              TimeoutType.COMPONENT_LOAD, 200L
39      ));
40  
41      @Test
42      public void shouldSetUpQueryWithCustomDefaultTimeout()
43      {
44          WebDriverLocatable locatable = singleTestLocatable();
45          AtlassianWebDriver mockElementPresentDriver = mock(AtlassianWebDriver.class);
46          WebDriverQueryFactory tested = new WebDriverQueryFactory(locatable, timeouts, mockElementPresentDriver);
47  
48          TimedQuery<Boolean> result = tested.isPresent(TimeoutType.COMPONENT_LOAD);
49          assertEquals(100L, result.interval());
50          assertEquals(200L, result.defaultTimeout());
51      }
52  
53      @Test
54      public void shouldReturnValidIsPresentQuery()
55      {
56          WebElement mockElement = newMockElement();
57          AtlassianWebDriver mockDriver = mock(AtlassianWebDriver.class);
58          when(mockDriver.findElement(any(By.class))).thenReturn(mockElement);
59          WebDriverQueryFactory tested = new WebDriverQueryFactory(singleTestLocatable(), timeouts, mockDriver);
60  
61          TimedQuery<Boolean> result = tested.isPresent();
62          assertEquals(100L, result.interval());
63          assertEquals(500L, result.defaultTimeout());
64          Poller.waitUntil(result, is(true), now());
65      }
66  
67      @Test
68      public void shouldReturnFalseIsPresentQuery()
69      {
70          AtlassianWebDriver mockDriver = mock(AtlassianWebDriver.class);
71          when(mockDriver.findElement(any(By.class))).thenThrow(new NoSuchElementException("Cause you've got issues"));
72          WebDriverQueryFactory tested = new WebDriverQueryFactory(singleTestLocatable(), timeouts, mockDriver);
73  
74          TimedQuery<Boolean> result = tested.isPresent();
75          assertEquals(100L, result.interval());
76          assertEquals(500L, result.defaultTimeout());
77          Poller.waitUntil(result, is(false), by(1000));
78      }
79  
80      @Test
81      public void shouldReturnIsVisibleQueryThatIsTrueNow()
82      {
83          RenderedWebElement mockElement = mock(RenderedWebElement.class);
84          when(mockElement.isDisplayed()).thenReturn(true);
85          AtlassianWebDriver mockDriver = mock(AtlassianWebDriver.class);
86          when(mockDriver.findElement(any(By.class))).thenReturn(mockElement);
87          WebDriverQueryFactory tested = new WebDriverQueryFactory(singleTestLocatable(), timeouts, mockDriver);
88  
89          TimedQuery<Boolean> result = tested.isVisible();
90          assertEquals(100L, result.interval());
91          assertEquals(500L, result.defaultTimeout());
92          Poller.waitUntil(result, is(true), now());
93      }
94  
95      @Test
96      public void shouldReturnIsVisibleQueryThatIsTrueInAWhile()
97      {
98          RenderedWebElement mockElement = mock(RenderedWebElement.class);
99          when(mockElement.isDisplayed()).thenReturn(false, false, false, false, true);
100         AtlassianWebDriver mockDriver = mock(AtlassianWebDriver.class);
101         when(mockDriver.findElement(any(By.class))).thenReturn(mockElement);
102         WebDriverQueryFactory tested = new WebDriverQueryFactory(singleTestLocatable(), timeouts, mockDriver);
103 
104         TimedQuery<Boolean> result = tested.isVisible();
105         assertEquals(100L, result.interval());
106         assertEquals(500L, result.defaultTimeout());
107         Poller.waitUntil(result, is(false), now());
108         Poller.waitUntil(result, is(true), by(1000));
109     }
110 
111     @Test
112     public void shouldReturnIsVisibleQueryThatIsFalse()
113     {
114         RenderedWebElement mockElement = mock(RenderedWebElement.class);
115         when(mockElement.isDisplayed()).thenReturn(false);
116         AtlassianWebDriver mockDriver = mock(AtlassianWebDriver.class);
117         when(mockDriver.findElement(any(By.class))).thenReturn(mockElement);
118         WebDriverQueryFactory tested = new WebDriverQueryFactory(singleTestLocatable(), timeouts, mockDriver);
119 
120         TimedQuery<Boolean> result = tested.isVisible();
121         assertEquals(100L, result.interval());
122         assertEquals(500L, result.defaultTimeout());
123         Poller.waitUntil(result, is(false), by(1000));
124     }
125 
126     @Test
127     public void hasClassQueryShouldReturnTrueForSimpleMatch()
128     {
129         RenderedWebElement mockElement = mock(RenderedWebElement.class);
130         when(mockElement.getAttribute("class")).thenReturn("oneclass secondclass someotherclasssss");
131         AtlassianWebDriver mockDriver = mock(AtlassianWebDriver.class);
132         when(mockDriver.findElement(any(By.class))).thenReturn(mockElement);
133         WebDriverQueryFactory tested = new WebDriverQueryFactory(singleTestLocatable(), timeouts, mockDriver);
134 
135         Poller.waitUntil(tested.hasClass("oneclass"), is(true), now());
136         Poller.waitUntil(tested.hasClass("secondclass"), is(true), now());
137         Poller.waitUntil(tested.hasClass("someotherclasssss"), is(true), now());
138         Poller.waitUntil(tested.hasClass("blahblah"), is(false), byDefaultTimeout());
139     }
140 
141     @Test
142     public void hasClassQueryShouldBeCaseInsensitive()
143     {
144         RenderedWebElement mockElement = mock(RenderedWebElement.class);
145         when(mockElement.getAttribute("class")).thenReturn("oneclass secOndclAss soMeotherclasSsss");
146         AtlassianWebDriver mockDriver = mock(AtlassianWebDriver.class);
147         when(mockDriver.findElement(any(By.class))).thenReturn(mockElement);
148         WebDriverQueryFactory tested = new WebDriverQueryFactory(singleTestLocatable(), timeouts, mockDriver);
149 
150         Poller.waitUntil(tested.hasClass("Oneclass"), is(true), now());
151         Poller.waitUntil(tested.hasClass("SECondclAss"), is(true), now());
152         Poller.waitUntil(tested.hasClass("someotherclaSSSSS"), is(true), now());
153     }
154 
155     private WebDriverLocatable singleTestLocatable()
156     {
157         return WebDriverLocators.single(By.id("test"));
158     }
159 
160     private WebElement newMockElement()
161     {
162         return mock(WebElement.class);
163     }
164 }