@@ -705,6 +705,48 @@ def test_user_information_transaction_no_pii(sentry_init, capture_events):
705705 assert "user" not in transaction_event
706706
707707
708+ def test_user_information_does_not_clobber_app_set_user (sentry_init , capture_events ):
709+ """
710+ Regression test for PY-2596/GH-6756: the AuthenticationMiddleware patch must add the
711+ request-derived user *before* the request handler runs, so that a user the app
712+ sets during the request (via ``sentry_sdk.set_user``) is preserved rather than
713+ overwritten. Starlette's ``SimpleUser`` only carries a username, so an app-set
714+ ``id``/``email`` would otherwise be lost.
715+ """
716+ sentry_init (
717+ traces_sample_rate = 1.0 ,
718+ send_default_pii = True ,
719+ integrations = [StarletteIntegration ()],
720+ )
721+
722+ async def _set_user (request ):
723+ sentry_sdk .set_user (
724+ {
725+ "id" : "user_42" ,
726+ "email" : "ada@beans.com" ,
727+ "username" : "Ada" ,
728+ }
729+ )
730+ return starlette .responses .JSONResponse ({"status" : "ok" })
731+
732+ app = starlette .applications .Starlette (
733+ routes = [starlette .routing .Route ("/set_user" , _set_user )],
734+ middleware = [Middleware (AuthenticationMiddleware , backend = BasicAuthBackend ())],
735+ )
736+
737+ events = capture_events ()
738+
739+ client = TestClient (app , raise_server_exceptions = False )
740+ client .get ("/set_user" , auth = ("Ada" , "hello123" ))
741+
742+ (transaction_event ,) = events
743+ user = transaction_event .get ("user" , None )
744+ assert user
745+ assert user ["username" ] == "Ada"
746+ assert user ["id" ] == "user_42"
747+ assert user ["email" ] == "ada@beans.com"
748+
749+
708750@pytest .mark .parametrize ("span_streaming" , [True , False ])
709751def test_middleware_spans (sentry_init , capture_events , capture_items , span_streaming ):
710752 sentry_init (
0 commit comments