@@ -12,6 +12,28 @@ def app(environ, start_response):
1212 return app
1313
1414
15+ class IterableApp (object ):
16+ def __init__ (self , iterable ):
17+ self .iterable = iterable
18+
19+ def __call__ (self , environ , start_response ):
20+ return self .iterable
21+
22+
23+ class ExitingIterable (object ):
24+ def __init__ (self , exc_func ):
25+ self ._exc_func = exc_func
26+
27+ def __iter__ (self ):
28+ return self
29+
30+ def __next__ (self ):
31+ raise self ._exc_func ()
32+
33+ def next (self ):
34+ return type (self ).__next__ (self )
35+
36+
1537def test_basic (sentry_init , crashing_app , capture_events ):
1638 sentry_init (send_default_pii = True )
1739 app = SentryWsgiMiddleware (crashing_app )
@@ -30,3 +52,58 @@ def test_basic(sentry_init, crashing_app, capture_events):
3052 "query_string" : "" ,
3153 "url" : "http://localhost/" ,
3254 }
55+
56+
57+ @pytest .fixture (params = [0 , None ])
58+ def test_systemexit_zero_is_ignored (sentry_init , capture_events , request ):
59+ zero_code = request .param
60+ sentry_init (send_default_pii = True )
61+ iterable = ExitingIterable (lambda : SystemExit (zero_code ))
62+ app = SentryWsgiMiddleware (IterableApp (iterable ))
63+ client = Client (app )
64+ events = capture_events ()
65+
66+ with pytest .raises (SystemExit ):
67+ client .get ("/" )
68+
69+ assert len (events ) == 0
70+
71+
72+ @pytest .fixture (params = ["" , "foo" , 1 , 2 ])
73+ def test_systemexit_nonzero_is_captured (sentry_init , capture_events , request ):
74+ nonzero_code = request .param
75+ sentry_init (send_default_pii = True )
76+ iterable = ExitingIterable (lambda : SystemExit (nonzero_code ))
77+ app = SentryWsgiMiddleware (IterableApp (iterable ))
78+ client = Client (app )
79+ events = capture_events ()
80+
81+ with pytest .raises (SystemExit ):
82+ client .get ("/" )
83+
84+ event , = events
85+
86+ assert "exception" in event
87+ exc = event ["exception" ]["values" ][- 1 ]
88+ assert exc ["type" ] == "SystemExit"
89+ assert exc ["value" ] == nonzero_code
90+ assert event ["level" ] == "error"
91+
92+
93+ def test_keyboard_interrupt_is_captured (sentry_init , capture_events ):
94+ sentry_init (send_default_pii = True )
95+ iterable = ExitingIterable (lambda : KeyboardInterrupt ())
96+ app = SentryWsgiMiddleware (IterableApp (iterable ))
97+ client = Client (app )
98+ events = capture_events ()
99+
100+ with pytest .raises (KeyboardInterrupt ):
101+ client .get ("/" )
102+
103+ event , = events
104+
105+ assert "exception" in event
106+ exc = event ["exception" ]["values" ][- 1 ]
107+ assert exc ["type" ] == "KeyboardInterrupt"
108+ assert exc ["value" ] == ""
109+ assert event ["level" ] == "error"
0 commit comments