11"""
22Test cases for error highlighting, grouping, and frequency tracking.
3+ Error type is captured in-memory (signals, OTel, metrics) but NOT stored in DB.
34"""
45import json
56from unittest .mock import Mock , patch
@@ -86,7 +87,7 @@ def _make_response(self, status, body):
8687 return HttpResponse (
8788 json .dumps (body ),
8889 content_type = 'application/json' ,
89- status = status
90+ status = status ,
9091 )
9192
9293 @override_settings (DRF_API_LOGGER_SIGNAL = True )
@@ -114,31 +115,6 @@ def listener(**kwargs):
114115 finally :
115116 API_LOGGER_SIGNAL .listen -= listener
116117
117- @override_settings (DRF_API_LOGGER_SIGNAL = True )
118- @patch ('drf_api_logger.middleware.api_logger_middleware.resolve' )
119- def test_error_type_in_signal_for_500 (self , mock_resolve ):
120- mock_resolve .return_value .namespace = None
121- mock_resolve .return_value .url_name = 'test'
122-
123- def get_response (request ):
124- return self ._make_response (500 , {'detail' : 'Internal server error' })
125-
126- signal_data = []
127- from drf_api_logger import API_LOGGER_SIGNAL
128- def listener (** kwargs ):
129- signal_data .append (kwargs )
130-
131- API_LOGGER_SIGNAL .listen += listener
132- try :
133- middleware = APILoggerMiddleware (get_response = get_response )
134- request = self .factory .get ('/api/test/' )
135- middleware (request )
136-
137- self .assertEqual (len (signal_data ), 1 )
138- self .assertEqual (signal_data [0 ]['error_type' ], 'Internal server error' )
139- finally :
140- API_LOGGER_SIGNAL .listen -= listener
141-
142118 @override_settings (DRF_API_LOGGER_SIGNAL = True )
143119 @patch ('drf_api_logger.middleware.api_logger_middleware.resolve' )
144120 def test_no_error_type_for_2xx (self , mock_resolve ):
@@ -164,12 +140,10 @@ def listener(**kwargs):
164140 finally :
165141 API_LOGGER_SIGNAL .listen -= listener
166142
167- @override_settings (
168- DRF_API_LOGGER_DATABASE = True ,
169- )
143+ @override_settings (DRF_API_LOGGER_DATABASE = True )
170144 @patch ('drf_api_logger.middleware.api_logger_middleware.resolve' )
171145 @patch ('drf_api_logger.middleware.api_logger_middleware.LOGGER_THREAD' )
172- def test_error_type_in_db_payload (self , mock_thread , mock_resolve ):
146+ def test_error_type_excluded_from_db_payload (self , mock_thread , mock_resolve ):
173147 mock_resolve .return_value .namespace = None
174148 mock_resolve .return_value .url_name = 'test'
175149 mock_thread .put_log_data = Mock ()
@@ -183,39 +157,11 @@ def get_response(request):
183157
184158 mock_thread .put_log_data .assert_called_once ()
185159 call_data = mock_thread .put_log_data .call_args [1 ]['data' ]
186- self .assertEqual (call_data ['error_type' ], 'Permission denied.' )
187-
188-
189- @override_settings (DRF_API_LOGGER_DATABASE = True )
190- class TestErrorModelField (TestCase ):
191-
192- def test_create_log_with_error_type (self ):
193- from drf_api_logger .models import APILogsModel
194- log = APILogsModel .objects .create (
195- api = '/api/test/' , headers = '{}' , body = '' , method = 'GET' ,
196- client_ip_address = '127.0.0.1' , response = '{"detail": "Not found."}' ,
197- status_code = 404 , execution_time = 0.01 , added_on = timezone .now (),
198- error_type = 'Not found.' ,
199- )
200- self .assertEqual (log .error_type , 'Not found.' )
201-
202- def test_create_log_without_error_type (self ):
203- from drf_api_logger .models import APILogsModel
204- log = APILogsModel .objects .create (
205- api = '/api/test/' , headers = '{}' , body = '' , method = 'GET' ,
206- client_ip_address = '127.0.0.1' , response = '{}' ,
207- status_code = 200 , execution_time = 0.01 , added_on = timezone .now (),
208- )
209- self .assertIsNone (log .error_type )
210-
211- def test_error_type_indexed (self ):
212- from drf_api_logger .models import APILogsModel
213- field = APILogsModel ._meta .get_field ('error_type' )
214- self .assertTrue (field .db_index )
160+ self .assertNotIn ('error_type' , call_data )
215161
216162
217163@override_settings (DRF_API_LOGGER_DATABASE = True )
218- class TestErrorGrouping (TestCase ):
164+ class TestErrorGroupingByStatusCode (TestCase ):
219165
220166 def setUp (self ):
221167 from drf_api_logger .models import APILogsModel
@@ -227,28 +173,25 @@ def setUp(self):
227173 api = '/api/users/' , headers = '{}' , body = '' , method = 'GET' ,
228174 client_ip_address = '127.0.0.1' , response = '{}' ,
229175 status_code = 404 , execution_time = 0.01 , added_on = now ,
230- error_type = 'Not found.' ,
231176 )
232177 for i in range (3 ):
233178 APILogsModel .objects .create (
234179 api = '/api/orders/' , headers = '{}' , body = '' , method = 'POST' ,
235180 client_ip_address = '127.0.0.1' , response = '{}' ,
236181 status_code = 400 , execution_time = 0.02 , added_on = now ,
237- error_type = 'BadRequest' ,
238182 )
239183 for i in range (2 ):
240184 APILogsModel .objects .create (
241185 api = '/api/users/' , headers = '{}' , body = '' , method = 'POST' ,
242186 client_ip_address = '127.0.0.1' , response = '{}' ,
243187 status_code = 500 , execution_time = 1.5 , added_on = now ,
244- error_type = 'InternalServerError' ,
245188 )
246189
247- def test_group_by_endpoint (self ):
190+ def test_group_by_endpoint_and_status (self ):
248191 from django .db .models import Count
249192 groups = list (
250193 self .APILogsModel .objects .filter (status_code__gte = 400 )
251- .values ('api' , 'status_code' , 'error_type' )
194+ .values ('api' , 'status_code' )
252195 .annotate (count = Count ('id' ))
253196 .order_by ('-count' )
254197 )
@@ -257,22 +200,20 @@ def test_group_by_endpoint(self):
257200 self .assertEqual (groups [0 ]['status_code' ], 404 )
258201 self .assertEqual (groups [0 ]['count' ], 5 )
259202
260- def test_group_by_error_type (self ):
203+ def test_group_by_status_code (self ):
261204 from django .db .models import Count
262205 groups = list (
263206 self .APILogsModel .objects .filter (status_code__gte = 400 )
264- .values ('error_type ' )
207+ .values ('status_code ' )
265208 .annotate (count = Count ('id' ))
266209 .order_by ('-count' )
267210 )
268211 self .assertEqual (len (groups ), 3 )
269- self .assertEqual (groups [0 ]['error_type' ], 'Not found.' )
270212 self .assertEqual (groups [0 ]['count' ], 5 )
271213
272214 def test_error_rate (self ):
273215 total = self .APILogsModel .objects .count ()
274216 errors = self .APILogsModel .objects .filter (status_code__gte = 400 ).count ()
275217 rate = round ((errors / total ) * 100 , 1 )
276218 self .assertEqual (errors , 10 )
277- self .assertEqual (total , 10 )
278219 self .assertEqual (rate , 100.0 )
0 commit comments