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