|
1 | | -# stdlib |
2 | 1 | import json |
3 | | - |
4 | | -# 3p |
5 | | -from pyramid.response import Response |
6 | | -from pyramid.config import Configurator |
7 | | -from pyramid.renderers import render_to_response |
8 | | -from pyramid.httpexceptions import ( |
9 | | - HTTPInternalServerError, |
10 | | - HTTPFound, |
11 | | - HTTPNotFound, |
12 | | - HTTPException, |
13 | | - HTTPNoContent, |
14 | | -) |
15 | 2 | import webtest |
| 3 | + |
16 | 4 | from nose.tools import eq_, assert_raises |
17 | 5 |
|
18 | 6 | # project |
19 | 7 | from ddtrace import compat |
20 | | -from ddtrace.contrib.pyramid import trace_pyramid |
21 | 8 | from ddtrace.contrib.pyramid.patch import insert_tween_if_needed |
22 | 9 |
|
| 10 | +from pyramid.httpexceptions import HTTPException |
| 11 | + |
| 12 | +from .app import create_app |
| 13 | + |
23 | 14 | from ...test_tracer import get_dummy_tracer |
24 | 15 | from ...util import override_global_tracer |
25 | 16 |
|
26 | 17 |
|
27 | 18 | class PyramidBase(object): |
| 19 | + instrument = False |
| 20 | + |
| 21 | + def setUp(self): |
| 22 | + self.tracer = get_dummy_tracer() |
| 23 | + self.create_app() |
| 24 | + |
| 25 | + def create_app(self, settings=None): |
| 26 | + # get default settings or use what is provided |
| 27 | + settings = settings or self.get_settings() |
| 28 | + # always set the dummy tracer as a default tracer |
| 29 | + settings.update({'datadog_tracer': self.tracer}) |
| 30 | + |
| 31 | + app, renderer = create_app(settings, self.instrument) |
| 32 | + self.app = webtest.TestApp(app) |
| 33 | + self.renderer = renderer |
| 34 | + |
| 35 | + def get_settings(self): |
| 36 | + return {} |
| 37 | + |
| 38 | + def override_settings(self, settings): |
| 39 | + self.create_app(settings) |
28 | 40 |
|
29 | 41 | def test_200(self): |
30 | 42 | res = self.app.get('/', status=200) |
@@ -157,9 +169,9 @@ def test_json(self): |
157 | 169 |
|
158 | 170 | def test_renderer(self): |
159 | 171 | self.app.get('/renderer', status=200) |
160 | | - assert self.rend._received['request'] is not None |
| 172 | + assert self.renderer._received['request'] is not None |
161 | 173 |
|
162 | | - self.rend.assert_(foo='bar') |
| 174 | + self.renderer.assert_(foo='bar') |
163 | 175 | writer = self.tracer.writer |
164 | 176 | spans = writer.pop() |
165 | 177 | eq_(len(spans), 2) |
@@ -195,134 +207,59 @@ def test_http_exception_response(self): |
195 | 207 | eq_(s.meta.get('http.status_code'), '404') |
196 | 208 | eq_(s.meta.get('http.url'), '/404/raise_exception') |
197 | 209 |
|
| 210 | + def test_insert_tween_if_needed_already_set(self): |
| 211 | + settings = {'pyramid.tweens': 'ddtrace.contrib.pyramid:trace_tween_factory'} |
| 212 | + insert_tween_if_needed(settings) |
| 213 | + eq_(settings['pyramid.tweens'], 'ddtrace.contrib.pyramid:trace_tween_factory') |
| 214 | + |
| 215 | + def test_insert_tween_if_needed_none(self): |
| 216 | + settings = {'pyramid.tweens': ''} |
| 217 | + insert_tween_if_needed(settings) |
| 218 | + eq_(settings['pyramid.tweens'], '') |
| 219 | + |
| 220 | + def test_insert_tween_if_needed_excview(self): |
| 221 | + settings = {'pyramid.tweens': 'pyramid.tweens.excview_tween_factory'} |
| 222 | + insert_tween_if_needed(settings) |
| 223 | + eq_(settings['pyramid.tweens'], 'ddtrace.contrib.pyramid:trace_tween_factory\npyramid.tweens.excview_tween_factory') |
| 224 | + |
| 225 | + def test_insert_tween_if_needed_excview_and_other(self): |
| 226 | + settings = {'pyramid.tweens': 'a.first.tween\npyramid.tweens.excview_tween_factory\na.last.tween\n'} |
| 227 | + insert_tween_if_needed(settings) |
| 228 | + eq_(settings['pyramid.tweens'], |
| 229 | + 'a.first.tween\n' |
| 230 | + 'ddtrace.contrib.pyramid:trace_tween_factory\n' |
| 231 | + 'pyramid.tweens.excview_tween_factory\n' |
| 232 | + 'a.last.tween\n') |
| 233 | + |
| 234 | + def test_insert_tween_if_needed_others(self): |
| 235 | + settings = {'pyramid.tweens': 'a.random.tween\nand.another.one'} |
| 236 | + insert_tween_if_needed(settings) |
| 237 | + eq_(settings['pyramid.tweens'], 'a.random.tween\nand.another.one\nddtrace.contrib.pyramid:trace_tween_factory') |
| 238 | + |
| 239 | + def test_include_conflicts(self): |
| 240 | + # test that includes do not create conflicts |
| 241 | + self.override_settings({'pyramid.includes': 'tests.contrib.pyramid.test_pyramid'}) |
| 242 | + self.app.get('/404', status=404) |
| 243 | + spans = self.tracer.writer.pop() |
| 244 | + eq_(len(spans), 1) |
| 245 | + |
198 | 246 |
|
199 | 247 | def includeme(config): |
200 | 248 | pass |
201 | 249 |
|
202 | | -def test_include_conflicts(): |
203 | | - """ Test that includes do not create conflicts """ |
204 | | - tracer = get_dummy_tracer() |
205 | | - with override_global_tracer(tracer): |
206 | | - config = Configurator(settings={'pyramid.includes': 'tests.contrib.pyramid.test_pyramid'}) |
207 | | - trace_pyramid(config) |
208 | | - app = webtest.TestApp(config.make_wsgi_app()) |
209 | | - app.get('/', status=404) |
210 | | - spans = tracer.writer.pop() |
211 | | - assert spans |
212 | | - eq_(len(spans), 1) |
213 | | - |
214 | | -def test_tween_overriden(): |
215 | | - """ In case our tween is overriden by the user config we should not log |
216 | | - rendering """ |
217 | | - tracer = get_dummy_tracer() |
218 | | - with override_global_tracer(tracer): |
219 | | - config = Configurator(settings={'pyramid.tweens': 'pyramid.tweens.excview_tween_factory'}) |
220 | | - trace_pyramid(config) |
221 | | - |
222 | | - def json(request): |
223 | | - return {'a': 1} |
224 | | - config.add_route('json', '/json') |
225 | | - config.add_view(json, route_name='json', renderer='json') |
226 | | - app = webtest.TestApp(config.make_wsgi_app()) |
227 | | - app.get('/json', status=200) |
228 | | - spans = tracer.writer.pop() |
229 | | - assert not spans |
230 | | - |
231 | | -def test_insert_tween_if_needed_already_set(): |
232 | | - settings = {'pyramid.tweens': 'ddtrace.contrib.pyramid:trace_tween_factory'} |
233 | | - insert_tween_if_needed(settings) |
234 | | - eq_(settings['pyramid.tweens'], 'ddtrace.contrib.pyramid:trace_tween_factory') |
235 | | - |
236 | | -def test_insert_tween_if_needed_none(): |
237 | | - settings = {'pyramid.tweens': ''} |
238 | | - insert_tween_if_needed(settings) |
239 | | - eq_(settings['pyramid.tweens'], '') |
240 | | - |
241 | | -def test_insert_tween_if_needed_excview(): |
242 | | - settings = {'pyramid.tweens': 'pyramid.tweens.excview_tween_factory'} |
243 | | - insert_tween_if_needed(settings) |
244 | | - eq_(settings['pyramid.tweens'], 'ddtrace.contrib.pyramid:trace_tween_factory\npyramid.tweens.excview_tween_factory') |
245 | | - |
246 | | -def test_insert_tween_if_needed_excview_and_other(): |
247 | | - settings = {'pyramid.tweens': 'a.first.tween\npyramid.tweens.excview_tween_factory\na.last.tween\n'} |
248 | | - insert_tween_if_needed(settings) |
249 | | - eq_(settings['pyramid.tweens'], |
250 | | - 'a.first.tween\n' |
251 | | - 'ddtrace.contrib.pyramid:trace_tween_factory\n' |
252 | | - 'pyramid.tweens.excview_tween_factory\n' |
253 | | - 'a.last.tween\n') |
254 | | - |
255 | | - |
256 | | -def test_insert_tween_if_needed_others(): |
257 | | - settings = {'pyramid.tweens': 'a.random.tween\nand.another.one'} |
258 | | - insert_tween_if_needed(settings) |
259 | | - eq_(settings['pyramid.tweens'], 'a.random.tween\nand.another.one\nddtrace.contrib.pyramid:trace_tween_factory') |
260 | | - |
261 | | - |
262 | | -def get_app(config): |
263 | | - """ return a pyramid wsgi app with various urls. """ |
264 | | - |
265 | | - def index(request): |
266 | | - return Response('idx') |
267 | | - |
268 | | - def error(request): |
269 | | - raise HTTPInternalServerError("oh no") |
270 | | - |
271 | | - def exception(request): |
272 | | - 1 / 0 |
273 | | - |
274 | | - def json(request): |
275 | | - return {'a': 1} |
276 | | - |
277 | | - def renderer(request): |
278 | | - return render_to_response('template.pt', {'foo': 'bar'}, request=request) |
279 | | - |
280 | | - def raise_redirect(request): |
281 | | - raise HTTPFound() |
282 | | - |
283 | | - def raise_no_content(request): |
284 | | - raise HTTPNoContent() |
285 | | - |
286 | | - config.add_route('index', '/') |
287 | | - config.add_route('error', '/error') |
288 | | - config.add_route('exception', '/exception') |
289 | | - config.add_route('json', '/json') |
290 | | - config.add_route('renderer', '/renderer') |
291 | | - config.add_route('raise_redirect', '/redirect') |
292 | | - config.add_route('raise_no_content', '/nocontent') |
293 | | - config.add_view(index, route_name='index') |
294 | | - config.add_view(error, route_name='error') |
295 | | - config.add_view(exception, route_name='exception') |
296 | | - config.add_view(json, route_name='json', renderer='json') |
297 | | - config.add_view(renderer, route_name='renderer', renderer='template.pt') |
298 | | - config.add_view(raise_redirect, route_name='raise_redirect') |
299 | | - config.add_view(raise_no_content, route_name='raise_no_content') |
300 | | - return config.make_wsgi_app() |
301 | | - |
302 | | - |
303 | | -def custom_exception_view(context, request): |
304 | | - """Custom view that forces a HTTPException when no views |
305 | | - are found to handle given request |
306 | | - """ |
307 | | - if 'raise_exception' in request.url: |
308 | | - raise HTTPNotFound() |
309 | | - else: |
310 | | - return HTTPNotFound() |
311 | | - |
312 | 250 |
|
313 | 251 | class TestPyramid(PyramidBase): |
314 | | - def setUp(self): |
315 | | - self.tracer = get_dummy_tracer() |
316 | | - settings = { |
| 252 | + instrument = True |
| 253 | + |
| 254 | + def get_settings(self): |
| 255 | + return { |
317 | 256 | 'datadog_trace_service': 'foobar', |
318 | | - 'datadog_tracer': self.tracer, |
319 | 257 | } |
320 | 258 |
|
321 | | - config = Configurator(settings=settings) |
322 | | - self.rend = config.testing_add_renderer('template.pt') |
323 | | - # required to reproduce a regression test |
324 | | - config.add_notfound_view(custom_exception_view) |
325 | | - trace_pyramid(config) |
326 | | - |
327 | | - app = get_app(config) |
328 | | - self.app = webtest.TestApp(app) |
| 259 | + def test_tween_overridden(self): |
| 260 | + # in case our tween is overriden by the user config we should |
| 261 | + # not log rendering |
| 262 | + self.override_settings({'pyramid.tweens': 'pyramid.tweens.excview_tween_factory'}) |
| 263 | + self.app.get('/json', status=200) |
| 264 | + spans = self.tracer.writer.pop() |
| 265 | + eq_(len(spans), 0) |
0 commit comments