1111from pyramid .httpexceptions import (
1212 HTTPInternalServerError ,
1313 HTTPFound ,
14- HTTPNoContent
14+ HTTPNotFound ,
15+ HTTPException ,
16+ HTTPNoContent ,
1517)
1618import webtest
17- from nose .tools import eq_
19+ from nose .tools import eq_ , assert_raises
1820
1921# project
2022import ddtrace
2123from ddtrace import compat
2224from ddtrace .contrib .pyramid import trace_pyramid
2325from 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+
2531class 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
195202def includeme (config ):
196203 pass
197204
198205def 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():
212217def 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+
255259def test_insert_tween_if_needed_others ():
256260 settings = {'pyramid.tweens' : 'a.random.tween\n and.another.one' }
257261 insert_tween_if_needed (settings )
258262 eq_ (settings ['pyramid.tweens' ], 'a.random.tween\n and.another.one\n ddtrace.contrib.pyramid:trace_tween_factory' )
259263
264+
260265def 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 )
0 commit comments