Skip to content

Commit ba24ee3

Browse files
committed
[4.2.x] Refactored logging_tests to reuse assertions for log records.
Backport of 9d72e7d from main.
1 parent b07f886 commit ba24ee3

File tree

1 file changed

+24
-37
lines changed

1 file changed

+24
-37
lines changed

tests/logging_tests/tests.py

Lines changed: 24 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -97,23 +97,28 @@ class LoggingAssertionMixin:
9797
def assertLogRecord(
9898
self,
9999
logger_cm,
100-
level,
101100
msg,
101+
levelno,
102102
status_code,
103+
request=None,
103104
exc_class=None,
104105
):
105106
self.assertEqual(
106107
records_len := len(logger_cm.records),
107108
1,
108-
f"Wrong number of calls for {logger_cm=} in {level=} (expected 1, got "
109+
f"Wrong number of calls for {logger_cm=} in {levelno=} (expected 1, got "
109110
f"{records_len}).",
110111
)
111112
record = logger_cm.records[0]
112113
self.assertEqual(record.getMessage(), msg)
114+
self.assertEqual(record.levelno, levelno)
113115
self.assertEqual(record.status_code, status_code)
116+
if request is not None:
117+
self.assertEqual(record.request, request)
114118
if exc_class:
115119
self.assertIsNotNone(record.exc_info)
116120
self.assertEqual(record.exc_info[0], exc_class)
121+
return record
117122

118123
def assertLogsRequest(
119124
self, url, level, msg, status_code, logger="django.request", exc_class=None
@@ -123,7 +128,9 @@ def assertLogsRequest(
123128
self.client.get(url)
124129
except views.UncaughtException:
125130
pass
126-
self.assertLogRecord(cm, level, msg, status_code, exc_class)
131+
self.assertLogRecord(
132+
cm, msg, getattr(logging, level), status_code, exc_class=exc_class
133+
)
127134

128135

129136
@override_settings(DEBUG=True, ROOT_URLCONF="logging_tests.urls")
@@ -155,21 +162,17 @@ def test_control_chars_escaped(self):
155162
)
156163

157164
async def test_async_page_not_found_warning(self):
158-
logger = "django.request"
159-
level = "WARNING"
160-
with self.assertLogs(logger, level) as cm:
165+
with self.assertLogs("django.request", "WARNING") as cm:
161166
await self.async_client.get("/does_not_exist/")
162167

163-
self.assertLogRecord(cm, level, "Not Found: /does_not_exist/", 404)
168+
self.assertLogRecord(cm, "Not Found: /does_not_exist/", logging.WARNING, 404)
164169

165170
async def test_async_control_chars_escaped(self):
166-
logger = "django.request"
167-
level = "WARNING"
168-
with self.assertLogs(logger, level) as cm:
171+
with self.assertLogs("django.request", "WARNING") as cm:
169172
await self.async_client.get(r"/%1B[1;31mNOW IN RED!!!1B[0m/")
170173

171174
self.assertLogRecord(
172-
cm, level, r"Not Found: /\x1b[1;31mNOW IN RED!!!1B[0m/", 404
175+
cm, r"Not Found: /\x1b[1;31mNOW IN RED!!!1B[0m/", logging.WARNING, 404
173176
)
174177

175178
def test_page_not_found_raised(self):
@@ -688,23 +691,9 @@ def patch_django_server_logger():
688691
)
689692

690693

691-
class LogResponseRealLoggerTests(TestCase):
694+
class LogResponseRealLoggerTests(LoggingAssertionMixin, TestCase):
692695
request = RequestFactory().get("/test-path/")
693696

694-
def assertResponseLogged(self, logger_cm, msg, levelno, status_code, request):
695-
self.assertEqual(
696-
records_len := len(logger_cm.records),
697-
1,
698-
f"Unexpected number of records for {logger_cm=} in {levelno=} (expected 1, "
699-
f"got {records_len}).",
700-
)
701-
record = logger_cm.records[0]
702-
self.assertEqual(record.getMessage(), msg)
703-
self.assertEqual(record.levelno, levelno)
704-
self.assertEqual(record.status_code, status_code)
705-
self.assertEqual(record.request, request)
706-
return record
707-
708697
def test_missing_response_raises_attribute_error(self):
709698
with self.assertRaises(AttributeError):
710699
log_response("No response provided", response=None, request=self.request)
@@ -713,29 +702,29 @@ def test_missing_request_logs_with_none(self):
713702
response = HttpResponse(status=403)
714703
with self.assertLogs("django.request", level="INFO") as cm:
715704
log_response(msg := "Missing request", response=response, request=None)
716-
self.assertResponseLogged(cm, msg, logging.WARNING, 403, request=None)
705+
self.assertLogRecord(cm, msg, logging.WARNING, 403, request=None)
717706

718707
def test_logs_5xx_as_error(self):
719708
response = HttpResponse(status=508)
720709
with self.assertLogs("django.request", level="ERROR") as cm:
721710
log_response(
722711
msg := "Server error occurred", response=response, request=self.request
723712
)
724-
self.assertResponseLogged(cm, msg, logging.ERROR, 508, self.request)
713+
self.assertLogRecord(cm, msg, logging.ERROR, 508, self.request)
725714

726715
def test_logs_4xx_as_warning(self):
727716
response = HttpResponse(status=418)
728717
with self.assertLogs("django.request", level="WARNING") as cm:
729718
log_response(
730719
msg := "This is a teapot!", response=response, request=self.request
731720
)
732-
self.assertResponseLogged(cm, msg, logging.WARNING, 418, self.request)
721+
self.assertLogRecord(cm, msg, logging.WARNING, 418, self.request)
733722

734723
def test_logs_2xx_as_info(self):
735724
response = HttpResponse(status=201)
736725
with self.assertLogs("django.request", level="INFO") as cm:
737726
log_response(msg := "OK response", response=response, request=self.request)
738-
self.assertResponseLogged(cm, msg, logging.INFO, 201, self.request)
727+
self.assertLogRecord(cm, msg, logging.INFO, 201, self.request)
739728

740729
def test_custom_log_level(self):
741730
response = HttpResponse(status=403)
@@ -746,14 +735,14 @@ def test_custom_log_level(self):
746735
request=self.request,
747736
level="debug",
748737
)
749-
self.assertResponseLogged(cm, msg, logging.DEBUG, 403, self.request)
738+
self.assertLogRecord(cm, msg, logging.DEBUG, 403, self.request)
750739

751740
def test_logs_only_once_per_response(self):
752741
response = HttpResponse(status=500)
753742
with self.assertLogs("django.request", level="ERROR") as cm:
754743
log_response("First log", response=response, request=self.request)
755744
log_response("Second log", response=response, request=self.request)
756-
self.assertResponseLogged(cm, "First log", logging.ERROR, 500, self.request)
745+
self.assertLogRecord(cm, "First log", logging.ERROR, 500, self.request)
757746

758747
def test_exc_info_output(self):
759748
response = HttpResponse(status=500)
@@ -767,9 +756,7 @@ def test_exc_info_output(self):
767756
request=self.request,
768757
exception=exc,
769758
)
770-
self.assertResponseLogged(
771-
cm, "With exception", logging.ERROR, 500, self.request
772-
)
759+
self.assertLogRecord(cm, "With exception", logging.ERROR, 500, self.request)
773760
self.assertIn("ValueError", "\n".join(cm.output)) # Stack trace included
774761

775762
def test_format_args_are_applied(self):
@@ -783,7 +770,7 @@ def test_format_args_are_applied(self):
783770
request=self.request,
784771
)
785772
msg = "Something went wrong: DB error (42)"
786-
self.assertResponseLogged(cm, msg, logging.ERROR, 500, self.request)
773+
self.assertLogRecord(cm, msg, logging.ERROR, 500, self.request)
787774

788775
def test_logs_with_custom_logger(self):
789776
handler = logging.StreamHandler(log_stream := StringIO())
@@ -855,7 +842,7 @@ def test_unicode_escape_escaping(self):
855842
response = HttpResponse(status=318)
856843
log_response(msg, case, response=response, level="error")
857844

858-
record = self.assertResponseLogged(
845+
record = self.assertLogRecord(
859846
cm,
860847
msg % expected,
861848
levelno=logging.ERROR,

0 commit comments

Comments
 (0)