From 72f63bd24d44b5a4f24ad8fa27ebba96d9a507d8 Mon Sep 17 00:00:00 2001 From: Unai Zalakain Date: Mon, 4 Nov 2013 16:50:14 +0100 Subject: [PATCH] Fixed #17529 -- get_template_from_string default arguments break ``get_template_from_string`` default arguments were breaking ``assertTemplateUsed``. The solution has been to return only the names of the templates with a ``name`` attribute distinct of ``None``. The default ``name`` kwarg of ``Template`` has been changed to ``None``, more pythonic than ``''``. --- django/template/base.py | 3 +-- django/test/testcases.py | 3 ++- tests/test_utils/tests.py | 7 +++++++ tests/test_utils/urls.py | 1 + tests/test_utils/views.py | 5 +++++ 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/django/template/base.py b/django/template/base.py index efeca3ea2a..83d7403ac7 100644 --- a/django/template/base.py +++ b/django/template/base.py @@ -121,8 +121,7 @@ class StringOrigin(Origin): class Template(object): - def __init__(self, template_string, origin=None, - name=''): + def __init__(self, template_string, origin=None, name=None): try: template_string = force_text(template_string) except UnicodeDecodeError: diff --git a/django/test/testcases.py b/django/test/testcases.py index 4a5188b198..2ca82d7536 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -506,7 +506,8 @@ class SimpleTestCase(unittest.TestCase): # use this template with context manager return template_name, None, msg_prefix - template_names = [t.name for t in response.templates] + template_names = [t.name for t in response.templates if t.name is not + None] return None, template_names, msg_prefix def assertTemplateUsed(self, response=None, template_name=None, msg_prefix=''): diff --git a/tests/test_utils/tests.py b/tests/test_utils/tests.py index 666fde2fa6..9f7831d2b7 100644 --- a/tests/test_utils/tests.py +++ b/tests/test_utils/tests.py @@ -214,6 +214,8 @@ class AssertNumQueriesContextManagerTests(TestCase): class AssertTemplateUsedContextManagerTests(TestCase): + urls = 'test_utils.urls' + def test_usage(self): with self.assertTemplateUsed('template_used/base.html'): render_to_string('template_used/base.html') @@ -270,6 +272,11 @@ class AssertTemplateUsedContextManagerTests(TestCase): with self.assertTemplateUsed('template_used/base.html'): render_to_string('template_used/alternative.html') + with self.assertRaises(AssertionError) as cm: + response = self.client.get('/test_utils/no_template_used/') + self.assertTemplateUsed(response, 'template_used/base.html') + self.assertEqual(cm.exception.args[0], "No templates used to render the response") + def test_failure(self): with self.assertRaises(TypeError): with self.assertTemplateUsed(): diff --git a/tests/test_utils/urls.py b/tests/test_utils/urls.py index 65e8631735..c3f2ec4e4b 100644 --- a/tests/test_utils/urls.py +++ b/tests/test_utils/urls.py @@ -5,4 +5,5 @@ from . import views urlpatterns = patterns('', (r'^test_utils/get_person/(\d+)/$', views.get_person), + (r'^test_utils/no_template_used/$', views.no_template_used), ) diff --git a/tests/test_utils/views.py b/tests/test_utils/views.py index 77e598b72c..a804bb9ae3 100644 --- a/tests/test_utils/views.py +++ b/tests/test_utils/views.py @@ -1,5 +1,6 @@ from django.http import HttpResponse from django.shortcuts import get_object_or_404 +from django.template import loader, Context from .models import Person @@ -7,3 +8,7 @@ from .models import Person def get_person(request, pk): person = get_object_or_404(Person, pk=pk) return HttpResponse(person.name) + +def no_template_used(request): + template = loader.get_template_from_string("This is a string-based template") + return HttpResponse(template.render(Context({})))