mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[5.2.x] Refactored logging_tests to reuse assertions for log records.
Backport of 9d72e7daf7 from main.
			
			
This commit is contained in:
		| @@ -98,23 +98,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 | ||||
| @@ -124,7 +129,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") | ||||
| @@ -156,21 +163,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): | ||||
| @@ -707,24 +710,10 @@ 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) | ||||
| @@ -733,7 +722,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) | ||||
| @@ -741,7 +730,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) | ||||
| @@ -749,13 +738,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) | ||||
| @@ -766,14 +755,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) | ||||
| @@ -787,9 +776,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): | ||||
| @@ -803,7 +790,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()) | ||||
| @@ -877,7 +864,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, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user