mirror of
https://github.com/django/django.git
synced 2025-06-15 16:39:13 +00:00
[4.2.x] Refactored logging_tests to reuse assertions for log records.
Backport of 9d72e7daf7299ef1ece56fd657a02f77a469efe9 from main.
This commit is contained in:
parent
b07f886af7
commit
ba24ee34f9
@ -97,23 +97,28 @@ class LoggingAssertionMixin:
|
|||||||
def assertLogRecord(
|
def assertLogRecord(
|
||||||
self,
|
self,
|
||||||
logger_cm,
|
logger_cm,
|
||||||
level,
|
|
||||||
msg,
|
msg,
|
||||||
|
levelno,
|
||||||
status_code,
|
status_code,
|
||||||
|
request=None,
|
||||||
exc_class=None,
|
exc_class=None,
|
||||||
):
|
):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
records_len := len(logger_cm.records),
|
records_len := len(logger_cm.records),
|
||||||
1,
|
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}).",
|
f"{records_len}).",
|
||||||
)
|
)
|
||||||
record = logger_cm.records[0]
|
record = logger_cm.records[0]
|
||||||
self.assertEqual(record.getMessage(), msg)
|
self.assertEqual(record.getMessage(), msg)
|
||||||
|
self.assertEqual(record.levelno, levelno)
|
||||||
self.assertEqual(record.status_code, status_code)
|
self.assertEqual(record.status_code, status_code)
|
||||||
|
if request is not None:
|
||||||
|
self.assertEqual(record.request, request)
|
||||||
if exc_class:
|
if exc_class:
|
||||||
self.assertIsNotNone(record.exc_info)
|
self.assertIsNotNone(record.exc_info)
|
||||||
self.assertEqual(record.exc_info[0], exc_class)
|
self.assertEqual(record.exc_info[0], exc_class)
|
||||||
|
return record
|
||||||
|
|
||||||
def assertLogsRequest(
|
def assertLogsRequest(
|
||||||
self, url, level, msg, status_code, logger="django.request", exc_class=None
|
self, url, level, msg, status_code, logger="django.request", exc_class=None
|
||||||
@ -123,7 +128,9 @@ class LoggingAssertionMixin:
|
|||||||
self.client.get(url)
|
self.client.get(url)
|
||||||
except views.UncaughtException:
|
except views.UncaughtException:
|
||||||
pass
|
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")
|
@override_settings(DEBUG=True, ROOT_URLCONF="logging_tests.urls")
|
||||||
@ -155,21 +162,17 @@ class HandlerLoggingTests(
|
|||||||
)
|
)
|
||||||
|
|
||||||
async def test_async_page_not_found_warning(self):
|
async def test_async_page_not_found_warning(self):
|
||||||
logger = "django.request"
|
with self.assertLogs("django.request", "WARNING") as cm:
|
||||||
level = "WARNING"
|
|
||||||
with self.assertLogs(logger, level) as cm:
|
|
||||||
await self.async_client.get("/does_not_exist/")
|
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):
|
async def test_async_control_chars_escaped(self):
|
||||||
logger = "django.request"
|
with self.assertLogs("django.request", "WARNING") as cm:
|
||||||
level = "WARNING"
|
|
||||||
with self.assertLogs(logger, level) as cm:
|
|
||||||
await self.async_client.get(r"/%1B[1;31mNOW IN RED!!!1B[0m/")
|
await self.async_client.get(r"/%1B[1;31mNOW IN RED!!!1B[0m/")
|
||||||
|
|
||||||
self.assertLogRecord(
|
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):
|
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/")
|
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):
|
def test_missing_response_raises_attribute_error(self):
|
||||||
with self.assertRaises(AttributeError):
|
with self.assertRaises(AttributeError):
|
||||||
log_response("No response provided", response=None, request=self.request)
|
log_response("No response provided", response=None, request=self.request)
|
||||||
@ -713,7 +702,7 @@ class LogResponseRealLoggerTests(TestCase):
|
|||||||
response = HttpResponse(status=403)
|
response = HttpResponse(status=403)
|
||||||
with self.assertLogs("django.request", level="INFO") as cm:
|
with self.assertLogs("django.request", level="INFO") as cm:
|
||||||
log_response(msg := "Missing request", response=response, request=None)
|
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):
|
def test_logs_5xx_as_error(self):
|
||||||
response = HttpResponse(status=508)
|
response = HttpResponse(status=508)
|
||||||
@ -721,7 +710,7 @@ class LogResponseRealLoggerTests(TestCase):
|
|||||||
log_response(
|
log_response(
|
||||||
msg := "Server error occurred", response=response, request=self.request
|
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):
|
def test_logs_4xx_as_warning(self):
|
||||||
response = HttpResponse(status=418)
|
response = HttpResponse(status=418)
|
||||||
@ -729,13 +718,13 @@ class LogResponseRealLoggerTests(TestCase):
|
|||||||
log_response(
|
log_response(
|
||||||
msg := "This is a teapot!", response=response, request=self.request
|
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):
|
def test_logs_2xx_as_info(self):
|
||||||
response = HttpResponse(status=201)
|
response = HttpResponse(status=201)
|
||||||
with self.assertLogs("django.request", level="INFO") as cm:
|
with self.assertLogs("django.request", level="INFO") as cm:
|
||||||
log_response(msg := "OK response", response=response, request=self.request)
|
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):
|
def test_custom_log_level(self):
|
||||||
response = HttpResponse(status=403)
|
response = HttpResponse(status=403)
|
||||||
@ -746,14 +735,14 @@ class LogResponseRealLoggerTests(TestCase):
|
|||||||
request=self.request,
|
request=self.request,
|
||||||
level="debug",
|
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):
|
def test_logs_only_once_per_response(self):
|
||||||
response = HttpResponse(status=500)
|
response = HttpResponse(status=500)
|
||||||
with self.assertLogs("django.request", level="ERROR") as cm:
|
with self.assertLogs("django.request", level="ERROR") as cm:
|
||||||
log_response("First log", response=response, request=self.request)
|
log_response("First log", response=response, request=self.request)
|
||||||
log_response("Second 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):
|
def test_exc_info_output(self):
|
||||||
response = HttpResponse(status=500)
|
response = HttpResponse(status=500)
|
||||||
@ -767,9 +756,7 @@ class LogResponseRealLoggerTests(TestCase):
|
|||||||
request=self.request,
|
request=self.request,
|
||||||
exception=exc,
|
exception=exc,
|
||||||
)
|
)
|
||||||
self.assertResponseLogged(
|
self.assertLogRecord(cm, "With exception", logging.ERROR, 500, self.request)
|
||||||
cm, "With exception", logging.ERROR, 500, self.request
|
|
||||||
)
|
|
||||||
self.assertIn("ValueError", "\n".join(cm.output)) # Stack trace included
|
self.assertIn("ValueError", "\n".join(cm.output)) # Stack trace included
|
||||||
|
|
||||||
def test_format_args_are_applied(self):
|
def test_format_args_are_applied(self):
|
||||||
@ -783,7 +770,7 @@ class LogResponseRealLoggerTests(TestCase):
|
|||||||
request=self.request,
|
request=self.request,
|
||||||
)
|
)
|
||||||
msg = "Something went wrong: DB error (42)"
|
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):
|
def test_logs_with_custom_logger(self):
|
||||||
handler = logging.StreamHandler(log_stream := StringIO())
|
handler = logging.StreamHandler(log_stream := StringIO())
|
||||||
@ -855,7 +842,7 @@ class LogResponseRealLoggerTests(TestCase):
|
|||||||
response = HttpResponse(status=318)
|
response = HttpResponse(status=318)
|
||||||
log_response(msg, case, response=response, level="error")
|
log_response(msg, case, response=response, level="error")
|
||||||
|
|
||||||
record = self.assertResponseLogged(
|
record = self.assertLogRecord(
|
||||||
cm,
|
cm,
|
||||||
msg % expected,
|
msg % expected,
|
||||||
levelno=logging.ERROR,
|
levelno=logging.ERROR,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user