Commit 501546df authored by Carl Meyer's avatar Carl Meyer
Browse files

Fixed #12226 -- Deprecated test client Response.template attribute in favor of...

Fixed #12226 -- Deprecated test client Response.template attribute in favor of templates attribute, which is always a list. Thanks Russell for patch review.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14106 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent d084439c
Loading
Loading
Loading
Loading
+21 −11
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ import sys
import os
import re
import mimetypes
import warnings
try:
    from cStringIO import StringIO
except ImportError:
@@ -93,7 +94,7 @@ def store_rendered_templates(store, signal, sender, template, context, **kwargs)
    """
    Stores templates and contexts that are rendered.
    """
    store.setdefault('template', []).append(template)
    store.setdefault('templates', []).append(template)
    store.setdefault('context', ContextList()).append(context)

def encode_multipart(boundary, data):
@@ -260,16 +261,25 @@ class Client(object):
            response.request = request

            # Add any rendered template detail to the response.
            # If there was only one template rendered (the most likely case),
            # flatten the list to a single element.
            for detail in ('template', 'context'):
                if data.get(detail):
                    if len(data[detail]) == 1:
                        setattr(response, detail, data[detail][0]);
                    else:
                        setattr(response, detail, data[detail])
                else:
                    setattr(response, detail, None)
            response.templates = data.get("templates", [])
            response.context = data.get("context")

            # Flatten a single context. Not really necessary anymore thanks to
            # the __getattr__ flattening in ContextList, but has some edge-case
            # backwards-compatibility implications.
            if response.context and len(response.context) == 1:
                response.context = response.context[0]

            # Provide a backwards-compatible (but pending deprecation) response.template
            def _get_template(self):
                warnings.warn("response.template is deprecated; use response.templates instead (which is always a list)",
                              PendingDeprecationWarning)
                if not self.templates:
                    return None
                elif len(self.templates) == 1:
                    return self.templates[0]
                return self.templates
            response.__class__.template = property(_get_template)

            # Update persistent cookie data.
            if response.cookies:
+2 −2
Original line number Diff line number Diff line
@@ -443,7 +443,7 @@ class TransactionTestCase(unittest.TestCase):
        if msg_prefix:
            msg_prefix += ": "

        template_names = [t.name for t in to_list(response.template)]
        template_names = [t.name for t in response.templates]
        if not template_names:
            self.fail(msg_prefix + "No templates used to render the response")
        self.failUnless(template_name in template_names,
@@ -459,7 +459,7 @@ class TransactionTestCase(unittest.TestCase):
        if msg_prefix:
            msg_prefix += ": "

        template_names = [t.name for t in to_list(response.template)]
        template_names = [t.name for t in response.templates]
        self.failIf(template_name in template_names,
            msg_prefix + "Template '%s' was used unexpectedly in rendering"
            " the response" % template_name)
+6 −0
Original line number Diff line number Diff line
@@ -102,6 +102,12 @@ their deprecation, as per the :ref:`Django deprecation policy
        * The ``mod_python`` request handler has been deprecated since the 1.3
          release. The ``mod_wsgi`` handler should be used instead.

        * The ``template`` attribute on :class:`~django.test.client.Response`
          objects returned by the :ref:`test client <test-client>` has been
          deprecated since the 1.3 release. The
          :attr:`~django.test.client.Response.templates` attribute should be
          used instead.

    * 2.0
        * ``django.views.defaults.shortcut()``. This function has been moved
          to ``django.contrib.contenttypes.views.shortcut()`` as part of the
+17 −0
Original line number Diff line number Diff line
@@ -106,6 +106,23 @@ If you are currently using the ``mod_python`` request handler, it is strongly
encouraged you redeploy your Django instances using :doc:`mod_wsgi
</howto/deployment/modwsgi>`.

Test client response ``template`` attribute
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Django's :ref:`test client <test-client>` returns
:class:`~django.test.client.Response` objects annotated with extra testing
information. In Django versions prior to 1.3, this included a
:attr:`~django.test.client.Response.template` attribute containing information
about templates rendered in generating the response: either None, a single
:class:`~django.template.Template` object, or a list of
:class:`~django.template.Template` objects. This inconsistency in return values
(sometimes a list, sometimes not) made the attribute difficult to work with.

In Django 1.3 the :attr:`~django.test.client.Response.template` attribute is
deprecated in favor of a new :attr:`~django.test.client.Response.templates`
attribute, which is always a list, even if it has only a single element or no
elements.

What's new in Django 1.3
========================

+9 −7
Original line number Diff line number Diff line
@@ -494,6 +494,8 @@ Testing tools

Django provides a small set of tools that come in handy when writing tests.

.. _test-client:

The test client
---------------

@@ -894,15 +896,15 @@ Specifically, a ``Response`` object has the following attributes:
        The HTTP status of the response, as an integer. See RFC2616_ for a full
        list of HTTP status codes.

    .. attribute:: template
    .. versionadded:: 1.3

    .. attribute:: templates

        The ``Template`` instance that was used to render the final content. Use
        A list of ``Template`` instances used to render the final content, in
        the order they were rendered. For each template in the list, use
        ``template.name`` to get the template's file name, if the template was
        loaded from a file. (The name is a string such as ``'admin/index.html'``.)

        If the rendered page used multiple templates -- e.g., using :ref:`template
        inheritance<template-inheritance>` -- then ``template`` will be a list of
        ``Template`` instances, in the order in which they were rendered.
        loaded from a file. (The name is a string such as
        ``'admin/index.html'``.)

You can also use dictionary syntax on the response object to query the value
of any settings in the HTTP headers. For example, you could determine the
Loading