3333starlette = pytest .importorskip ("starlette" ) # isort:skip
3434
3535import mock
36-
3736from starlette .applications import Starlette
3837from starlette .responses import PlainTextResponse
3938from starlette .testclient import TestClient
40- from elasticapm .utils .disttracing import TraceParent
41- from elasticapm import async_capture_span
4239
40+ from elasticapm import async_capture_span
4341from elasticapm .conf import constants
4442from elasticapm .contrib .starlette import ElasticAPM
43+ from elasticapm .utils .disttracing import TraceParent
4544
4645pytestmark = [pytest .mark .starlette ]
4746
5049def app (elasticapm_client ):
5150 app = Starlette ()
5251
53- @app .route ("/" )
52+ @app .route ("/" , methods = [ "GET" , "POST" ] )
5453 async def hi (request ):
5554 with async_capture_span ("test" ):
5655 pass
@@ -68,11 +67,14 @@ async def raise_exception(request):
6867def test_get (app , elasticapm_client ):
6968 client = TestClient (app )
7069
71- response = client .get ('/' , headers = {
72- constants .TRACEPARENT_HEADER_NAME : "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-03" ,
73- constants .TRACESTATE_HEADER_NAME : "foo=bar,bar=baz" ,
74- "REMOTE_ADDR" : "127.0.0.1" ,
75- })
70+ response = client .get (
71+ "/" ,
72+ headers = {
73+ constants .TRACEPARENT_HEADER_NAME : "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-03" ,
74+ constants .TRACESTATE_HEADER_NAME : "foo=bar,bar=baz" ,
75+ "REMOTE_ADDR" : "127.0.0.1" ,
76+ },
77+ )
7678
7779 assert response .status_code == 200
7880
@@ -93,15 +95,52 @@ def test_get(app, elasticapm_client):
9395 assert span ["name" ] == "test"
9496
9597
96- def test_exception (app , elasticapm_client ):
98+ @pytest .mark .parametrize ("elasticapm_client" , [{"capture_body" : "all" }], indirect = True )
99+ def test_post (app , elasticapm_client ):
97100 client = TestClient (app )
98101
99- with pytest .raises (ValueError ):
100- client .get ('/raise-exception' , headers = {
102+ response = client .post (
103+ "/" ,
104+ headers = {
101105 constants .TRACEPARENT_HEADER_NAME : "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-03" ,
102106 constants .TRACESTATE_HEADER_NAME : "foo=bar,bar=baz" ,
103107 "REMOTE_ADDR" : "127.0.0.1" ,
104- })
108+ },
109+ data = {"foo" : "bar" },
110+ )
111+
112+ assert response .status_code == 200
113+
114+ assert len (elasticapm_client .events [constants .TRANSACTION ]) == 1
115+ transaction = elasticapm_client .events [constants .TRANSACTION ][0 ]
116+ spans = elasticapm_client .spans_for_transaction (transaction )
117+ assert len (spans ) == 1
118+ span = spans [0 ]
119+
120+ assert transaction ["name" ] == "POST /"
121+ assert transaction ["result" ] == "HTTP 2xx"
122+ assert transaction ["type" ] == "request"
123+ assert transaction ["span_count" ]["started" ] == 1
124+ request = transaction ["context" ]["request" ]
125+ request ["method" ] == "GET"
126+ request ["socket" ] == {"remote_address" : "127.0.0.1" , "encrypted" : False }
127+ assert request ["body" ]["foo" ] == "bar"
128+
129+ assert span ["name" ] == "test"
130+
131+
132+ def test_exception (app , elasticapm_client ):
133+ client = TestClient (app )
134+
135+ with pytest .raises (ValueError ):
136+ client .get (
137+ "/raise-exception" ,
138+ headers = {
139+ constants .TRACEPARENT_HEADER_NAME : "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-03" ,
140+ constants .TRACESTATE_HEADER_NAME : "foo=bar,bar=baz" ,
141+ "REMOTE_ADDR" : "127.0.0.1" ,
142+ },
143+ )
105144
106145 assert len (elasticapm_client .events [constants .TRANSACTION ]) == 1
107146 transaction = elasticapm_client .events [constants .TRANSACTION ][0 ]
@@ -129,10 +168,13 @@ def test_traceparent_handling(app, elasticapm_client, header_name):
129168 with mock .patch (
130169 "elasticapm.contrib.flask.TraceParent.from_string" , wraps = TraceParent .from_string
131170 ) as wrapped_from_string :
132- response = client .get ('/' , headers = {
133- header_name : "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-03" ,
134- constants .TRACESTATE_HEADER_NAME : "foo=bar,baz=bazzinga" ,
135- })
171+ response = client .get (
172+ "/" ,
173+ headers = {
174+ header_name : "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-03" ,
175+ constants .TRACESTATE_HEADER_NAME : "foo=bar,baz=bazzinga" ,
176+ },
177+ )
136178
137179 assert response .status_code == 200
138180
0 commit comments