Files
2020-04-08 10:39:44 -07:00

121 lines
4.3 KiB
Python

import asyncio
import aiohttp_jinja2
from aiohttp.test_utils import unittest_run_loop
from ddtrace.pin import Pin
from ddtrace.contrib.aiohttp.patch import patch, unpatch
from .utils import TraceTestCase
from .app.web import set_filesystem_loader, set_package_loader
class TestTraceTemplate(TraceTestCase):
"""
Ensures that the aiohttp_jinja2 library is properly traced.
"""
def enable_tracing(self):
patch()
Pin.override(aiohttp_jinja2, tracer=self.tracer)
def disable_tracing(self):
unpatch()
@unittest_run_loop
@asyncio.coroutine
def test_template_rendering(self):
# it should trace a template rendering
request = yield from self.client.request('GET', '/template/')
assert 200 == request.status
text = yield from request.text()
assert 'OK' == text
# the trace is created
traces = self.tracer.writer.pop_traces()
assert 1 == len(traces)
assert 1 == len(traces[0])
span = traces[0][0]
# with the right fields
assert 'aiohttp.template' == span.name
assert 'template' == span.span_type
assert '/template.jinja2' == span.get_tag('aiohttp.template')
assert 0 == span.error
@unittest_run_loop
@asyncio.coroutine
def test_template_rendering_filesystem(self):
# it should trace a template rendering with a FileSystemLoader
set_filesystem_loader(self.app)
request = yield from self.client.request('GET', '/template/')
assert 200 == request.status
text = yield from request.text()
assert 'OK' == text
# the trace is created
traces = self.tracer.writer.pop_traces()
assert 1 == len(traces)
assert 1 == len(traces[0])
span = traces[0][0]
# with the right fields
assert 'aiohttp.template' == span.name
assert 'template' == span.span_type
assert '/template.jinja2' == span.get_tag('aiohttp.template')
assert 0 == span.error
@unittest_run_loop
@asyncio.coroutine
def test_template_rendering_package(self):
# it should trace a template rendering with a PackageLoader
set_package_loader(self.app)
request = yield from self.client.request('GET', '/template/')
assert 200 == request.status
text = yield from request.text()
assert 'OK' == text
# the trace is created
traces = self.tracer.writer.pop_traces()
assert 1 == len(traces)
assert 1 == len(traces[0])
span = traces[0][0]
# with the right fields
assert 'aiohttp.template' == span.name
assert 'template' == span.span_type
assert 'templates/template.jinja2' == span.get_tag('aiohttp.template')
assert 0 == span.error
@unittest_run_loop
@asyncio.coroutine
def test_template_decorator(self):
# it should trace a template rendering
request = yield from self.client.request('GET', '/template_decorator/')
assert 200 == request.status
text = yield from request.text()
assert 'OK' == text
# the trace is created
traces = self.tracer.writer.pop_traces()
assert 1 == len(traces)
assert 1 == len(traces[0])
span = traces[0][0]
# with the right fields
assert 'aiohttp.template' == span.name
assert 'template' == span.span_type
assert '/template.jinja2' == span.get_tag('aiohttp.template')
assert 0 == span.error
@unittest_run_loop
@asyncio.coroutine
def test_template_error(self):
# it should trace a template rendering
request = yield from self.client.request('GET', '/template_error/')
assert 500 == request.status
yield from request.text()
# the trace is created
traces = self.tracer.writer.pop_traces()
assert 1 == len(traces)
assert 1 == len(traces[0])
span = traces[0][0]
# with the right fields
assert 'aiohttp.template' == span.name
assert 'template' == span.span_type
assert '/error.jinja2' == span.get_tag('aiohttp.template')
assert 1 == span.error
assert 'division by zero' == span.get_tag('error.msg')
assert 'ZeroDivisionError: division by zero' in span.get_tag('error.stack')