Skip to content

Commit ca57b47

Browse files
author
Emanuele Palazzetti
committed
[pyramid] test suite refactoring
1 parent 60d9325 commit ca57b47

File tree

4 files changed

+155
-176
lines changed

4 files changed

+155
-176
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .web import create_app # noqa

tests/contrib/pyramid/app/web.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
from ddtrace.contrib.pyramid import trace_pyramid
2+
3+
from pyramid.response import Response
4+
from pyramid.config import Configurator
5+
from pyramid.renderers import render_to_response
6+
from pyramid.httpexceptions import (
7+
HTTPInternalServerError,
8+
HTTPFound,
9+
HTTPNotFound,
10+
HTTPException,
11+
HTTPNoContent,
12+
)
13+
14+
15+
def create_app(settings, instrument):
16+
"""Return a pyramid wsgi app"""
17+
18+
def index(request):
19+
return Response('idx')
20+
21+
def error(request):
22+
raise HTTPInternalServerError("oh no")
23+
24+
def exception(request):
25+
1 / 0
26+
27+
def json(request):
28+
return {'a': 1}
29+
30+
def renderer(request):
31+
return render_to_response('template.pt', {'foo': 'bar'}, request=request)
32+
33+
def raise_redirect(request):
34+
raise HTTPFound()
35+
36+
def raise_no_content(request):
37+
raise HTTPNoContent()
38+
39+
def custom_exception_view(context, request):
40+
"""Custom view that forces a HTTPException when no views
41+
are found to handle given request
42+
"""
43+
if 'raise_exception' in request.url:
44+
raise HTTPNotFound()
45+
else:
46+
return HTTPNotFound()
47+
48+
config = Configurator(settings=settings)
49+
config.add_route('index', '/')
50+
config.add_route('error', '/error')
51+
config.add_route('exception', '/exception')
52+
config.add_route('json', '/json')
53+
config.add_route('renderer', '/renderer')
54+
config.add_route('raise_redirect', '/redirect')
55+
config.add_route('raise_no_content', '/nocontent')
56+
config.add_view(index, route_name='index')
57+
config.add_view(error, route_name='error')
58+
config.add_view(exception, route_name='exception')
59+
config.add_view(json, route_name='json', renderer='json')
60+
config.add_view(renderer, route_name='renderer', renderer='template.pt')
61+
config.add_view(raise_redirect, route_name='raise_redirect')
62+
config.add_view(raise_no_content, route_name='raise_no_content')
63+
# required to reproduce a regression test
64+
config.add_notfound_view(custom_exception_view)
65+
# required for rendering tests
66+
renderer = config.testing_add_renderer('template.pt')
67+
68+
if instrument:
69+
trace_pyramid(config)
70+
71+
return config.make_wsgi_app(), renderer

tests/contrib/pyramid/test_pyramid.py

Lines changed: 75 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,42 @@
1-
# stdlib
21
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-
)
152
import webtest
3+
164
from nose.tools import eq_, assert_raises
175

186
# project
197
from ddtrace import compat
20-
from ddtrace.contrib.pyramid import trace_pyramid
218
from ddtrace.contrib.pyramid.patch import insert_tween_if_needed
229

10+
from pyramid.httpexceptions import HTTPException
11+
12+
from .app import create_app
13+
2314
from ...test_tracer import get_dummy_tracer
2415
from ...util import override_global_tracer
2516

2617

2718
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)
2840

2941
def test_200(self):
3042
res = self.app.get('/', status=200)
@@ -157,9 +169,9 @@ def test_json(self):
157169

158170
def test_renderer(self):
159171
self.app.get('/renderer', status=200)
160-
assert self.rend._received['request'] is not None
172+
assert self.renderer._received['request'] is not None
161173

162-
self.rend.assert_(foo='bar')
174+
self.renderer.assert_(foo='bar')
163175
writer = self.tracer.writer
164176
spans = writer.pop()
165177
eq_(len(spans), 2)
@@ -195,134 +207,59 @@ def test_http_exception_response(self):
195207
eq_(s.meta.get('http.status_code'), '404')
196208
eq_(s.meta.get('http.url'), '/404/raise_exception')
197209

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+
198246

199247
def includeme(config):
200248
pass
201249

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-
312250

313251
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 {
317256
'datadog_trace_service': 'foobar',
318-
'datadog_tracer': self.tracer,
319257
}
320258

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)

tests/contrib/pyramid/test_pyramid_autopatch.py

Lines changed: 8 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,59 +13,29 @@
1313
from ...test_tracer import get_dummy_tracer
1414
from ...util import override_global_tracer
1515

16-
from .test_pyramid import PyramidBase, get_app, custom_exception_view
16+
#from .test_pyramid import PyramidBase, get_app, custom_exception_view
17+
from .test_pyramid import PyramidBase
1718

1819

1920
class TestPyramidAutopatch(PyramidBase):
20-
def setUp(self):
21-
self.tracer = get_dummy_tracer()
22-
ddtrace.tracer = self.tracer
23-
24-
config = Configurator()
25-
self.rend = config.testing_add_renderer('template.pt')
26-
# required to reproduce a regression test
27-
config.add_notfound_view(custom_exception_view)
28-
app = get_app(config)
29-
self.app = webtest.TestApp(app)
21+
instrument = False
3022

3123

3224
class TestPyramidExplicitTweens(PyramidBase):
33-
def setUp(self):
34-
self.tracer = get_dummy_tracer()
35-
ddtrace.tracer = self.tracer
25+
instrument = False
3626

37-
config = Configurator(settings={'pyramid.tweens': 'pyramid.tweens.excview_tween_factory\n'})
38-
self.rend = config.testing_add_renderer('template.pt')
39-
# required to reproduce a regression test
40-
config.add_notfound_view(custom_exception_view)
41-
app = get_app(config)
42-
self.app = webtest.TestApp(app)
27+
def get_settings(self):
28+
return {
29+
'pyramid.tweens': 'pyramid.tweens.excview_tween_factory\n',
30+
}
4331

4432

4533
def _include_me(config):
4634
pass
4735

4836

49-
def includeme(config):
50-
pass
51-
52-
5337
def test_config_include():
5438
""" This test makes sure that relative imports still work when the
5539
application is run with ddtrace-run """
5640
config = Configurator()
5741
config.include('._include_me')
58-
59-
60-
def test_include_conflicts():
61-
""" Test that includes do not create conflicts """
62-
from ...test_tracer import get_dummy_tracer
63-
from ...util import override_global_tracer
64-
tracer = get_dummy_tracer()
65-
with override_global_tracer(tracer):
66-
config = Configurator(settings={'pyramid.includes': 'tests.contrib.pyramid.test_pyramid_autopatch'})
67-
app = webtest.TestApp(config.make_wsgi_app())
68-
app.get('/', status=404)
69-
spans = tracer.writer.pop()
70-
assert spans
71-
eq_(len(spans), 1)

0 commit comments

Comments
 (0)