Skip to content

Commit ff50bb0

Browse files
committed
Refactor JS testing logic to be a bit cleaner.
1 parent 6c8df61 commit ff50bb0

File tree

1 file changed

+101
-83
lines changed

1 file changed

+101
-83
lines changed

tests/test_javascript.py

Lines changed: 101 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from selenium import webdriver
1111
from selenium.common.exceptions import NoSuchElementException
1212
from selenium.webdriver.support.wait import WebDriverWait
13-
from selenium.webdriver.common.by import By
1413
from selenium.webdriver.common.keys import Keys
1514
from selenium.webdriver.common.action_chains import ActionChains
1615
except ImportError:
@@ -24,79 +23,99 @@
2423
from debug_toolbar.settings import PANELS_DEFAULTS
2524

2625

27-
@skipIf(webdriver is None, "selenium isn't installed")
28-
@skipUnless('DJANGO_SELENIUM_TESTS' in os.environ, "selenium tests not requested")
29-
@override_settings(DEBUG=True, DEBUG_TOOLBAR_PANELS=PANELS_DEFAULTS+[
30-
'debug_toolbar.panels.profiling.ProfilingPanel',
31-
])
32-
class InitTestCase(LiveServerTestCase):
33-
26+
class ToolbarTestCase(LiveServerTestCase):
27+
"""Helper class that provides a few methods for fetching elements."""
3428
@classmethod
3529
def setUpClass(cls):
36-
super(InitTestCase, cls).setUpClass()
30+
super(ToolbarTestCase, cls).setUpClass()
3731
cls.selenium = webdriver.Firefox()
3832

3933
@classmethod
4034
def tearDownClass(cls):
4135
cls.selenium.quit()
42-
super(InitTestCase, cls).tearDownClass()
36+
super(ToolbarTestCase, cls).tearDownClass()
4337

4438
def setUp(self):
4539
self.selenium.delete_all_cookies()
4640
self.selenium.get(self.live_server_url + '/execute_sql/')
47-
self.panel_class = "HeadersPanel"
48-
self.panel_trigger = self.selenium.find_element(
49-
By.CSS_SELECTOR,
50-
"#djDebugPanelList li a.{}".format(self.panel_class)
41+
self.get_web_driver_wait().until(
42+
lambda selenium:
43+
self.get_panel_trigger("HeadersPanel").is_displayed()
5144
)
52-
self.panel = self.selenium.find_element_by_id(self.panel_class)
53-
WebDriverWait(self.selenium, timeout=10).until(
54-
lambda selenium: self.panel_trigger.is_displayed())
45+
46+
def get_panel_trigger(self, name):
47+
return self.selenium.find_element_by_class_name(name)
48+
49+
def get_panel(self, name):
50+
return self.selenium.find_element_by_id(name)
51+
52+
def get_web_driver_wait(self):
53+
return WebDriverWait(self.selenium, timeout=10)
54+
55+
56+
@skipIf(webdriver is None, "selenium isn't installed")
57+
@skipUnless(
58+
'DJANGO_SELENIUM_TESTS' in os.environ, "selenium tests not requested")
59+
@override_settings(DEBUG=True, DEBUG_TOOLBAR_PANELS=PANELS_DEFAULTS + [
60+
'debug_toolbar.panels.profiling.ProfilingPanel',
61+
])
62+
class InitTestCase(ToolbarTestCase):
5563

5664
def test_show_toolbar(self):
5765
toolbar = self.selenium.find_element_by_id('djDebug')
5866
self.assertTrue(toolbar.is_displayed())
5967

6068
def test_panel_li_a_click_once(self):
61-
self.assertFalse(self.panel.is_displayed())
62-
self.panel_trigger.click()
63-
self.assertTrue(self.panel.is_displayed())
69+
panel_name = "HeadersPanel"
70+
panel_trigger = self.get_panel_trigger(panel_name)
71+
panel = self.get_panel(panel_name)
72+
self.assertFalse(panel.is_displayed())
73+
panel_trigger.click()
74+
self.assertTrue(panel.is_displayed())
6475

6576
# Verify that the panels parent had the djdt-active class added
6677
trigger_count = self.selenium.execute_script(
6778
"return djdt.jQuery('#djDebugToolbar').find('.djdt-active')"
68-
".find('.{}').length".format(self.panel_class)
79+
".find('.{}').length".format(panel_name)
6980
)
7081
self.assertEquals(trigger_count, 1)
7182

7283
def test_panel_li_a_click_twice(self):
84+
panel_name = "HeadersPanel"
85+
panel_trigger = self.get_panel_trigger(panel_name)
86+
panel = self.get_panel(panel_name)
7387
# Click the trigger twice
74-
self.panel_trigger.click()
75-
self.panel_trigger.click()
88+
panel_trigger.click()
89+
panel_trigger.click()
7690
# Verify that the panels parent had the djdt-active class removed
7791
trigger_count = self.selenium.execute_script(
7892
"return djdt.jQuery('#djDebugToolbar').find('.djdt-active')"
79-
".find('.{}').length".format(self.panel_class)
93+
".find('.{}').length".format(panel_name)
8094
)
8195
self.assertEquals(trigger_count, 0)
82-
self.assertFalse(self.panel.is_displayed())
96+
self.assertFalse(panel.is_displayed())
8397

8498
def test_ajax_fail(self):
99+
panel_name = "HeadersPanel"
100+
panel_trigger = self.get_panel_trigger(panel_name)
85101
self.selenium.execute_script(
86102
"djdt.jQuery('#djDebug').data('render-panel-url', '/test_fail/')"
87103
)
88104
debug_window = self.selenium.find_element_by_id("djDebugWindow")
89105
self.assertFalse(debug_window.is_displayed())
90-
self.panel_trigger.click()
106+
panel_trigger.click()
91107
self.assertTrue(debug_window.is_displayed())
92108

93109
def test_dj_debug_close(self):
110+
panel_name = "HeadersPanel"
111+
panel_trigger = self.get_panel_trigger(panel_name)
112+
panel = self.get_panel(panel_name)
94113
# Click a panel to set a djdt-active class
95-
self.panel_trigger.click()
114+
panel_trigger.click()
96115
active_panel_items = self.selenium.find_element_by_css_selector(
97116
"#djDebugToolbar li.djdt-active")
98117
self.assertTrue(active_panel_items.is_displayed())
99-
self.panel.find_element_by_css_selector(
118+
panel.find_element_by_css_selector(
100119
"#djDebug a.djDebugClose").click()
101120
self.assertRaises(
102121
NoSuchElementException,
@@ -105,10 +124,12 @@ def test_dj_debug_close(self):
105124
)
106125

107126
def test_click_panel_button_checkbox(self):
108-
checkbox = self.panel_trigger.find_element_by_xpath('..')\
127+
panel_name = "HeadersPanel"
128+
panel_trigger = self.get_panel_trigger(panel_name)
129+
checkbox = panel_trigger.find_element_by_xpath('..')\
109130
.find_element_by_css_selector("input[type=checkbox]")
110131
cookie_name = checkbox.get_attribute("data-cookie")
111-
self.assertEquals(cookie_name, "djdt{}".format(self.panel_class))
132+
self.assertEquals(cookie_name, "djdt{}".format(panel_name))
112133
cookie = self.selenium.get_cookie(cookie_name)
113134
self.assertIsNone(cookie)
114135
# Click on the checkbox to turn off
@@ -127,20 +148,25 @@ def test_remote_class_click(self):
127148
self.selenium.find_element_by_class_name(panel_name).click()
128149
panel = self.selenium.find_element_by_id(panel_name)
129150

130-
remote_call_trigger = WebDriverWait(self.selenium, timeout=10).until(
131-
lambda selenium: panel.find_element_by_class_name('remoteCall'))
151+
remote_call_trigger = self.get_web_driver_wait().until(
152+
lambda selenium: panel.find_element_by_class_name('remoteCall')
153+
)
132154

133155
remote_call_trigger.click()
134156
debug_window = self.selenium.find_element_by_id('djDebugWindow')
135157
if panel_name == 'TemplatesPanel':
136-
code_section = WebDriverWait(self.selenium, timeout=10).until(
137-
lambda selenium: debug_window.find_element_by_tag_name('code'))
158+
code_section = self.get_web_driver_wait().until(
159+
lambda selenium:
160+
debug_window.find_element_by_tag_name('code')
161+
)
138162
self.assertEquals(
139163
"basic.html", code_section.get_attribute('innerHTML')
140164
)
141165
elif panel_name == 'SQLPanel':
142-
sql_select = WebDriverWait(self.selenium, timeout=10).until(
143-
lambda selenium: debug_window.find_element_by_class_name('djdt-scroll'))
166+
sql_select = self.get_web_driver_wait().until(
167+
lambda selenium:
168+
debug_window.find_element_by_class_name('djdt-scroll')
169+
)
144170
self.assertIn(
145171
"<dt>Executed SQL</dt>",
146172
sql_select.get_attribute('innerHTML')
@@ -159,7 +185,8 @@ def test_toggle_switch_click(self):
159185
self.selenium.find_element_by_class_name(panel_name).click()
160186
panel = self.selenium.find_element_by_id(panel_name)
161187
toggle_switch = panel.find_element_by_class_name('djToggleSwitch')
162-
id_javascript_selector = "return djdt.jQuery('#{}').find('.djToggleSwitch').attr('{}')"
188+
id_javascript_selector = (
189+
"return djdt.jQuery('#{}').find('.djToggleSwitch').attr('{}')")
163190
target_id = self.selenium.execute_script(
164191
id_javascript_selector.format(panel_name, 'data-toggle-id')
165192
)
@@ -191,21 +218,25 @@ def test_toggle_switch_click(self):
191218
)
192219

193220
def test_hide_toolbar_button(self):
194-
self.assertTrue(self.panel_trigger.is_displayed())
221+
panel_name = "HeadersPanel"
222+
panel_trigger = self.get_panel_trigger(panel_name)
223+
self.assertTrue(panel_trigger.is_displayed())
195224
self.selenium.find_element_by_id("djHideToolBarButton").click()
196-
WebDriverWait(self.selenium, timeout=10).until(
197-
lambda selenium: not self.panel_trigger.is_displayed())
225+
self.get_web_driver_wait().until(
226+
lambda selenium: not panel_trigger.is_displayed())
198227

199228
def test_show_toolbar_button(self):
229+
panel_name = "HeadersPanel"
230+
panel_trigger = self.get_panel_trigger(panel_name)
200231
self.selenium.find_element_by_id("djHideToolBarButton").click()
201232
show_button = self.selenium.find_element_by_id('djShowToolBarButton')
202233
self.assertTrue(show_button.is_displayed())
203-
self.assertFalse(self.panel_trigger.is_displayed())
234+
self.assertFalse(panel_trigger.is_displayed())
204235
# Verify when the show button is clicked and held that it's not hidden.
205236
ActionChains(self.selenium).click_and_hold(show_button).perform()
206237
self.assertTrue(show_button.is_displayed())
207238
show_button.click()
208-
self.assertTrue(self.panel_trigger.is_displayed())
239+
self.assertTrue(panel_trigger.is_displayed())
209240

210241
def test_move_show_toolbar_button(self):
211242
self.selenium.find_element_by_id("djHideToolBarButton").click()
@@ -225,8 +256,10 @@ def test_close_binding(self):
225256
toolbar = self.selenium.find_element_by_id('djDebugToolbar')
226257
self.selenium.find_element_by_class_name('remoteCall').click()
227258
debug_window = self.selenium.find_element_by_id('djDebugWindow')
228-
WebDriverWait(self.selenium, timeout=10).until(
229-
lambda selenium: debug_window.find_element_by_class_name('djdt-scroll'))
259+
self.get_web_driver_wait().until(
260+
lambda selenium:
261+
debug_window.find_element_by_class_name('djdt-scroll')
262+
)
230263
self.assertTrue(debug_window.is_displayed())
231264
# Verify the sql debug window is hidden on close
232265
self.selenium.execute_script('djdt.close()')
@@ -240,7 +273,7 @@ def test_close_binding(self):
240273

241274
# Verify the sql debug window is hidden on click
242275
self.selenium.execute_script('djdt.close()')
243-
WebDriverWait(self.selenium, timeout=10).until(
276+
self.get_web_driver_wait().until(
244277
lambda selenium: not toolbar.is_displayed())
245278
self.assertFalse(sql_panel.is_displayed())
246279

@@ -252,66 +285,48 @@ def test_hidden_via_cookie(self):
252285
self.assertTrue(
253286
self.selenium.find_element_by_id('djDebugToolbar').is_displayed())
254287
self.selenium.execute_script('djdt.close()')
255-
WebDriverWait(self.selenium, timeout=10).until(
288+
self.get_web_driver_wait().until(
256289
lambda selenium:
257290
selenium.find_element_by_id('djShowToolBarButton').is_displayed())
258291
# Verify that when the page reloads that the toolbar is still closed.
259292
self.selenium.refresh()
260293
self.assertFalse(
261294
self.selenium.find_element_by_id('djDebugToolbar').is_displayed())
262-
self.assertTrue(
263-
self.selenium.find_element_by_id('djShowToolBarButton').is_displayed())
295+
show_button = self.selenium.find_element_by_id('djShowToolBarButton')
296+
self.assertTrue(show_button.is_displayed())
264297

265298

266299
@skipIf(webdriver is None, "selenium isn't installed")
267-
@skipUnless('DJANGO_SELENIUM_TESTS' in os.environ, "selenium tests not requested")
300+
@skipUnless(
301+
'DJANGO_SELENIUM_TESTS' in os.environ, "selenium tests not requested")
268302
@override_settings(DEBUG=True)
269-
class APITestCase(LiveServerTestCase):
270-
271-
@classmethod
272-
def setUpClass(cls):
273-
super(APITestCase, cls).setUpClass()
274-
cls.selenium = webdriver.Firefox()
275-
276-
@classmethod
277-
def tearDownClass(cls):
278-
cls.selenium.quit()
279-
super(APITestCase, cls).tearDownClass()
280-
281-
def setUp(self):
282-
self.selenium.delete_all_cookies()
283-
self.selenium.get(self.live_server_url + '/execute_sql/')
284-
self.panel_class = "HeadersPanel"
285-
self.panel_trigger = self.selenium.find_element(
286-
By.CSS_SELECTOR,
287-
"#djDebugPanelList li a.{}".format(self.panel_class)
288-
)
289-
WebDriverWait(self.selenium, timeout=10).until(
290-
lambda selenium: self.panel_trigger.is_displayed())
303+
class APITestCase(ToolbarTestCase):
291304

292305
def test_show_toolbar(self):
293306
self.selenium.execute_script("djdt.hide_toolbar(false)")
294307
# Verify that it closes the toolbar.
295-
self.assertTrue(WebDriverWait(self.selenium, timeout=10).until(
308+
self.assertTrue(self.get_web_driver_wait().until(
296309
lambda selenium:
297310
selenium.find_element_by_id('djDebugToolbarHandle').is_displayed())
298311
)
299312
self.selenium.execute_script("djdt.show_toolbar(true)")
300-
self.assertFalse(
301-
self.selenium.find_element_by_id('djDebugToolbarHandle').is_displayed()
302-
)
303-
self.assertTrue(WebDriverWait(self.selenium, timeout=10).until(
313+
handle = self.selenium.find_element_by_id('djDebugToolbarHandle')
314+
self.assertFalse(handle.is_displayed())
315+
self.assertTrue(self.get_web_driver_wait().until(
304316
lambda selenium:
305317
selenium.find_element_by_id('djDebugToolbar').is_displayed())
306318
)
307319
cookie = self.selenium.get_cookie('djdt')
308320
self.assertEquals(cookie['name'], 'djdt')
309321
self.assertEquals(cookie['value'], 'show')
310322
action = ActionChains(self.selenium)
311-
action.key_down(Keys.ESCAPE, self.selenium.find_element_by_tag_name('body'))
323+
action.key_down(
324+
Keys.ESCAPE,
325+
self.selenium.find_element_by_tag_name('body')
326+
)
312327
action.perform()
313328
# Verify that it closes the toolbar.
314-
self.assertTrue(WebDriverWait(self.selenium, timeout=10).until(
329+
self.assertTrue(self.get_web_driver_wait().until(
315330
lambda selenium:
316331
selenium.find_element_by_id('djDebugToolbarHandle').is_displayed())
317332
)
@@ -322,16 +337,18 @@ def test_hide_toolbar(self):
322337
toolbar = self.selenium.find_element_by_id('djDebugToolbar')
323338
self.selenium.find_element_by_class_name('remoteCall').click()
324339
debug_window = self.selenium.find_element_by_id('djDebugWindow')
325-
WebDriverWait(self.selenium, timeout=10).until(
326-
lambda selenium: debug_window.find_element_by_class_name('djdt-scroll'))
340+
self.get_web_driver_wait().until(
341+
lambda selenium:
342+
debug_window.find_element_by_class_name('djdt-scroll')
343+
)
327344
self.assertTrue(debug_window.is_displayed())
328345

329346
# Hide the toolbar
330347
self.selenium.execute_script('djdt.hide_toolbar(false)')
331-
self.assertTrue(WebDriverWait(self.selenium, timeout=10).until(
348+
self.assertTrue(self.get_web_driver_wait().until(
332349
lambda selenium: not debug_window.is_displayed())
333350
)
334-
self.assertTrue(WebDriverWait(self.selenium, timeout=10).until(
351+
self.assertTrue(self.get_web_driver_wait().until(
335352
lambda selenium: not toolbar.is_displayed())
336353
)
337354
self.assertFalse(sql_panel.is_displayed())
@@ -378,7 +395,8 @@ def test_cookie_set(self):
378395
expires_lower_bound = timezone.now().date() + timedelta(days=expires)
379396
expires_upper_bound = expires_lower_bound + timedelta(days=1)
380397
self.selenium.execute_script(
381-
"djdt.cookie.set('{}','{}',{{'path':'{}','expires':{},'domain':'{}'}})"
398+
"djdt.cookie.set('{}','{}',"
399+
"{{'path':'{}','expires':{},'domain':'{}'}})"
382400
.format(key, value, path, expires, domain)
383401
)
384402
cookie = self.selenium.get_cookie(key)

0 commit comments

Comments
 (0)