Skip to content

Commit d0ca50c

Browse files
author
Emanuele Palazzetti
committed
[pyramid] add regression test to catch HTTPException responses
1 parent 1543495 commit d0ca50c

File tree

3 files changed

+60
-37
lines changed

3 files changed

+60
-37
lines changed

ddtrace/contrib/pyramid/trace.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ def trace_tween(request):
6868
# If the exception is a pyramid HTTPException,
6969
# that's still valuable information that isn't necessarily
7070
# a 500. For instance, HTTPFound is a 302.
71-
response = e # Pyramid exceptions are all valid response types
71+
# As described in docs, Pyramid exceptions are all valid
72+
# response types
73+
response = e
7274
raise
7375
except BaseException:
7476
span.set_tag(http.STATUS_CODE, 500)

tests/contrib/pyramid/test_pyramid.py

Lines changed: 52 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,23 @@
1111
from pyramid.httpexceptions import (
1212
HTTPInternalServerError,
1313
HTTPFound,
14-
HTTPNoContent
14+
HTTPNotFound,
15+
HTTPException,
16+
HTTPNoContent,
1517
)
1618
import webtest
17-
from nose.tools import eq_
19+
from nose.tools import eq_, assert_raises
1820

1921
# project
2022
import ddtrace
2123
from ddtrace import compat
2224
from ddtrace.contrib.pyramid import trace_pyramid
2325
from ddtrace.contrib.pyramid.patch import insert_tween_if_needed
2426

27+
from ...test_tracer import get_dummy_tracer
28+
from ...util import override_global_tracer
29+
30+
2531
class PyramidBase(object):
2632

2733
def test_200(self):
@@ -176,29 +182,28 @@ def test_renderer(self):
176182
eq_(s.error, 0)
177183
eq_(s.span_type, 'template')
178184

179-
class TestPyramid(PyramidBase):
180-
def setUp(self):
181-
from tests.test_tracer import get_dummy_tracer
182-
self.tracer = get_dummy_tracer()
185+
def test_http_exception_response(self):
186+
with assert_raises(HTTPException):
187+
self.app.get('/404/raise_exception', status=404)
183188

184-
settings = {
185-
'datadog_trace_service': 'foobar',
186-
'datadog_tracer': self.tracer
187-
}
188-
config = Configurator(settings=settings)
189-
self.rend = config.testing_add_renderer('template.pt')
190-
trace_pyramid(config)
189+
writer = self.tracer.writer
190+
spans = writer.pop()
191+
eq_(len(spans), 1)
192+
s = spans[0]
193+
eq_(s.service, 'foobar')
194+
eq_(s.resource, '404')
195+
eq_(s.error, 1)
196+
eq_(s.span_type, 'http')
197+
eq_(s.meta.get('http.method'), 'GET')
198+
eq_(s.meta.get('http.status_code'), '404')
199+
eq_(s.meta.get('http.url'), '/404/raise_exception')
191200

192-
app = get_app(config)
193-
self.app = webtest.TestApp(app)
194201

195202
def includeme(config):
196203
pass
197204

198205
def test_include_conflicts():
199206
""" Test that includes do not create conflicts """
200-
from ...test_tracer import get_dummy_tracer
201-
from ...util import override_global_tracer
202207
tracer = get_dummy_tracer()
203208
with override_global_tracer(tracer):
204209
config = Configurator(settings={'pyramid.includes': 'tests.contrib.pyramid.test_pyramid'})
@@ -212,8 +217,6 @@ def test_include_conflicts():
212217
def test_tween_overriden():
213218
""" In case our tween is overriden by the user config we should not log
214219
rendering """
215-
from ...test_tracer import get_dummy_tracer
216-
from ...util import override_global_tracer
217220
tracer = get_dummy_tracer()
218221
with override_global_tracer(tracer):
219222
config = Configurator(settings={'pyramid.tweens': 'pyramid.tweens.excview_tween_factory'})
@@ -252,11 +255,13 @@ def test_insert_tween_if_needed_excview_and_other():
252255
'pyramid.tweens.excview_tween_factory\n'
253256
'a.last.tween\n')
254257

258+
255259
def test_insert_tween_if_needed_others():
256260
settings = {'pyramid.tweens': 'a.random.tween\nand.another.one'}
257261
insert_tween_if_needed(settings)
258262
eq_(settings['pyramid.tweens'], 'a.random.tween\nand.another.one\nddtrace.contrib.pyramid:trace_tween_factory')
259263

264+
260265
def get_app(config):
261266
""" return a pyramid wsgi app with various urls. """
262267

@@ -276,10 +281,10 @@ def renderer(request):
276281
return render_to_response('template.pt', {'foo': 'bar'}, request=request)
277282

278283
def raise_redirect(request):
279-
raise HTTPFound
284+
raise HTTPFound()
280285

281286
def raise_no_content(request):
282-
raise HTTPNoContent
287+
raise HTTPNoContent()
283288

284289
config.add_route('index', '/')
285290
config.add_route('error', '/error')
@@ -298,17 +303,29 @@ def raise_no_content(request):
298303
return config.make_wsgi_app()
299304

300305

301-
if __name__ == '__main__':
302-
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
303-
ddtrace.tracer.debug_logging = True
304-
settings = {
305-
'datadog_trace_service': 'foobar',
306-
'datadog_tracer': ddtrace.tracer
307-
}
308-
config = Configurator(settings=settings)
309-
trace_pyramid(config)
310-
app = get_app(config)
311-
port = 8080
312-
server = make_server('0.0.0.0', port, app)
313-
print('running on %s' % port)
314-
server.serve_forever()
306+
def custom_exception_view(context, request):
307+
"""Custom view that forces a HTTPException when no views
308+
are found to handle given request
309+
"""
310+
if 'raise_exception' in request.url:
311+
raise HTTPNotFound()
312+
else:
313+
return HTTPNotFound()
314+
315+
316+
class TestPyramid(PyramidBase):
317+
def setUp(self):
318+
self.tracer = get_dummy_tracer()
319+
settings = {
320+
'datadog_trace_service': 'foobar',
321+
'datadog_tracer': self.tracer,
322+
}
323+
324+
config = Configurator(settings=settings)
325+
self.rend = config.testing_add_renderer('template.pt')
326+
# required to reproduce a regression test
327+
config.add_notfound_view(custom_exception_view)
328+
trace_pyramid(config)
329+
330+
app = get_app(config)
331+
self.app = webtest.TestApp(app)

tests/contrib/pyramid/test_pyramid_autopatch.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
# project
1212
import ddtrace
13-
from .test_pyramid import PyramidBase, get_app
13+
from .test_pyramid import PyramidBase, get_app, custom_exception_view
1414

1515
class TestPyramidAutopatch(PyramidBase):
1616
def setUp(self):
@@ -20,6 +20,8 @@ def setUp(self):
2020

2121
config = Configurator()
2222
self.rend = config.testing_add_renderer('template.pt')
23+
# required to reproduce a regression test
24+
config.add_notfound_view(custom_exception_view)
2325
app = get_app(config)
2426
self.app = webtest.TestApp(app)
2527

@@ -31,6 +33,8 @@ def setUp(self):
3133

3234
config = Configurator(settings={'pyramid.tweens': 'pyramid.tweens.excview_tween_factory\n'})
3335
self.rend = config.testing_add_renderer('template.pt')
36+
# required to reproduce a regression test
37+
config.add_notfound_view(custom_exception_view)
3438
app = get_app(config)
3539
self.app = webtest.TestApp(app)
3640

0 commit comments

Comments
 (0)