@@ -36,10 +36,19 @@ def test_middleware_should_call_apilytics_api(
3636 }
3737
3838 data = tests .conftest .decode_request_data (call_kwargs ["data" ])
39- assert data .keys () == {"path" , "method" , "statusCode" , "timeMillis" }
39+ assert data .keys () == {
40+ "path" ,
41+ "method" ,
42+ "statusCode" ,
43+ "requestSize" ,
44+ "responseSize" ,
45+ "timeMillis" ,
46+ }
4047 assert data ["path" ] == "/"
4148 assert data ["method" ] == "GET"
4249 assert data ["statusCode" ] == 200
50+ assert data ["requestSize" ] == 0
51+ assert data ["responseSize" ] > 0
4352 assert isinstance (data ["timeMillis" ], int )
4453
4554
@@ -57,6 +66,64 @@ def test_middleware_should_send_query_params(
5766 assert data ["path" ] == "/dummy/123/path/"
5867 assert data ["query" ] == "param=foo¶m2=bar"
5968 assert data ["statusCode" ] == 201
69+ assert data ["requestSize" ] == 20 # Empty form data POST adds a 20 boundary string.
70+ assert data ["responseSize" ] > 0
71+ assert isinstance (data ["timeMillis" ], int )
72+
73+
74+ def test_middleware_should_send_zero_request_and_response_sizes (
75+ mocked_urlopen : unittest .mock .MagicMock ,
76+ ) -> None :
77+ client .handler .load_middleware ()
78+ response = client .post ("/empty?some=query" , content_type = "application/json" )
79+ assert response .status_code == 200
80+
81+ assert mocked_urlopen .call_count == 1
82+ __ , call_kwargs = mocked_urlopen .call_args
83+ data = tests .conftest .decode_request_data (call_kwargs ["data" ])
84+ assert data ["requestSize" ] == 2 # Django makes it `b"{}"` for empty JSON POSTs.
85+ assert data ["responseSize" ] == 0
86+
87+
88+ def test_middleware_should_send_non_zero_request_and_response_sizes (
89+ mocked_urlopen : unittest .mock .MagicMock ,
90+ ) -> None :
91+ client .handler .load_middleware ()
92+ response = client .post (
93+ "/dummy?some=query" , data = {"hello" : "world" }, content_type = "application/json"
94+ )
95+ assert response .status_code == 201
96+
97+ assert mocked_urlopen .call_count == 1
98+ __ , call_kwargs = mocked_urlopen .call_args
99+ data = tests .conftest .decode_request_data (call_kwargs ["data" ])
100+ assert data ["requestSize" ] == 18
101+ assert data ["responseSize" ] == 7 # `len(b"created")`
102+
103+
104+ def test_middleware_should_work_with_streaming_response (
105+ mocked_urlopen : unittest .mock .MagicMock ,
106+ ) -> None :
107+ client .handler .load_middleware ()
108+ response = client .get ("/streaming" )
109+ assert response .status_code == 200
110+
111+ assert mocked_urlopen .call_count == 1
112+ __ , call_kwargs = mocked_urlopen .call_args
113+ data = tests .conftest .decode_request_data (call_kwargs ["data" ])
114+ assert data .keys () == {
115+ "path" ,
116+ "method" ,
117+ "statusCode" ,
118+ "requestSize" ,
119+ "responseSize" ,
120+ "timeMillis" ,
121+ }
122+ assert data ["path" ] == "/streaming"
123+ assert data ["method" ] == "GET"
124+ assert data ["statusCode" ] == 200
125+ assert data ["requestSize" ] == 0
126+ assert data ["responseSize" ] == 0 # Can't get body size from a streaming response.
60127 assert isinstance (data ["timeMillis" ], int )
61128
62129
@@ -84,7 +151,17 @@ def test_middleware_should_send_data_even_on_errors(
84151
85152 __ , call_kwargs = mocked_urlopen .call_args
86153 data = tests .conftest .decode_request_data (call_kwargs ["data" ])
154+ assert data .keys () == {
155+ "method" ,
156+ "path" ,
157+ "timeMillis" ,
158+ "statusCode" ,
159+ "requestSize" ,
160+ "responseSize" ,
161+ }
87162 assert data ["method" ] == "GET"
88163 assert data ["path" ] == "/error"
89164 assert data ["statusCode" ] == 500
165+ assert data ["requestSize" ] == 0
166+ assert data ["responseSize" ] > 0
90167 assert isinstance (data ["timeMillis" ], int )
0 commit comments