/
test_toolbar.py
284 lines (242 loc) · 10.7 KB
/
test_toolbar.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
import unittest
from pyramid.request import Request
from pyramid.response import Response
from pyramid import testing
from pyramid_debugtoolbar.compat import bytes_
class DebugToolbarTests(unittest.TestCase):
def setUp(self):
self.config = testing.setUp()
self.config.registry.settings['mako.directories'] = []
from pyramid.mako_templating import renderer_factory
self.config.add_renderer('.dbtmako', renderer_factory)
def tearDown(self):
del self.config
def _makeOne(self, request, panel_classes):
from pyramid_debugtoolbar.toolbar import DebugToolbar
return DebugToolbar(request, panel_classes)
def test_ctor_panel_is_up(self):
request = Request.blank('/')
request.environ['HTTP_COOKIE'] = 'pdtb_active="id"'
toolbar = self._makeOne(request, [DummyPanelWithContent])
self.assertEqual(len(toolbar.panels), 1)
panel = toolbar.panels[0]
self.assertEqual(panel.request, request)
self.assertEqual(panel.is_active, True)
def test_ctor_panel_has_content(self):
request = Request.blank('/')
request.environ['HTTP_COOKIE'] = 'pdtb_active="id"'
toolbar = self._makeOne(request, [DummyPanelWithContent])
self.assertEqual(len(toolbar.panels), 1)
panel = toolbar.panels[0]
self.assertEqual(panel.request, request)
self.assertEqual(panel.is_active, True)
def test_process_response_nonhtml(self):
response = Response()
response.content_type = 'text/plain'
request = Request.blank('/')
toolbar = self._makeOne(request, [DummyPanel])
toolbar.process_response(response)
self.assertTrue(response.processed)
def test_process_response_html(self):
from pyramid_debugtoolbar.utils import ROOT_ROUTE_NAME
from pyramid_debugtoolbar.utils import STATIC_PATH
self.config.add_static_view('_debugtoolbar/static',
STATIC_PATH)
self.config.add_route(ROOT_ROUTE_NAME, '/_debugtoolbar')
response = Response('<body></body>')
response.content_type = 'text/html'
request = Request.blank('/')
request.registry = self.config.registry
toolbar = self._makeOne(request, [DummyPanel])
toolbar.process_response(response)
self.assertTrue(response.processed)
self.assertTrue(bytes_('div id="pDebug"') in response.app_iter[0])
self.assertEqual(response.content_length, len(response.app_iter[0]))
def test_passing_of_button_style(self):
from pyramid_debugtoolbar.utils import ROOT_ROUTE_NAME
from pyramid_debugtoolbar.utils import STATIC_PATH
self.config.add_static_view('_debugtoolbar/static',
STATIC_PATH)
self.config.add_route(ROOT_ROUTE_NAME, '/_debugtoolbar')
self.config.registry.settings['debugtoolbar.button_style'] = \
'top:120px;zoom:50%'
response = Response('<body></body>')
response.content_type = 'text/html'
request = Request.blank('/')
request.registry = self.config.registry
toolbar = self._makeOne(request, [DummyPanel])
toolbar.process_response(response)
self.assertTrue(response.processed)
self.assertTrue(bytes_('top:120px;zoom:50%') in response.app_iter[0])
class Test_beforerender_subscriber(unittest.TestCase):
def setUp(self):
self.request = Request.blank('/')
self.config = testing.setUp(request=self.request)
panel = DummyPanel(self.request)
self.request.debug_toolbar = DummyToolbar([panel])
def tearDown(self):
testing.tearDown()
def _callFUT(self, event):
from pyramid_debugtoolbar.toolbar import beforerender_subscriber
return beforerender_subscriber(event)
def test_with_request_None(self):
event = {}
event['request'] = None
self._callFUT(event)
self.assertTrue(event['processed'])
def test_with_request(self):
event = {}
event['request'] = self.request
self._callFUT(event)
self.assertTrue(event['processed'])
class Test_toolbar_tween_factory(unittest.TestCase):
def setUp(self):
self.config = testing.setUp()
def tearDown(self):
testing.tearDown()
def _callFUT(self, handler, registry):
from pyramid_debugtoolbar.toolbar import toolbar_tween_factory
return toolbar_tween_factory(handler, registry)
def test_it_disabled(self):
def handler(): pass
result = self._callFUT(handler, self.config.registry)
self.assertTrue(result is handler)
def test_it_enabled(self):
self.config.registry.settings['debugtoolbar.enabled'] = True
def handler(): pass
result = self._callFUT(handler, self.config.registry)
self.assertFalse(result is handler)
class Test_toolbar_handler(unittest.TestCase):
def setUp(self):
from pyramid_debugtoolbar.utils import ROOT_ROUTE_NAME
from pyramid_debugtoolbar.utils import STATIC_PATH
self.config = testing.setUp()
self.config.registry.settings['debugtoolbar.enabled'] = True
self.config.registry.settings['debugtoolbar.hosts'] = ['127.0.0.1']
self.config.registry.settings['mako.directories'] = []
self.config.add_route(ROOT_ROUTE_NAME, '/_debug_toolbar')
self.config.add_static_view('_debugtoolbar/static',
STATIC_PATH)
from pyramid.mako_templating import renderer_factory
self.config.add_renderer('.dbtmako', renderer_factory)
def tearDown(self):
testing.tearDown()
def _makeHandler(self):
self.response = Response('OK')
def handler(request):
return self.response
return handler
def _callFUT(self, request, handler=None):
registry = self.config.registry
from pyramid_debugtoolbar.toolbar import toolbar_tween_factory
if handler is None:
handler = self._makeHandler()
handler = toolbar_tween_factory(handler, registry)
return handler(request)
def test_it_startswith_root_path(self):
request = Request.blank('/_debug_toolbar')
request.remote_addr = '127.0.0.1'
result = self._callFUT(request)
self.assertFalse(hasattr(request, 'debug_toolbar'))
self.assertTrue(result is self.response)
def test_it_bad_remote_addr(self):
request = Request.blank('/')
request.remote_addr = '123.123.123.123'
result = self._callFUT(request)
self.assertFalse(hasattr(request, 'debug_toolbar'))
self.assertTrue(result is self.response)
def test_it_remote_addr_is_None(self):
request = Request.blank('/')
request.remote_addr = None
result = self._callFUT(request)
self.assertFalse(hasattr(request, 'debug_toolbar'))
self.assertTrue(result is self.response)
def test_it_remote_addr_mask(self):
self.config.registry.settings['debugtoolbar.hosts'] = ['127.0.0.0/24']
request = Request.blank('/')
self.config.registry.settings['debugtoolbar.panels'] = [ DummyPanel ]
request.registry = self.config.registry
request.remote_addr = '127.0.0.254'
result = self._callFUT(request)
self.assertTrue(getattr(result, 'processed', False))
request.remote_addr = '127.0.0.1'
result = self._callFUT(request)
self.assertTrue(getattr(result, 'processed', False))
request.remote_addr = '127.0.1.1'
result = self._callFUT(request)
self.assertFalse(getattr(result, 'processed', False))
def test_it_calls_wrap_handler(self):
handler = self._makeHandler()
request = Request.blank('/')
self.config.registry.settings['debugtoolbar.panels'] = [ DummyPanel ]
request.registry = self.config.registry
request.remote_addr = '127.0.0.1'
result = self._callFUT(request, handler)
self.assertFalse(hasattr(request, 'debug_toolbar'))
self.assertTrue(result is self.response)
self.assertTrue(handler.wrapped)
self.assertTrue(result.processed)
def test_it_raises_exception_no_intercept_exc(self):
request = Request.blank('/')
request.remote_addr = '127.0.0.1'
def handler(request):
raise NotImplementedError
request.registry = self.config.registry
self.assertRaises(NotImplementedError, self._callFUT, request, handler)
def test_it_raises_exception_intercept_exc(self):
request = Request.blank('/')
def handler(request):
raise NotImplementedError
self.config.registry.settings['debugtoolbar.intercept_exc'] = True
self.config.registry.settings['debugtoolbar.secret'] = 'abc'
self.config.add_route('debugtoolbar.exception', '/exception')
request.registry = self.config.registry
request.remote_addr = '127.0.0.1'
response = self._callFUT(request, handler)
self.assertEqual(len(request.exc_history.tracebacks), 1)
self.assertFalse(hasattr(request, 'debug_toolbar'))
self.assertTrue(response.status_int, 500)
def test_it_intercept_redirect_nonredirect_code(self):
request = Request.blank('/')
request.remote_addr = '127.0.0.1'
self.config.registry.settings['debugtoolbar.intercept_redirects'] = True
request.registry = self.config.registry
result = self._callFUT(request)
self.assertTrue(result is self.response)
def test_it_intercept_redirect(self):
from pyramid.httpexceptions import HTTPFound
response = HTTPFound(location='http://other.com')
def handler(request):
return response
request = Request.blank('/')
request.remote_addr = '127.0.0.1'
request.registry = self.config.registry
self.config.registry.settings['debugtoolbar.intercept_redirects'] = True
result = self._callFUT(request, handler)
self.assertTrue(result is response)
self.assertEqual(result.status_int, 200)
self.assertEqual(result.location, None)
class DummyPanel(object):
is_active = False
has_content = False
user_activate = False
def __init__(self, request):
self.request = request
def process_response(self, response):
response.processed = True
def wrap_handler(self, handler):
handler.wrapped = True
return handler
def dom_id(self):
return 'id'
def nav_title(self):
return 'title'
def nav_subtitle(self):
return 'subtitle'
def process_beforerender(self, event):
event['processed'] = True
class DummyPanelWithContent(DummyPanel):
has_content = True
class DummyToolbar(object):
def __init__(self, panels):
self.panels = panels