Fixed #34823 -- Fixed assertTemplateUsed() context manager crash on unnamed templates.

This commit is contained in:
Arian 2023-09-09 01:28:36 +02:00 committed by Mariusz Felisiak
parent 4de31ec680
commit 51d703a27f
2 changed files with 17 additions and 7 deletions

View File

@ -114,18 +114,16 @@ class _AssertTemplateUsedContext:
self.count = count
self.rendered_templates = []
self.rendered_template_names = []
self.context = ContextList()
def on_template_render(self, sender, signal, template, context, **kwargs):
self.rendered_templates.append(template)
self.rendered_template_names.append(template.name)
self.context.append(copy(context))
def test(self):
self.test_case._assert_template_used(
self.template_name,
self.rendered_template_names,
[t.name for t in self.rendered_templates if t.name is not None],
self.msg_prefix,
self.count,
)
@ -143,8 +141,11 @@ class _AssertTemplateUsedContext:
class _AssertTemplateNotUsedContext(_AssertTemplateUsedContext):
def test(self):
rendered_template_names = [
t.name for t in self.rendered_templates if t.name is not None
]
self.test_case.assertFalse(
self.template_name in self.rendered_template_names,
self.template_name in rendered_template_names,
f"{self.msg_prefix}Template '{self.template_name}' was used "
f"unexpectedly in rendering the response",
)

View File

@ -26,6 +26,7 @@ from django.forms import (
formset_factory,
)
from django.http import HttpResponse
from django.template import Context, Template
from django.template.loader import render_to_string
from django.test import (
SimpleTestCase,
@ -530,12 +531,20 @@ class AssertTemplateUsedContextManagerTests(SimpleTestCase):
with self.assertTemplateUsed("template_used/base.html"):
render_to_string("template_used/alternative.html")
with self.assertRaisesMessage(
AssertionError, "No templates used to render the response"
):
msg = "No templates used to render the response"
with self.assertRaisesMessage(AssertionError, msg):
response = self.client.get("/test_utils/no_template_used/")
self.assertTemplateUsed(response, "template_used/base.html")
with self.assertRaisesMessage(AssertionError, msg):
with self.assertTemplateUsed("template_used/base.html"):
self.client.get("/test_utils/no_template_used/")
with self.assertRaisesMessage(AssertionError, msg):
with self.assertTemplateUsed("template_used/base.html"):
template = Template("template_used/alternative.html", name=None)
template.render(Context())
def test_msg_prefix(self):
msg_prefix = "Prefix"
msg = f"{msg_prefix}: No templates used to render the response"