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
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 }