<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang=""> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>django.test.utils — Django 1.8.19 documentation</title> <link rel="stylesheet" href="../../../_static/default.css" type="text/css" /> <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../../../', VERSION: '1.8.19', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="../../../_static/jquery.js"></script> <script type="text/javascript" src="../../../_static/underscore.js"></script> <script type="text/javascript" src="../../../_static/doctools.js"></script> <link rel="index" title="Index" href="../../../genindex.html" /> <link rel="search" title="Search" href="../../../search.html" /> <link rel="top" title="Django 1.8.19 documentation" href="../../../contents.html" /> <link rel="up" title="django" href="../../django.html" /> <script type="text/javascript" src="../../../templatebuiltins.js"></script> <script type="text/javascript"> (function($) { if (!django_template_builtins) { // templatebuiltins.js missing, do nothing. return; } $(document).ready(function() { // Hyperlink Django template tags and filters var base = "../../../ref/templates/builtins.html"; if (base == "#") { // Special case for builtins.html itself base = ""; } // Tags are keywords, class '.k' $("div.highlight\\-html\\+django span.k").each(function(i, elem) { var tagname = $(elem).text(); if ($.inArray(tagname, django_template_builtins.ttags) != -1) { var fragment = tagname.replace(/_/, '-'); $(elem).html("<a href='" + base + "#" + fragment + "'>" + tagname + "</a>"); } }); // Filters are functions, class '.nf' $("div.highlight\\-html\\+django span.nf").each(function(i, elem) { var filtername = $(elem).text(); if ($.inArray(filtername, django_template_builtins.tfilters) != -1) { var fragment = filtername.replace(/_/, '-'); $(elem).html("<a href='" + base + "#" + fragment + "'>" + filtername + "</a>"); } }); }); })(jQuery); </script> </head> <body role="document"> <div class="document"> <div id="custom-doc" class="yui-t6"> <div id="hd"> <h1><a href="../../../index.html">Django 1.8.19 documentation</a></h1> <div id="global-nav"> <a title="Home page" href="../../../index.html">Home</a> | <a title="Table of contents" href="../../../contents.html">Table of contents</a> | <a title="Global index" href="../../../genindex.html">Index</a> | <a title="Module index" href="../../../py-modindex.html">Modules</a> </div> <div class="nav"> <a href="../../index.html" title="Module code" accesskey="U">up</a></div> </div> <div id="bd"> <div id="yui-main"> <div class="yui-b"> <div class="yui-g" id="_modules-django-test-utils"> <h1>Source code for django.test.utils</h1><div class="highlight"><pre> <span></span><span class="kn">import</span> <span class="nn">logging</span> <span class="kn">import</span> <span class="nn">re</span> <span class="kn">import</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="nn">time</span> <span class="kn">import</span> <span class="nn">warnings</span> <span class="kn">from</span> <span class="nn">contextlib</span> <span class="k">import</span> <span class="n">contextmanager</span> <span class="kn">from</span> <span class="nn">functools</span> <span class="k">import</span> <span class="n">wraps</span> <span class="kn">from</span> <span class="nn">unittest</span> <span class="k">import</span> <span class="n">skipIf</span><span class="p">,</span> <span class="n">skipUnless</span> <span class="kn">from</span> <span class="nn">xml.dom.minidom</span> <span class="k">import</span> <span class="n">Node</span><span class="p">,</span> <span class="n">parseString</span> <span class="kn">from</span> <span class="nn">django.apps</span> <span class="k">import</span> <span class="n">apps</span> <span class="kn">from</span> <span class="nn">django.conf</span> <span class="k">import</span> <span class="n">UserSettingsHolder</span><span class="p">,</span> <span class="n">settings</span> <span class="kn">from</span> <span class="nn">django.core</span> <span class="k">import</span> <span class="n">mail</span> <span class="kn">from</span> <span class="nn">django.core.signals</span> <span class="k">import</span> <span class="n">request_started</span> <span class="kn">from</span> <span class="nn">django.db</span> <span class="k">import</span> <span class="n">reset_queries</span> <span class="kn">from</span> <span class="nn">django.http</span> <span class="k">import</span> <span class="n">request</span> <span class="kn">from</span> <span class="nn">django.template</span> <span class="k">import</span> <span class="n">Template</span> <span class="kn">from</span> <span class="nn">django.template.loaders</span> <span class="k">import</span> <span class="n">locmem</span> <span class="kn">from</span> <span class="nn">django.test.signals</span> <span class="k">import</span> <span class="n">setting_changed</span><span class="p">,</span> <span class="n">template_rendered</span> <span class="kn">from</span> <span class="nn">django.utils</span> <span class="k">import</span> <span class="n">six</span> <span class="kn">from</span> <span class="nn">django.utils.deprecation</span> <span class="k">import</span> <span class="n">RemovedInDjango19Warning</span> <span class="kn">from</span> <span class="nn">django.utils.encoding</span> <span class="k">import</span> <span class="n">force_str</span> <span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="k">import</span> <span class="n">deactivate</span> <span class="c1"># Jinja2 doesn't run on Python 3.2 because it uses u-prefixed unicode strings.</span> <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="o">!=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">jinja2</span> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="n">jinja2</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">else</span><span class="p">:</span> <span class="n">jinja2</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span> <span class="s1">'Approximate'</span><span class="p">,</span> <span class="s1">'ContextList'</span><span class="p">,</span> <span class="s1">'get_runner'</span><span class="p">,</span> <span class="s1">'modify_settings'</span><span class="p">,</span> <span class="s1">'override_settings'</span><span class="p">,</span> <span class="s1">'requires_tz_support'</span><span class="p">,</span> <span class="s1">'setup_test_environment'</span><span class="p">,</span> <span class="s1">'teardown_test_environment'</span><span class="p">,</span> <span class="p">)</span> <span class="n">TZ_SUPPORT</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">time</span><span class="p">,</span> <span class="s1">'tzset'</span><span class="p">)</span> <span class="k">class</span> <span class="nc">Approximate</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="n">places</span><span class="o">=</span><span class="mi">7</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">val</span> <span class="o">=</span> <span class="n">val</span> <span class="bp">self</span><span class="o">.</span><span class="n">places</span> <span class="o">=</span> <span class="n">places</span> <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">val</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">val</span> <span class="o">==</span> <span class="n">other</span><span class="p">:</span> <span class="k">return</span> <span class="kc">True</span> <span class="k">return</span> <span class="nb">round</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">val</span> <span class="o">-</span> <span class="n">other</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">places</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">class</span> <span class="nc">ContextList</span><span class="p">(</span><span class="nb">list</span><span class="p">):</span> <span class="sd">"""A wrapper that provides direct key access to context items contained</span> <span class="sd"> in a list of context objects.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="k">for</span> <span class="n">subcontext</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">subcontext</span><span class="p">:</span> <span class="k">return</span> <span class="n">subcontext</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">ContextList</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__getitem__</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> <span class="k">return</span> <span class="kc">False</span> <span class="k">return</span> <span class="kc">True</span> <span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Flattened keys of subcontexts.</span> <span class="sd"> """</span> <span class="n">keys</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span> <span class="k">for</span> <span class="n">subcontext</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span> <span class="k">for</span> <span class="nb">dict</span> <span class="ow">in</span> <span class="n">subcontext</span><span class="p">:</span> <span class="n">keys</span> <span class="o">|=</span> <span class="nb">set</span><span class="p">(</span><span class="nb">dict</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> <span class="k">return</span> <span class="n">keys</span> <span class="k">def</span> <span class="nf">instrumented_test_render</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> An instrumented Template render method, providing a signal</span> <span class="sd"> that can be intercepted by the test system Client</span> <span class="sd"> """</span> <span class="n">template_rendered</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">sender</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">template</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">nodelist</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">context</span><span class="p">)</span> <div class="viewcode-block" id="setup_test_environment"><a class="viewcode-back" href="../../../topics/testing/advanced.html#django.test.utils.setup_test_environment">[docs]</a><span class="k">def</span> <span class="nf">setup_test_environment</span><span class="p">():</span> <span class="sd">"""Perform any global pre-test setup. This involves:</span> <span class="sd"> - Installing the instrumented test renderer</span> <span class="sd"> - Set the email backend to the locmem email backend.</span> <span class="sd"> - Setting the active locale to match the LANGUAGE_CODE setting.</span> <span class="sd"> """</span> <span class="n">Template</span><span class="o">.</span><span class="n">_original_render</span> <span class="o">=</span> <span class="n">Template</span><span class="o">.</span><span class="n">_render</span> <span class="n">Template</span><span class="o">.</span><span class="n">_render</span> <span class="o">=</span> <span class="n">instrumented_test_render</span> <span class="c1"># Storing previous values in the settings module itself is problematic.</span> <span class="c1"># Store them in arbitrary (but related) modules instead. See #20636.</span> <span class="n">mail</span><span class="o">.</span><span class="n">_original_email_backend</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">EMAIL_BACKEND</span> <span class="n">settings</span><span class="o">.</span><span class="n">EMAIL_BACKEND</span> <span class="o">=</span> <span class="s1">'django.core.mail.backends.locmem.EmailBackend'</span> <span class="n">request</span><span class="o">.</span><span class="n">_original_allowed_hosts</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">ALLOWED_HOSTS</span> <span class="n">settings</span><span class="o">.</span><span class="n">ALLOWED_HOSTS</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'*'</span><span class="p">]</span> <span class="n">mail</span><span class="o">.</span><span class="n">outbox</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">deactivate</span><span class="p">()</span></div> <div class="viewcode-block" id="teardown_test_environment"><a class="viewcode-back" href="../../../topics/testing/advanced.html#django.test.utils.teardown_test_environment">[docs]</a><span class="k">def</span> <span class="nf">teardown_test_environment</span><span class="p">():</span> <span class="sd">"""Perform any global post-test teardown. This involves:</span> <span class="sd"> - Restoring the original test renderer</span> <span class="sd"> - Restoring the email sending functions</span> <span class="sd"> """</span> <span class="n">Template</span><span class="o">.</span><span class="n">_render</span> <span class="o">=</span> <span class="n">Template</span><span class="o">.</span><span class="n">_original_render</span> <span class="k">del</span> <span class="n">Template</span><span class="o">.</span><span class="n">_original_render</span> <span class="n">settings</span><span class="o">.</span><span class="n">EMAIL_BACKEND</span> <span class="o">=</span> <span class="n">mail</span><span class="o">.</span><span class="n">_original_email_backend</span> <span class="k">del</span> <span class="n">mail</span><span class="o">.</span><span class="n">_original_email_backend</span> <span class="n">settings</span><span class="o">.</span><span class="n">ALLOWED_HOSTS</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">_original_allowed_hosts</span> <span class="k">del</span> <span class="n">request</span><span class="o">.</span><span class="n">_original_allowed_hosts</span> <span class="k">del</span> <span class="n">mail</span><span class="o">.</span><span class="n">outbox</span></div> <span class="k">def</span> <span class="nf">get_runner</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="n">test_runner_class</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">test_runner_class</span><span class="p">:</span> <span class="n">test_runner_class</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">TEST_RUNNER</span> <span class="n">test_path</span> <span class="o">=</span> <span class="n">test_runner_class</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)</span> <span class="c1"># Allow for Python 2.5 relative paths</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">test_path</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span> <span class="n">test_module_name</span> <span class="o">=</span> <span class="s1">'.'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">test_path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="k">else</span><span class="p">:</span> <span class="n">test_module_name</span> <span class="o">=</span> <span class="s1">'.'</span> <span class="n">test_module</span> <span class="o">=</span> <span class="nb">__import__</span><span class="p">(</span><span class="n">test_module_name</span><span class="p">,</span> <span class="p">{},</span> <span class="p">{},</span> <span class="n">force_str</span><span class="p">(</span><span class="n">test_path</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]))</span> <span class="n">test_runner</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">test_module</span><span class="p">,</span> <span class="n">test_path</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="k">return</span> <span class="n">test_runner</span> <span class="k">class</span> <span class="nc">TestTemplateLoader</span><span class="p">(</span><span class="n">locmem</span><span class="o">.</span><span class="n">Loader</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span> <span class="s2">"django.test.utils.TestTemplateLoader was renamed to "</span> <span class="s2">"django.template.loaders.locmem.Loader."</span><span class="p">,</span> <span class="n">RemovedInDjango19Warning</span><span class="p">,</span> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> <span class="nb">super</span><span class="p">(</span><span class="n">TestTemplateLoader</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <div class="viewcode-block" id="override_settings"><a class="viewcode-back" href="../../../topics/testing/tools.html#django.test.utils.override_settings">[docs]</a><span class="k">class</span> <span class="nc">override_settings</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Acts as either a decorator, or a context manager. If it's a decorator it</span> <span class="sd"> takes a function and returns a wrapped function. If it's a contextmanager</span> <span class="sd"> it's used with the ``with`` statement. In either event entering/exiting</span> <span class="sd"> are called before and after, respectively, the function/block is executed.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="n">kwargs</span> <span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span> <span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">traceback</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">disable</span><span class="p">()</span> <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test_func</span><span class="p">):</span> <span class="kn">from</span> <span class="nn">django.test</span> <span class="k">import</span> <span class="n">SimpleTestCase</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">test_func</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">test_func</span><span class="p">,</span> <span class="n">SimpleTestCase</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span> <span class="s2">"Only subclasses of Django SimpleTestCase can be decorated "</span> <span class="s2">"with override_settings"</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">save_options</span><span class="p">(</span><span class="n">test_func</span><span class="p">)</span> <span class="k">return</span> <span class="n">test_func</span> <span class="k">else</span><span class="p">:</span> <span class="nd">@wraps</span><span class="p">(</span><span class="n">test_func</span><span class="p">)</span> <span class="k">def</span> <span class="nf">inner</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">with</span> <span class="bp">self</span><span class="p">:</span> <span class="k">return</span> <span class="n">test_func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">return</span> <span class="n">inner</span> <span class="k">def</span> <span class="nf">save_options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test_func</span><span class="p">):</span> <span class="k">if</span> <span class="n">test_func</span><span class="o">.</span><span class="n">_overridden_settings</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">test_func</span><span class="o">.</span><span class="n">_overridden_settings</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># Duplicate dict to prevent subclasses from altering their parent.</span> <span class="n">test_func</span><span class="o">.</span><span class="n">_overridden_settings</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span> <span class="n">test_func</span><span class="o">.</span><span class="n">_overridden_settings</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">)</span> <span class="k">def</span> <span class="nf">enable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># Keep this code at the beginning to leave the settings unchanged</span> <span class="c1"># in case it raises an exception because INSTALLED_APPS is invalid.</span> <span class="k">if</span> <span class="s1">'INSTALLED_APPS'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">apps</span><span class="o">.</span><span class="n">set_installed_apps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s1">'INSTALLED_APPS'</span><span class="p">])</span> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <span class="n">apps</span><span class="o">.</span><span class="n">unset_installed_apps</span><span class="p">()</span> <span class="k">raise</span> <span class="n">override</span> <span class="o">=</span> <span class="n">UserSettingsHolder</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">_wrapped</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">new_value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">override</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">new_value</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrapped</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">_wrapped</span> <span class="n">settings</span><span class="o">.</span><span class="n">_wrapped</span> <span class="o">=</span> <span class="n">override</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">new_value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="n">setting_changed</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">sender</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">_wrapped</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">setting</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">new_value</span><span class="p">,</span> <span class="n">enter</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">def</span> <span class="nf">disable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="s1">'INSTALLED_APPS'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">:</span> <span class="n">apps</span><span class="o">.</span><span class="n">unset_installed_apps</span><span class="p">()</span> <span class="n">settings</span><span class="o">.</span><span class="n">_wrapped</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrapped</span> <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrapped</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">:</span> <span class="n">new_value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="n">setting_changed</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">sender</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">_wrapped</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">setting</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">new_value</span><span class="p">,</span> <span class="n">enter</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></div> <div class="viewcode-block" id="modify_settings"><a class="viewcode-back" href="../../../topics/testing/tools.html#django.test.utils.modify_settings">[docs]</a><span class="k">class</span> <span class="nc">modify_settings</span><span class="p">(</span><span class="n">override_settings</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Like override_settings, but makes it possible to append, prepend or remove</span> <span class="sd"> items instead of redefining the entire list.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">if</span> <span class="n">args</span><span class="p">:</span> <span class="c1"># Hack used when instantiating from SimpleTestCase.setUpClass.</span> <span class="k">assert</span> <span class="ow">not</span> <span class="n">kwargs</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">assert</span> <span class="ow">not</span> <span class="n">args</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">())</span> <span class="k">def</span> <span class="nf">save_options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test_func</span><span class="p">):</span> <span class="k">if</span> <span class="n">test_func</span><span class="o">.</span><span class="n">_modified_settings</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">test_func</span><span class="o">.</span><span class="n">_modified_settings</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># Duplicate list to prevent subclasses from altering their parent.</span> <span class="n">test_func</span><span class="o">.</span><span class="n">_modified_settings</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span> <span class="n">test_func</span><span class="o">.</span><span class="n">_modified_settings</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span> <span class="k">def</span> <span class="nf">enable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">operations</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">operations</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="c1"># When called from SimpleTestCase.setUpClass, values may be</span> <span class="c1"># overridden several times; cumulate changes.</span> <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span> <span class="n">value</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">settings</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="p">[]))</span> <span class="k">for</span> <span class="n">action</span><span class="p">,</span> <span class="n">items</span> <span class="ow">in</span> <span class="n">operations</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="c1"># items my be a single value or an iterable.</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">items</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="n">items</span> <span class="o">=</span> <span class="p">[</span><span class="n">items</span><span class="p">]</span> <span class="k">if</span> <span class="n">action</span> <span class="o">==</span> <span class="s1">'append'</span><span class="p">:</span> <span class="n">value</span> <span class="o">=</span> <span class="n">value</span> <span class="o">+</span> <span class="p">[</span><span class="n">item</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">items</span> <span class="k">if</span> <span class="n">item</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">value</span><span class="p">]</span> <span class="k">elif</span> <span class="n">action</span> <span class="o">==</span> <span class="s1">'prepend'</span><span class="p">:</span> <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="n">item</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">items</span> <span class="k">if</span> <span class="n">item</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">value</span><span class="p">]</span> <span class="o">+</span> <span class="n">value</span> <span class="k">elif</span> <span class="n">action</span> <span class="o">==</span> <span class="s1">'remove'</span><span class="p">:</span> <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="n">item</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">value</span> <span class="k">if</span> <span class="n">item</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">items</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Unsupported action: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">action</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span> <span class="nb">super</span><span class="p">(</span><span class="n">modify_settings</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span></div> <span class="k">def</span> <span class="nf">override_system_checks</span><span class="p">(</span><span class="n">new_checks</span><span class="p">,</span> <span class="n">deployment_checks</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="sd">""" Acts as a decorator. Overrides list of registered system checks.</span> <span class="sd"> Useful when you override `INSTALLED_APPS`, e.g. if you exclude `auth` app,</span> <span class="sd"> you also need to exclude its system checks. """</span> <span class="kn">from</span> <span class="nn">django.core.checks.registry</span> <span class="k">import</span> <span class="n">registry</span> <span class="k">def</span> <span class="nf">outer</span><span class="p">(</span><span class="n">test_func</span><span class="p">):</span> <span class="nd">@wraps</span><span class="p">(</span><span class="n">test_func</span><span class="p">)</span> <span class="k">def</span> <span class="nf">inner</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">old_checks</span> <span class="o">=</span> <span class="n">registry</span><span class="o">.</span><span class="n">registered_checks</span> <span class="n">registry</span><span class="o">.</span><span class="n">registered_checks</span> <span class="o">=</span> <span class="n">new_checks</span> <span class="n">old_deployment_checks</span> <span class="o">=</span> <span class="n">registry</span><span class="o">.</span><span class="n">deployment_checks</span> <span class="k">if</span> <span class="n">deployment_checks</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">registry</span><span class="o">.</span><span class="n">deployment_checks</span> <span class="o">=</span> <span class="n">deployment_checks</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="n">test_func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">finally</span><span class="p">:</span> <span class="n">registry</span><span class="o">.</span><span class="n">registered_checks</span> <span class="o">=</span> <span class="n">old_checks</span> <span class="n">registry</span><span class="o">.</span><span class="n">deployment_checks</span> <span class="o">=</span> <span class="n">old_deployment_checks</span> <span class="k">return</span> <span class="n">inner</span> <span class="k">return</span> <span class="n">outer</span> <span class="k">def</span> <span class="nf">compare_xml</span><span class="p">(</span><span class="n">want</span><span class="p">,</span> <span class="n">got</span><span class="p">):</span> <span class="sd">"""Tries to do a 'xml-comparison' of want and got. Plain string</span> <span class="sd"> comparison doesn't always work because, for example, attribute</span> <span class="sd"> ordering should not be important. Comment nodes are not considered in the</span> <span class="sd"> comparison.</span> <span class="sd"> Based on http://codespeak.net/svn/lxml/trunk/src/lxml/doctestcompare.py</span> <span class="sd"> """</span> <span class="n">_norm_whitespace_re</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">r'[ \t\n][ \t\n]+'</span><span class="p">)</span> <span class="k">def</span> <span class="nf">norm_whitespace</span><span class="p">(</span><span class="n">v</span><span class="p">):</span> <span class="k">return</span> <span class="n">_norm_whitespace_re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s1">' '</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="k">def</span> <span class="nf">child_text</span><span class="p">(</span><span class="n">element</span><span class="p">):</span> <span class="k">return</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">data</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">element</span><span class="o">.</span><span class="n">childNodes</span> <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">nodeType</span> <span class="o">==</span> <span class="n">Node</span><span class="o">.</span><span class="n">TEXT_NODE</span><span class="p">)</span> <span class="k">def</span> <span class="nf">children</span><span class="p">(</span><span class="n">element</span><span class="p">):</span> <span class="k">return</span> <span class="p">[</span><span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">element</span><span class="o">.</span><span class="n">childNodes</span> <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">nodeType</span> <span class="o">==</span> <span class="n">Node</span><span class="o">.</span><span class="n">ELEMENT_NODE</span><span class="p">]</span> <span class="k">def</span> <span class="nf">norm_child_text</span><span class="p">(</span><span class="n">element</span><span class="p">):</span> <span class="k">return</span> <span class="n">norm_whitespace</span><span class="p">(</span><span class="n">child_text</span><span class="p">(</span><span class="n">element</span><span class="p">))</span> <span class="k">def</span> <span class="nf">attrs_dict</span><span class="p">(</span><span class="n">element</span><span class="p">):</span> <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="n">element</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">items</span><span class="p">())</span> <span class="k">def</span> <span class="nf">check_element</span><span class="p">(</span><span class="n">want_element</span><span class="p">,</span> <span class="n">got_element</span><span class="p">):</span> <span class="k">if</span> <span class="n">want_element</span><span class="o">.</span><span class="n">tagName</span> <span class="o">!=</span> <span class="n">got_element</span><span class="o">.</span><span class="n">tagName</span><span class="p">:</span> <span class="k">return</span> <span class="kc">False</span> <span class="k">if</span> <span class="n">norm_child_text</span><span class="p">(</span><span class="n">want_element</span><span class="p">)</span> <span class="o">!=</span> <span class="n">norm_child_text</span><span class="p">(</span><span class="n">got_element</span><span class="p">):</span> <span class="k">return</span> <span class="kc">False</span> <span class="k">if</span> <span class="n">attrs_dict</span><span class="p">(</span><span class="n">want_element</span><span class="p">)</span> <span class="o">!=</span> <span class="n">attrs_dict</span><span class="p">(</span><span class="n">got_element</span><span class="p">):</span> <span class="k">return</span> <span class="kc">False</span> <span class="n">want_children</span> <span class="o">=</span> <span class="n">children</span><span class="p">(</span><span class="n">want_element</span><span class="p">)</span> <span class="n">got_children</span> <span class="o">=</span> <span class="n">children</span><span class="p">(</span><span class="n">got_element</span><span class="p">)</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">want_children</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">got_children</span><span class="p">):</span> <span class="k">return</span> <span class="kc">False</span> <span class="k">for</span> <span class="n">want</span><span class="p">,</span> <span class="n">got</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">want_children</span><span class="p">,</span> <span class="n">got_children</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">check_element</span><span class="p">(</span><span class="n">want</span><span class="p">,</span> <span class="n">got</span><span class="p">):</span> <span class="k">return</span> <span class="kc">False</span> <span class="k">return</span> <span class="kc">True</span> <span class="k">def</span> <span class="nf">first_node</span><span class="p">(</span><span class="n">document</span><span class="p">):</span> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">document</span><span class="o">.</span><span class="n">childNodes</span><span class="p">:</span> <span class="k">if</span> <span class="n">node</span><span class="o">.</span><span class="n">nodeType</span> <span class="o">!=</span> <span class="n">Node</span><span class="o">.</span><span class="n">COMMENT_NODE</span><span class="p">:</span> <span class="k">return</span> <span class="n">node</span> <span class="n">want</span><span class="p">,</span> <span class="n">got</span> <span class="o">=</span> <span class="n">strip_quotes</span><span class="p">(</span><span class="n">want</span><span class="p">,</span> <span class="n">got</span><span class="p">)</span> <span class="n">want</span> <span class="o">=</span> <span class="n">want</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">'</span><span class="se">\\</span><span class="s1">n'</span><span class="p">,</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> <span class="n">got</span> <span class="o">=</span> <span class="n">got</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">'</span><span class="se">\\</span><span class="s1">n'</span><span class="p">,</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> <span class="c1"># If the string is not a complete xml document, we may need to add a</span> <span class="c1"># root element. This allow us to compare fragments, like "<foo/><bar/>"</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">want</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'<?xml'</span><span class="p">):</span> <span class="n">wrapper</span> <span class="o">=</span> <span class="s1">'<root></span><span class="si">%s</span><span class="s1"></root>'</span> <span class="n">want</span> <span class="o">=</span> <span class="n">wrapper</span> <span class="o">%</span> <span class="n">want</span> <span class="n">got</span> <span class="o">=</span> <span class="n">wrapper</span> <span class="o">%</span> <span class="n">got</span> <span class="c1"># Parse the want and got strings, and compare the parsings.</span> <span class="n">want_root</span> <span class="o">=</span> <span class="n">first_node</span><span class="p">(</span><span class="n">parseString</span><span class="p">(</span><span class="n">want</span><span class="p">))</span> <span class="n">got_root</span> <span class="o">=</span> <span class="n">first_node</span><span class="p">(</span><span class="n">parseString</span><span class="p">(</span><span class="n">got</span><span class="p">))</span> <span class="k">return</span> <span class="n">check_element</span><span class="p">(</span><span class="n">want_root</span><span class="p">,</span> <span class="n">got_root</span><span class="p">)</span> <span class="k">def</span> <span class="nf">strip_quotes</span><span class="p">(</span><span class="n">want</span><span class="p">,</span> <span class="n">got</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Strip quotes of doctests output values:</span> <span class="sd"> >>> strip_quotes("'foo'")</span> <span class="sd"> "foo"</span> <span class="sd"> >>> strip_quotes('"foo"')</span> <span class="sd"> "foo"</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">is_quoted_string</span><span class="p">(</span><span class="n">s</span><span class="p">):</span> <span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">s</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="ow">and</span> <span class="n">s</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'"'</span><span class="p">,</span> <span class="s2">"'"</span><span class="p">))</span> <span class="k">def</span> <span class="nf">is_quoted_unicode</span><span class="p">(</span><span class="n">s</span><span class="p">):</span> <span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">3</span> <span class="ow">and</span> <span class="n">s</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'u'</span> <span class="ow">and</span> <span class="n">s</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="ow">and</span> <span class="n">s</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'"'</span><span class="p">,</span> <span class="s2">"'"</span><span class="p">))</span> <span class="k">if</span> <span class="n">is_quoted_string</span><span class="p">(</span><span class="n">want</span><span class="p">)</span> <span class="ow">and</span> <span class="n">is_quoted_string</span><span class="p">(</span><span class="n">got</span><span class="p">):</span> <span class="n">want</span> <span class="o">=</span> <span class="n">want</span><span class="o">.</span><span class="n">strip</span><span class="p">()[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="n">got</span> <span class="o">=</span> <span class="n">got</span><span class="o">.</span><span class="n">strip</span><span class="p">()[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">elif</span> <span class="n">is_quoted_unicode</span><span class="p">(</span><span class="n">want</span><span class="p">)</span> <span class="ow">and</span> <span class="n">is_quoted_unicode</span><span class="p">(</span><span class="n">got</span><span class="p">):</span> <span class="n">want</span> <span class="o">=</span> <span class="n">want</span><span class="o">.</span><span class="n">strip</span><span class="p">()[</span><span class="mi">2</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="n">got</span> <span class="o">=</span> <span class="n">got</span><span class="o">.</span><span class="n">strip</span><span class="p">()[</span><span class="mi">2</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">return</span> <span class="n">want</span><span class="p">,</span> <span class="n">got</span> <span class="k">def</span> <span class="nf">str_prefix</span><span class="p">(</span><span class="n">s</span><span class="p">):</span> <span class="k">return</span> <span class="n">s</span> <span class="o">%</span> <span class="p">{</span><span class="s1">'_'</span><span class="p">:</span> <span class="s1">''</span> <span class="k">if</span> <span class="n">six</span><span class="o">.</span><span class="n">PY3</span> <span class="k">else</span> <span class="s1">'u'</span><span class="p">}</span> <span class="k">class</span> <span class="nc">CaptureQueriesContext</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Context manager that captures queries executed by the specified connection.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">connection</span> <span class="o">=</span> <span class="n">connection</span> <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">captured_queries</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">captured_queries</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">captured_queries</span><span class="p">)</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">captured_queries</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">queries</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">initial_queries</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">final_queries</span><span class="p">]</span> <span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">force_debug_cursor</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">force_debug_cursor</span> <span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">force_debug_cursor</span> <span class="o">=</span> <span class="kc">True</span> <span class="bp">self</span><span class="o">.</span><span class="n">initial_queries</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">queries_log</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">final_queries</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">request_started</span><span class="o">.</span><span class="n">disconnect</span><span class="p">(</span><span class="n">reset_queries</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span> <span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">traceback</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">force_debug_cursor</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">force_debug_cursor</span> <span class="n">request_started</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">reset_queries</span><span class="p">)</span> <span class="k">if</span> <span class="n">exc_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">final_queries</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">queries_log</span><span class="p">)</span> <span class="k">class</span> <span class="nc">ignore_warnings</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">ignore_kwargs</span> <span class="o">=</span> <span class="n">kwargs</span> <span class="k">if</span> <span class="s1">'message'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ignore_kwargs</span> <span class="ow">or</span> <span class="s1">'module'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ignore_kwargs</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">filter_func</span> <span class="o">=</span> <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">filter_func</span> <span class="o">=</span> <span class="n">warnings</span><span class="o">.</span><span class="n">simplefilter</span> <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">decorated</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">decorated</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span> <span class="c1"># A class is decorated</span> <span class="n">saved_setUp</span> <span class="o">=</span> <span class="n">decorated</span><span class="o">.</span><span class="n">setUp</span> <span class="n">saved_tearDown</span> <span class="o">=</span> <span class="n">decorated</span><span class="o">.</span><span class="n">tearDown</span> <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="n">inner_self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">catch_warnings</span> <span class="o">=</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">catch_warnings</span><span class="o">.</span><span class="n">__enter__</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">filter_func</span><span class="p">(</span><span class="s1">'ignore'</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">ignore_kwargs</span><span class="p">)</span> <span class="n">saved_setUp</span><span class="p">(</span><span class="n">inner_self</span><span class="p">)</span> <span class="k">def</span> <span class="nf">tearDown</span><span class="p">(</span><span class="n">inner_self</span><span class="p">):</span> <span class="n">saved_tearDown</span><span class="p">(</span><span class="n">inner_self</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">catch_warnings</span><span class="o">.</span><span class="n">__exit__</span><span class="p">(</span><span class="o">*</span><span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">())</span> <span class="n">decorated</span><span class="o">.</span><span class="n">setUp</span> <span class="o">=</span> <span class="n">setUp</span> <span class="n">decorated</span><span class="o">.</span><span class="n">tearDown</span> <span class="o">=</span> <span class="n">tearDown</span> <span class="k">return</span> <span class="n">decorated</span> <span class="k">else</span><span class="p">:</span> <span class="nd">@wraps</span><span class="p">(</span><span class="n">decorated</span><span class="p">)</span> <span class="k">def</span> <span class="nf">inner</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">with</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">():</span> <span class="bp">self</span><span class="o">.</span><span class="n">filter_func</span><span class="p">(</span><span class="s1">'ignore'</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">ignore_kwargs</span><span class="p">)</span> <span class="k">return</span> <span class="n">decorated</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">return</span> <span class="n">inner</span> <span class="nd">@contextmanager</span> <span class="k">def</span> <span class="nf">patch_logger</span><span class="p">(</span><span class="n">logger_name</span><span class="p">,</span> <span class="n">log_level</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Context manager that takes a named logger and the logging level</span> <span class="sd"> and provides a simple mock-like list of messages received</span> <span class="sd"> """</span> <span class="n">calls</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">def</span> <span class="nf">replacement</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">calls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="n">args</span><span class="p">)</span> <span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">logger_name</span><span class="p">)</span> <span class="n">orig</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">logger</span><span class="p">,</span> <span class="n">log_level</span><span class="p">)</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">logger</span><span class="p">,</span> <span class="n">log_level</span><span class="p">,</span> <span class="n">replacement</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="k">yield</span> <span class="n">calls</span> <span class="k">finally</span><span class="p">:</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">logger</span><span class="p">,</span> <span class="n">log_level</span><span class="p">,</span> <span class="n">orig</span><span class="p">)</span> <span class="c1"># On OSes that don't provide tzset (Windows), we can't set the timezone</span> <span class="c1"># in which the program runs. As a consequence, we must skip tests that</span> <span class="c1"># don't enforce a specific timezone (with timezone.override or equivalent),</span> <span class="c1"># or attempt to interpret naive datetimes in the default timezone.</span> <span class="n">requires_tz_support</span> <span class="o">=</span> <span class="n">skipUnless</span><span class="p">(</span><span class="n">TZ_SUPPORT</span><span class="p">,</span> <span class="s2">"This test relies on the ability to run a program in an arbitrary "</span> <span class="s2">"time zone, but your operating system isn't able to do that."</span><span class="p">)</span> <span class="nd">@contextmanager</span> <span class="k">def</span> <span class="nf">extend_sys_path</span><span class="p">(</span><span class="o">*</span><span class="n">paths</span><span class="p">):</span> <span class="sd">"""Context manager to temporarily add paths to sys.path."""</span> <span class="n">_orig_sys_path</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="p">[:]</span> <span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">paths</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="k">yield</span> <span class="k">finally</span><span class="p">:</span> <span class="n">sys</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">_orig_sys_path</span> <span class="nd">@contextmanager</span> <span class="k">def</span> <span class="nf">captured_output</span><span class="p">(</span><span class="n">stream_name</span><span class="p">):</span> <span class="sd">"""Return a context manager used by captured_stdout/stdin/stderr</span> <span class="sd"> that temporarily replaces the sys stream *stream_name* with a StringIO.</span> <span class="sd"> Note: This function and the following ``captured_std*`` are copied</span> <span class="sd"> from CPython's ``test.support`` module."""</span> <span class="n">orig_stdout</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="n">stream_name</span><span class="p">)</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="n">stream_name</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">StringIO</span><span class="p">())</span> <span class="k">try</span><span class="p">:</span> <span class="k">yield</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="n">stream_name</span><span class="p">)</span> <span class="k">finally</span><span class="p">:</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="n">stream_name</span><span class="p">,</span> <span class="n">orig_stdout</span><span class="p">)</span> <span class="k">def</span> <span class="nf">captured_stdout</span><span class="p">():</span> <span class="sd">"""Capture the output of sys.stdout:</span> <span class="sd"> with captured_stdout() as stdout:</span> <span class="sd"> print("hello")</span> <span class="sd"> self.assertEqual(stdout.getvalue(), "hello\n")</span> <span class="sd"> """</span> <span class="k">return</span> <span class="n">captured_output</span><span class="p">(</span><span class="s2">"stdout"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">captured_stderr</span><span class="p">():</span> <span class="sd">"""Capture the output of sys.stderr:</span> <span class="sd"> with captured_stderr() as stderr:</span> <span class="sd"> print("hello", file=sys.stderr)</span> <span class="sd"> self.assertEqual(stderr.getvalue(), "hello\n")</span> <span class="sd"> """</span> <span class="k">return</span> <span class="n">captured_output</span><span class="p">(</span><span class="s2">"stderr"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">captured_stdin</span><span class="p">():</span> <span class="sd">"""Capture the input to sys.stdin:</span> <span class="sd"> with captured_stdin() as stdin:</span> <span class="sd"> stdin.write('hello\n')</span> <span class="sd"> stdin.seek(0)</span> <span class="sd"> # call test code that consumes from sys.stdin</span> <span class="sd"> captured = input()</span> <span class="sd"> self.assertEqual(captured, "hello")</span> <span class="sd"> """</span> <span class="k">return</span> <span class="n">captured_output</span><span class="p">(</span><span class="s2">"stdin"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">reset_warning_registry</span><span class="p">():</span> <span class="sd">"""</span> <span class="sd"> Clear warning registry for all modules. This is required in some tests</span> <span class="sd"> because of a bug in Python that prevents warnings.simplefilter("always")</span> <span class="sd"> from always making warnings appear: http://bugs.python.org/issue4180</span> <span class="sd"> The bug was fixed in Python 3.4.2.</span> <span class="sd"> """</span> <span class="n">key</span> <span class="o">=</span> <span class="s2">"__warningregistry__"</span> <span class="k">for</span> <span class="n">mod</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="o">.</span><span class="n">values</span><span class="p">():</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span> <span class="nd">@contextmanager</span> <span class="k">def</span> <span class="nf">freeze_time</span><span class="p">(</span><span class="n">t</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Context manager to temporarily freeze time.time(). This temporarily</span> <span class="sd"> modifies the time function of the time module. Modules which import the</span> <span class="sd"> time function directly (e.g. `from time import time`) won't be affected</span> <span class="sd"> This isn't meant as a public API, but helps reduce some repetitive code in</span> <span class="sd"> Django's test suite.</span> <span class="sd"> """</span> <span class="n">_real_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">t</span> <span class="k">try</span><span class="p">:</span> <span class="k">yield</span> <span class="k">finally</span><span class="p">:</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span> <span class="o">=</span> <span class="n">_real_time</span> <span class="k">def</span> <span class="nf">require_jinja2</span><span class="p">(</span><span class="n">test_func</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Decorator to enable a Jinja2 template engine in addition to the regular</span> <span class="sd"> Django template engine for a test or skip it if Jinja2 isn't available.</span> <span class="sd"> """</span> <span class="n">test_func</span> <span class="o">=</span> <span class="n">skipIf</span><span class="p">(</span><span class="n">jinja2</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">"this test requires jinja2"</span><span class="p">)(</span><span class="n">test_func</span><span class="p">)</span> <span class="n">test_func</span> <span class="o">=</span> <span class="n">override_settings</span><span class="p">(</span><span class="n">TEMPLATES</span><span class="o">=</span><span class="p">[{</span> <span class="s1">'BACKEND'</span><span class="p">:</span> <span class="s1">'django.template.backends.django.DjangoTemplates'</span><span class="p">,</span> <span class="s1">'APP_DIRS'</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="p">},</span> <span class="p">{</span> <span class="s1">'BACKEND'</span><span class="p">:</span> <span class="s1">'django.template.backends.jinja2.Jinja2'</span><span class="p">,</span> <span class="s1">'APP_DIRS'</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">'OPTIONS'</span><span class="p">:</span> <span class="p">{</span><span class="s1">'keep_trailing_newline'</span><span class="p">:</span> <span class="kc">True</span><span class="p">},</span> <span class="p">}])(</span><span class="n">test_func</span><span class="p">)</span> <span class="k">return</span> <span class="n">test_func</span> </pre></div> </div> </div> </div> <div class="yui-b" id="sidebar"> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"> <h3>Browse</h3> <ul> </ul> <h3>You are here:</h3> <ul> <li> <a href="../../../index.html">Django 1.8.19 documentation</a> <ul><li><a href="../../index.html">Module code</a> <ul><li><a href="../../django.html">django</a> <ul><li>django.test.utils</li></ul> </li></ul></li></ul> </li> </ul> <div id="searchbox" style="display: none" role="search"> <h3>Quick search</h3> <form class="search" action="../../../search.html" method="get"> <div><input type="text" name="q" /></div> <div><input type="submit" value="Go" /></div> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <h3>Last update:</h3> <p class="topless">Jan 06, 2019</p> </div> </div> <div id="ft"> <div class="nav"> <a href="../../index.html" title="Module code" accesskey="U">up</a></div> </div> </div> <div class="clearer"></div> </div> </body> </html>