55import pytest
66import sentry_sdk
77from sentry_sdk import Transport
8-
9- from sentry_sdk .utils import capture_internal_exceptions
8+ from sentry_sdk .envelope import Envelope
109
1110
1211@pytest .fixture
@@ -62,100 +61,102 @@ def test_transaction_is_jsonrpc_method(
6261 ]) == {'test_sentry.probe.<locals>.probe' , 'test_sentry.probe.<locals>.probe2' }
6362
6463
65- class _TestTransport (Transport ):
66- def __init__ (self , capture_event_callback , capture_envelope_callback ):
64+ class TestTransport (Transport ):
65+ def __init__ (self ):
6766 Transport .__init__ (self )
68- self .capture_event = capture_event_callback
69- self .capture_envelope = capture_envelope_callback
70- self ._queue = None
71-
72-
73- @pytest .fixture
74- def monkeypatch_test_transport (monkeypatch ):
75- def check_event (event ):
76- def check_string_keys (map ):
77- for key , value in map .items :
78- assert isinstance (key , str )
79- if isinstance (value , dict ):
80- check_string_keys (value )
81-
82- with capture_internal_exceptions ():
83- check_string_keys (event )
84-
85- def check_envelope (envelope ):
86- with capture_internal_exceptions ():
87- # Assert error events are sent without envelope to server, for compat.
88- # This does not apply if any item in the envelope is an attachment.
89- if not any (x .type == "attachment" for x in envelope .items ):
90- assert not any (item .data_category == "error" for item in envelope .items )
91- assert not any (item .get_event () is not None for item in envelope .items )
92-
93- def inner (client ):
94- monkeypatch .setattr (
95- client , "transport" , _TestTransport (check_event , check_envelope )
96- )
9767
98- return inner
68+ def capture_envelope (self , _ : Envelope ) -> None :
69+ """No-op capture_envelope for tests"""
70+ pass
9971
10072
10173@pytest .fixture
102- def sentry_init (monkeypatch_test_transport , request ):
74+ def sentry_init (request ):
10375 def inner (* a , ** kw ):
104- hub = sentry_sdk . Hub . current
76+ kw . setdefault ( "transport" , TestTransport ())
10577 client = sentry_sdk .Client (* a , ** kw )
106- hub .bind_client (client )
107- if "transport" not in kw :
108- monkeypatch_test_transport (sentry_sdk .Hub .current .client )
78+ sentry_sdk .get_global_scope ().set_client (client )
10979
11080 if request .node .get_closest_marker ("forked" ):
11181 # Do not run isolation if the test is already running in
11282 # ultimate isolation (seems to be required for celery tests that
11383 # fork)
11484 yield inner
11585 else :
116- with sentry_sdk .Hub (None ):
86+ old_client = sentry_sdk .get_global_scope ().client
87+ try :
88+ sentry_sdk .get_current_scope ().set_client (None )
11789 yield inner
90+ finally :
91+ sentry_sdk .get_global_scope ().set_client (old_client )
11892
11993
12094@pytest .fixture
12195def capture_events (monkeypatch ):
12296 def inner ():
12397 events = []
124- test_client = sentry_sdk .Hub .current .client
125- old_capture_event = test_client .transport .capture_event
98+ test_client = sentry_sdk .get_client ()
12699 old_capture_envelope = test_client .transport .capture_envelope
127100
128- def append_event (event ):
129- events .append (event )
130- return old_capture_event (event )
131-
132- def append_envelope (envelope ):
101+ def append_event (envelope ):
133102 for item in envelope :
134103 if item .headers .get ("type" ) in ("event" , "transaction" ):
135- test_client . transport . capture_event (item .payload .json )
104+ events . append (item .payload .json )
136105 return old_capture_envelope (envelope )
137106
138- monkeypatch .setattr (test_client .transport , "capture_event " , append_event )
139- monkeypatch . setattr ( test_client . transport , "capture_envelope" , append_envelope )
107+ monkeypatch .setattr (test_client .transport , "capture_envelope " , append_event )
108+
140109 return events
141110
142111 return inner
143112
144113
114+ @pytest .fixture
115+ def capture_envelopes (monkeypatch ):
116+ def inner ():
117+ envelopes = []
118+ test_client = sentry_sdk .get_client ()
119+ old_capture_envelope = test_client .transport .capture_envelope
120+
121+ def append_envelope (envelope ):
122+ envelopes .append (envelope )
123+ return old_capture_envelope (envelope )
124+
125+ monkeypatch .setattr (test_client .transport , "capture_envelope" , append_envelope )
126+
127+ return envelopes
128+
129+ return inner
130+
131+
132+
145133@pytest .fixture
146134def capture_exceptions (monkeypatch ):
147135 def inner ():
148136 errors = set ()
149- old_capture_event = sentry_sdk .Hub .capture_event
137+ old_capture_event_hub = sentry_sdk .Hub .capture_event
138+ old_capture_event_scope = sentry_sdk .Scope .capture_event
150139
151- def capture_event (self , event , hint = None ):
140+ def capture_event_hub (self , event , hint = None , scope = None ):
141+ """
142+ Can be removed when we remove push_scope and the Hub from the SDK.
143+ """
152144 if hint :
153145 if "exc_info" in hint :
154146 error = hint ["exc_info" ][1 ]
155147 errors .add (error )
156- return old_capture_event (self , event , hint = hint )
148+ return old_capture_event_hub (self , event , hint = hint , scope = scope )
149+
150+ def capture_event_scope (self , event , hint = None , scope = None ):
151+ if hint :
152+ if "exc_info" in hint :
153+ error = hint ["exc_info" ][1 ]
154+ errors .add (error )
155+ return old_capture_event_scope (self , event , hint = hint , scope = scope )
156+
157+ monkeypatch .setattr (sentry_sdk .Hub , "capture_event" , capture_event_hub )
158+ monkeypatch .setattr (sentry_sdk .Scope , "capture_event" , capture_event_scope )
157159
158- monkeypatch .setattr (sentry_sdk .Hub , "capture_event" , capture_event )
159160 return errors
160161
161- return inner
162+ return inner
0 commit comments