Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion scripts/runtox.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@ else
searchstring="$1"
fi

exec $TOXPATH -p auto -e $(tox -l | grep "$searchstring" | tr '\n' ',') -- "${@:2}"
exec $TOXPATH -p auto -e $($TOXPATH -l | grep "$searchstring" | tr '\n' ',') -- "${@:2}"
188 changes: 102 additions & 86 deletions tests/integrations/tornado/test_tornado.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,115 +8,131 @@
from tornado.testing import AsyncHTTPTestCase


@pytest.fixture
def tornado_testcase(request):
# Take the unittest class provided by tornado and manually call its setUp
# and tearDown.
#
# The pytest plugins for tornado seem too complicated to use, as they for
# some reason assume I want to write my tests in async code.
def inner(app):
class TestBogus(AsyncHTTPTestCase):
def get_app(self):
return app

def bogustest(self):
# We need to pass a valid test method name to the ctor, so this
# is the method. It does nothing.
pass

self = TestBogus("bogustest")
self.setUp()
request.addfinalizer(self.tearDown)
return self

return inner


class CrashingHandler(RequestHandler):
def get(self):
with configure_scope() as scope:
scope.set_tag("foo", 42)
1 / 0


class TestBasic(AsyncHTTPTestCase):
@pytest.fixture(autouse=True)
def initialize(self, sentry_init, capture_events):
sentry_init(integrations=[TornadoIntegration()], send_default_pii=True)
self.events = capture_events()

def get_app(self):

return Application([(r"/hi", CrashingHandler)])

def test_basic(self):
response = self.fetch(
"/hi?foo=bar", headers={"Cookie": "name=value; name2=value2; name3=value3"}
)
assert response.code == 500

event, = self.events
exception, = event["exception"]["values"]
assert exception["type"] == "ZeroDivisionError"

request = event["request"]
host = request["headers"]["Host"]
assert event["request"] == {
"env": {"REMOTE_ADDR": "127.0.0.1"},
"headers": {
"Accept-Encoding": "gzip",
"Connection": "close",
"Host": host,
"Cookie": "name=value; name2=value2; name3=value3",
},
"cookies": {"name": "value", "name2": "value2", "name3": "value3"},
"method": "GET",
"query_string": "foo=bar",
"url": "http://{host}/hi".format(host=host),
}

assert event["tags"] == {"foo": 42}
assert (
event["transaction"]
== "tests.integrations.tornado.test_tornado.CrashingHandler.get"
)
def test_basic(tornado_testcase, sentry_init, capture_events):
sentry_init(integrations=[TornadoIntegration()], send_default_pii=True)
events = capture_events()
client = tornado_testcase(Application([(r"/hi", CrashingHandler)]))

response = client.fetch(
"/hi?foo=bar", headers={"Cookie": "name=value; name2=value2; name3=value3"}
)
assert response.code == 500

event, = events
exception, = event["exception"]["values"]
assert exception["type"] == "ZeroDivisionError"

request = event["request"]
host = request["headers"]["Host"]
assert event["request"] == {
"env": {"REMOTE_ADDR": "127.0.0.1"},
"headers": {
"Accept-Encoding": "gzip",
"Connection": "close",
"Host": host,
"Cookie": "name=value; name2=value2; name3=value3",
},
"cookies": {"name": "value", "name2": "value2", "name3": "value3"},
"method": "GET",
"query_string": "foo=bar",
"url": "http://{host}/hi".format(host=host),
}

assert event["tags"] == {"foo": 42}
assert (
event["transaction"]
== "tests.integrations.tornado.test_tornado.CrashingHandler.get"
)

with configure_scope() as scope:
assert not scope._tags

with configure_scope() as scope:
assert not scope._tags

def test_400_not_logged(tornado_testcase, sentry_init, capture_events):
sentry_init(integrations=[TornadoIntegration()])
events = capture_events()

class Test400NotLogged(AsyncHTTPTestCase):
@pytest.fixture(autouse=True)
def initialize(self, sentry_init, capture_events):
sentry_init(integrations=[TornadoIntegration()])
self.events = capture_events()
class CrashingHandler(RequestHandler):
def get(self):
raise HTTPError(400, "Oops")

def get_app(self):
class CrashingHandler(RequestHandler):
def get(self):
raise HTTPError(400, "Oops")
client = tornado_testcase(Application([(r"/", CrashingHandler)]))

return Application([(r"/", CrashingHandler)])
response = client.fetch("/")
assert response.code == 400

def test_400_not_logged(self):
response = self.fetch("/")
assert response.code == 400
assert not events

assert not self.events

def test_user_auth(tornado_testcase, sentry_init, capture_events):
sentry_init(integrations=[TornadoIntegration()], send_default_pii=True)
events = capture_events()

class TestUserAuth(AsyncHTTPTestCase):
@pytest.fixture(autouse=True)
def initialize(self, sentry_init, capture_events):
sentry_init(integrations=[TornadoIntegration()], send_default_pii=True)
self.events = capture_events()
class UserHandler(RequestHandler):
def get(self):
1 / 0

def get_app(self):
class UserHandler(RequestHandler):
def get(self):
1 / 0
def get_current_user(self):
return 42

def get_current_user(self):
return 42
class NoUserHandler(RequestHandler):
def get(self):
1 / 0

class NoUserHandler(RequestHandler):
def get(self):
1 / 0
client = tornado_testcase(
Application([(r"/auth", UserHandler), (r"/noauth", NoUserHandler)])
)

return Application([(r"/auth", UserHandler), (r"/noauth", NoUserHandler)])
# has user
response = client.fetch("/auth")
assert response.code == 500

def test_has_user(self):
response = self.fetch("/auth")
assert response.code == 500
event, = events
exception, = event["exception"]["values"]
assert exception["type"] == "ZeroDivisionError"

event, = self.events
exception, = event["exception"]["values"]
assert exception["type"] == "ZeroDivisionError"
assert event["user"] == {"is_authenticated": True}

assert event["user"] == {"is_authenticated": True}
events.clear()

def test_has_no_user(self):
response = self.fetch("/noauth")
assert response.code == 500
# has no user
response = client.fetch("/noauth")
assert response.code == 500

event, = self.events
exception, = event["exception"]["values"]
assert exception["type"] == "ZeroDivisionError"
event, = events
exception, = event["exception"]["values"]
assert exception["type"] == "ZeroDivisionError"

assert "user" not in event
assert "user" not in event