<!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"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Development — Postorius 1.0a2 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.0a2', 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="top" title="Postorius 1.0a2 documentation" href="index.html" /> <link rel="prev" title="Installation" href="setup.html" /> </head> <body> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="genindex.html" title="General Index" accesskey="I">index</a></li> <li class="right" > <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > <a href="setup.html" title="Installation" accesskey="P">previous</a> |</li> <li><a href="index.html">Postorius 1.0a2 documentation</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="development"> <h1>Development<a class="headerlink" href="#development" title="Permalink to this headline">¶</a></h1> <div class="section" id="testing"> <h2>Testing<a class="headerlink" href="#testing" title="Permalink to this headline">¶</a></h2> <p>All test modules reside in the <tt class="docutils literal"><span class="pre">postorius/src/postorius/tests</span></tt> directory and this is where you should put your own tests, too. To make the django test runner find your tests, make sure to add them to the folder’s <tt class="docutils literal"><span class="pre">__init__.py</span></tt>:</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">postorius.tests</span> <span class="kn">import</span> <span class="n">test_utils</span> <span class="kn">from</span> <span class="nn">postorius.tests.test_list_members</span> <span class="kn">import</span> <span class="n">ListMembersViewTest</span> <span class="kn">from</span> <span class="nn">postorius.tests.test_list_settings</span> <span class="kn">import</span> <span class="n">ListSettingsViewTest</span> <span class="kn">from</span> <span class="nn">postorius.tests.my_own_tests</span> <span class="kn">import</span> <span class="n">MyOwnUnitTest</span> <span class="n">__test__</span> <span class="o">=</span> <span class="p">{</span> <span class="s">"Test Utils"</span><span class="p">:</span> <span class="n">test_utils</span><span class="p">,</span> <span class="s">"List Members"</span><span class="p">:</span> <span class="n">ListMembersViewTest</span><span class="p">,</span> <span class="s">"List Settings"</span><span class="p">:</span> <span class="n">ListSettingsViewTest</span><span class="p">,</span> <span class="s">"My Own Test"</span><span class="p">:</span> <span class="n">MyOwnUnitTest</span><span class="p">,</span> <span class="p">}</span> </pre></div> </div> <div class="section" id="postorius-imports-in-test-modules"> <h3><tt class="docutils literal"><span class="pre">postorius.*</span></tt> imports in test modules<a class="headerlink" href="#postorius-imports-in-test-modules" title="Permalink to this headline">¶</a></h3> <p>When writing unittests make sure that any <tt class="docutils literal"><span class="pre">postorius.*</span></tt> imports are made at the test method level and not at the module level. Here’s why:</p> <p>The Postorius documentation (the one you are reading right now) imports some doctest modules from the test package using Sphinx’s autodoc extension. This is a very nice feature, but in this scenario it has the nasty side effect of breaking the build process if application code is imported as well (it will fail to find an environment variable that Django needs to run). This can be easily prevented by avoiding module level imports of postorius code in the test modules.</p> <p>Good:</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">django.utils</span> <span class="kn">import</span> <span class="n">unittest</span> <span class="kn">from</span> <span class="nn">mock</span> <span class="kn">import</span> <span class="n">patch</span> <span class="k">class</span> <span class="nc">SomeTest</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span> <span class="k">def</span> <span class="nf">test_some_method</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="kn">from</span> <span class="nn">postorius.views</span> <span class="kn">import</span> <span class="n">SomeViewClass</span> <span class="n">foo</span> <span class="o">=</span> <span class="s">'bar'</span> </pre></div> </div> <p>Bad:</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">django.utils</span> <span class="kn">import</span> <span class="n">unittest</span> <span class="kn">from</span> <span class="nn">mock</span> <span class="kn">import</span> <span class="n">patch</span> <span class="kn">from</span> <span class="nn">postorius.views</span> <span class="kn">import</span> <span class="n">SomeViewClass</span> <span class="k">class</span> <span class="nc">SomeTest</span><span class="p">(</span><span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">):</span> <span class="k">def</span> <span class="nf">test_some_method</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">foo</span> <span class="o">=</span> <span class="s">'bar'</span> </pre></div> </div> </div> <div class="section" id="mocking"> <h3>Mocking<a class="headerlink" href="#mocking" title="Permalink to this headline">¶</a></h3> <p>Postorius uses Michael Foord’s <tt class="docutils literal"><span class="pre">mock</span></tt> library for mocking. There are some shortcuts you can use to quickly create mock objects that behave a little bit like objects retreived from mailman.client, like:</p> <ul class="simple"> <li>Domains</li> <li>Mailing Lists</li> <li>Users</li> <li>Memberships</li> <li>Addresses</li> </ul> <div class="section" id="module-postorius.tests.test_utils"> <span id="mocking-mailman-client-objects"></span><h4>Mocking mailman.client objects<a class="headerlink" href="#module-postorius.tests.test_utils" title="Permalink to this headline">¶</a></h4> <div class="section" id="domains"> <h5>Domains<a class="headerlink" href="#domains" title="Permalink to this headline">¶</a></h5> <p><tt class="docutils literal"><span class="pre">postorius.tests.utils.create_mock_list</span></tt> creates a mock domain object:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">properties</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">contact_address</span><span class="o">=</span><span class="s">'postmaster@example.org'</span><span class="p">,</span> <span class="gp">... </span> <span class="n">description</span><span class="o">=</span><span class="s">'Example dot Org'</span><span class="p">,</span> <span class="gp">... </span> <span class="n">mail_host</span><span class="o">=</span><span class="s">'example.org'</span><span class="p">,</span> <span class="gp">... </span> <span class="n">url_host</span><span class="o">=</span><span class="s">'www.example.org'</span><span class="p">)</span> <span class="gp">>>> </span><span class="n">mock_domain</span> <span class="o">=</span> <span class="n">create_mock_domain</span><span class="p">(</span><span class="n">properties</span><span class="p">)</span> <span class="gp">>>> </span><span class="k">print</span> <span class="n">mock_domain</span> <span class="go"><MagicMock name='Domain' id='...'></span> <span class="gp">>>> </span><span class="k">print</span> <span class="n">mock_domain</span><span class="o">.</span><span class="n">contact_address</span> <span class="go">postmaster@example.org</span> <span class="gp">>>> </span><span class="k">print</span> <span class="n">mock_domain</span><span class="o">.</span><span class="n">description</span> <span class="go">Example dot Org</span> <span class="gp">>>> </span><span class="k">print</span> <span class="n">mock_domain</span><span class="o">.</span><span class="n">mail_host</span> <span class="go">example.org</span> <span class="gp">>>> </span><span class="k">print</span> <span class="n">mock_domain</span><span class="o">.</span><span class="n">url_host</span> <span class="go">www.example.org</span> </pre></div> </div> </div> <div class="section" id="mailing-lists"> <h5>Mailing Lists<a class="headerlink" href="#mailing-lists" title="Permalink to this headline">¶</a></h5> <p><tt class="docutils literal"><span class="pre">postorius.tests.utils.create_mock_list</span></tt> creates a mock list object:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">properties</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">fqdn_listname</span><span class="o">=</span><span class="s">'testlist@example.org'</span><span class="p">,</span> <span class="gp">... </span> <span class="n">mail_host</span><span class="o">=</span><span class="s">'example.org'</span><span class="p">,</span> <span class="gp">... </span> <span class="n">list_name</span><span class="o">=</span><span class="s">'testlist'</span><span class="p">,</span> <span class="gp">... </span> <span class="n">display_name</span><span class="o">=</span><span class="s">'Test List'</span><span class="p">)</span> <span class="gp">>>> </span><span class="n">mock_list</span> <span class="o">=</span> <span class="n">create_mock_list</span><span class="p">(</span><span class="n">properties</span><span class="p">)</span> <span class="gp">>>> </span><span class="k">print</span> <span class="n">mock_list</span> <span class="go"><MagicMock name='List' id='...'></span> <span class="gp">>>> </span><span class="k">print</span> <span class="n">mock_list</span><span class="o">.</span><span class="n">fqdn_listname</span> <span class="go">testlist@example.org</span> <span class="gp">>>> </span><span class="k">print</span> <span class="n">mock_list</span><span class="o">.</span><span class="n">mail_host</span> <span class="go">example.org</span> <span class="gp">>>> </span><span class="k">print</span> <span class="n">mock_list</span><span class="o">.</span><span class="n">list_name</span> <span class="go">testlist</span> <span class="gp">>>> </span><span class="k">print</span> <span class="n">mock_list</span><span class="o">.</span><span class="n">display_name</span> <span class="go">Test List</span> </pre></div> </div> </div> <div class="section" id="memberships"> <h5>Memberships<a class="headerlink" href="#memberships" title="Permalink to this headline">¶</a></h5> <p><tt class="docutils literal"><span class="pre">postorius.tests.utils.create_mock_list</span></tt> creates a mock list object:</p> <div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">properties</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">fqdn_listname</span><span class="o">=</span><span class="s">'testlist@example.org'</span><span class="p">,</span> <span class="gp">... </span> <span class="n">address</span><span class="o">=</span><span class="s">'les@example.org'</span><span class="p">,)</span> <span class="gp">>>> </span><span class="n">mock_member</span> <span class="o">=</span> <span class="n">create_mock_member</span><span class="p">(</span><span class="n">properties</span><span class="p">)</span> <span class="gp">>>> </span><span class="k">print</span> <span class="n">mock_member</span> <span class="go"><MagicMock name='Member' id='...'></span> <span class="gp">>>> </span><span class="k">print</span> <span class="n">mock_member</span><span class="o">.</span><span class="n">fqdn_listname</span> <span class="go">testlist@example.org</span> <span class="gp">>>> </span><span class="k">print</span> <span class="n">mock_member</span><span class="o">.</span><span class="n">address</span> <span class="go">les@example.org</span> </pre></div> </div> </div> </div> </div> </div> </div> </div> </div> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <h3><a href="index.html">Table Of Contents</a></h3> <ul> <li><a class="reference internal" href="#">Development</a><ul> <li><a class="reference internal" href="#testing">Testing</a><ul> <li><a class="reference internal" href="#postorius-imports-in-test-modules"><tt class="docutils literal"><span class="pre">postorius.*</span></tt> imports in test modules</a></li> <li><a class="reference internal" href="#mocking">Mocking</a><ul> <li><a class="reference internal" href="#module-postorius.tests.test_utils">Mocking mailman.client objects</a><ul> <li><a class="reference internal" href="#domains">Domains</a></li> <li><a class="reference internal" href="#mailing-lists">Mailing Lists</a></li> <li><a class="reference internal" href="#memberships">Memberships</a></li> </ul> </li> </ul> </li> </ul> </li> </ul> </li> </ul> <h4>Previous topic</h4> <p class="topless"><a href="setup.html" title="previous chapter">Installation</a></p> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="_sources/development.txt" rel="nofollow">Show Source</a></li> </ul> <div id="searchbox" style="display: none"> <h3>Quick search</h3> <form class="search" action="search.html" method="get"> <input type="text" name="q" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> Enter search terms or a module, class or function name. </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="genindex.html" title="General Index" >index</a></li> <li class="right" > <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > <a href="setup.html" title="Installation" >previous</a> |</li> <li><a href="index.html">Postorius 1.0a2 documentation</a> »</li> </ul> </div> <div class="footer"> © Copyright 2012, The Free Software Foundation. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2. </div> </body> </html>