From ba24ee34f98cb17d99b1f82bc1ede45ff311a70b Mon Sep 17 00:00:00 2001 From: Natalia <124304+nessita@users.noreply.github.com> Date: Wed, 4 Jun 2025 16:12:13 -0300 Subject: [PATCH] [4.2.x] Refactored logging_tests to reuse assertions for log records. Backport of 9d72e7daf7299ef1ece56fd657a02f77a469efe9 from main. --- tests/logging_tests/tests.py | 61 ++++++++++++++---------------------- 1 file changed, 24 insertions(+), 37 deletions(-) diff --git a/tests/logging_tests/tests.py b/tests/logging_tests/tests.py index cda0a62f2c..03409094f2 100644 --- a/tests/logging_tests/tests.py +++ b/tests/logging_tests/tests.py @@ -97,23 +97,28 @@ class LoggingAssertionMixin: def assertLogRecord( self, logger_cm, - level, msg, + levelno, status_code, + request=None, exc_class=None, ): self.assertEqual( records_len := len(logger_cm.records), 1, - f"Wrong number of calls for {logger_cm=} in {level=} (expected 1, got " + f"Wrong number of calls for {logger_cm=} in {levelno=} (expected 1, got " f"{records_len}).", ) record = logger_cm.records[0] self.assertEqual(record.getMessage(), msg) + self.assertEqual(record.levelno, levelno) self.assertEqual(record.status_code, status_code) + if request is not None: + self.assertEqual(record.request, request) if exc_class: self.assertIsNotNone(record.exc_info) self.assertEqual(record.exc_info[0], exc_class) + return record def assertLogsRequest( self, url, level, msg, status_code, logger="django.request", exc_class=None @@ -123,7 +128,9 @@ class LoggingAssertionMixin: self.client.get(url) except views.UncaughtException: pass - self.assertLogRecord(cm, level, msg, status_code, exc_class) + self.assertLogRecord( + cm, msg, getattr(logging, level), status_code, exc_class=exc_class + ) @override_settings(DEBUG=True, ROOT_URLCONF="logging_tests.urls") @@ -155,21 +162,17 @@ class HandlerLoggingTests( ) async def test_async_page_not_found_warning(self): - logger = "django.request" - level = "WARNING" - with self.assertLogs(logger, level) as cm: + with self.assertLogs("django.request", "WARNING") as cm: await self.async_client.get("/does_not_exist/") - self.assertLogRecord(cm, level, "Not Found: /does_not_exist/", 404) + self.assertLogRecord(cm, "Not Found: /does_not_exist/", logging.WARNING, 404) async def test_async_control_chars_escaped(self): - logger = "django.request" - level = "WARNING" - with self.assertLogs(logger, level) as cm: + with self.assertLogs("django.request", "WARNING") as cm: await self.async_client.get(r"/%1B[1;31mNOW IN RED!!!1B[0m/") self.assertLogRecord( - cm, level, r"Not Found: /\x1b[1;31mNOW IN RED!!!1B[0m/", 404 + cm, r"Not Found: /\x1b[1;31mNOW IN RED!!!1B[0m/", logging.WARNING, 404 ) def test_page_not_found_raised(self): @@ -688,23 +691,9 @@ class LogFormattersTests(SimpleTestCase): ) -class LogResponseRealLoggerTests(TestCase): +class LogResponseRealLoggerTests(LoggingAssertionMixin, TestCase): request = RequestFactory().get("/test-path/") - def assertResponseLogged(self, logger_cm, msg, levelno, status_code, request): - self.assertEqual( - records_len := len(logger_cm.records), - 1, - f"Unexpected number of records for {logger_cm=} in {levelno=} (expected 1, " - f"got {records_len}).", - ) - record = logger_cm.records[0] - self.assertEqual(record.getMessage(), msg) - self.assertEqual(record.levelno, levelno) - self.assertEqual(record.status_code, status_code) - self.assertEqual(record.request, request) - return record - def test_missing_response_raises_attribute_error(self): with self.assertRaises(AttributeError): log_response("No response provided", response=None, request=self.request) @@ -713,7 +702,7 @@ class LogResponseRealLoggerTests(TestCase): response = HttpResponse(status=403) with self.assertLogs("django.request", level="INFO") as cm: log_response(msg := "Missing request", response=response, request=None) - self.assertResponseLogged(cm, msg, logging.WARNING, 403, request=None) + self.assertLogRecord(cm, msg, logging.WARNING, 403, request=None) def test_logs_5xx_as_error(self): response = HttpResponse(status=508) @@ -721,7 +710,7 @@ class LogResponseRealLoggerTests(TestCase): log_response( msg := "Server error occurred", response=response, request=self.request ) - self.assertResponseLogged(cm, msg, logging.ERROR, 508, self.request) + self.assertLogRecord(cm, msg, logging.ERROR, 508, self.request) def test_logs_4xx_as_warning(self): response = HttpResponse(status=418) @@ -729,13 +718,13 @@ class LogResponseRealLoggerTests(TestCase): log_response( msg := "This is a teapot!", response=response, request=self.request ) - self.assertResponseLogged(cm, msg, logging.WARNING, 418, self.request) + self.assertLogRecord(cm, msg, logging.WARNING, 418, self.request) def test_logs_2xx_as_info(self): response = HttpResponse(status=201) with self.assertLogs("django.request", level="INFO") as cm: log_response(msg := "OK response", response=response, request=self.request) - self.assertResponseLogged(cm, msg, logging.INFO, 201, self.request) + self.assertLogRecord(cm, msg, logging.INFO, 201, self.request) def test_custom_log_level(self): response = HttpResponse(status=403) @@ -746,14 +735,14 @@ class LogResponseRealLoggerTests(TestCase): request=self.request, level="debug", ) - self.assertResponseLogged(cm, msg, logging.DEBUG, 403, self.request) + self.assertLogRecord(cm, msg, logging.DEBUG, 403, self.request) def test_logs_only_once_per_response(self): response = HttpResponse(status=500) with self.assertLogs("django.request", level="ERROR") as cm: log_response("First log", response=response, request=self.request) log_response("Second log", response=response, request=self.request) - self.assertResponseLogged(cm, "First log", logging.ERROR, 500, self.request) + self.assertLogRecord(cm, "First log", logging.ERROR, 500, self.request) def test_exc_info_output(self): response = HttpResponse(status=500) @@ -767,9 +756,7 @@ class LogResponseRealLoggerTests(TestCase): request=self.request, exception=exc, ) - self.assertResponseLogged( - cm, "With exception", logging.ERROR, 500, self.request - ) + self.assertLogRecord(cm, "With exception", logging.ERROR, 500, self.request) self.assertIn("ValueError", "\n".join(cm.output)) # Stack trace included def test_format_args_are_applied(self): @@ -783,7 +770,7 @@ class LogResponseRealLoggerTests(TestCase): request=self.request, ) msg = "Something went wrong: DB error (42)" - self.assertResponseLogged(cm, msg, logging.ERROR, 500, self.request) + self.assertLogRecord(cm, msg, logging.ERROR, 500, self.request) def test_logs_with_custom_logger(self): handler = logging.StreamHandler(log_stream := StringIO()) @@ -855,7 +842,7 @@ class LogResponseRealLoggerTests(TestCase): response = HttpResponse(status=318) log_response(msg, case, response=response, level="error") - record = self.assertResponseLogged( + record = self.assertLogRecord( cm, msg % expected, levelno=logging.ERROR,