evennia/docs/1.0-dev/_modules/evennia/utils/test_resources.html
Evennia docbuilder action 7488061f2a Updated HTML docs.
2022-11-19 17:26:48 +00:00

719 lines
No EOL
78 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.utils.test_resources &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<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="nav-item nav-item-0"><a href="../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.utils.test_resources</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../index.html">
<img class="logo" src="../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com">Home page</a> </li>
<li><a href="https://github.com/evennia/evennia">Evennia Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li>
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
<a href="https://evennia.blogspot.com/">Blog</a>
</li>
</ul>
<h3>Versions</h3>
<ul>
<li><a href="test_resources.html">1.0-dev (develop branch)</a></li>
<ul>
<li><a href="../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.utils.test_resources</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Various helper resources for writing unittests.</span>
<span class="sd">Classes for testing Evennia core:</span>
<span class="sd">- `BaseEvenniaTestCase` - no default objects, only enforced default settings</span>
<span class="sd">- `BaseEvenniaTest` - all default objects, enforced default settings</span>
<span class="sd">- `BaseEvenniaCommandTest` - for testing Commands, enforced default settings</span>
<span class="sd">Classes for testing game folder content:</span>
<span class="sd">- `EvenniaTestCase` - no default objects, using gamedir settings (identical to</span>
<span class="sd"> standard Python TestCase)</span>
<span class="sd">- `EvenniaTest` - all default objects, using gamedir settings</span>
<span class="sd">- `EvenniaCommandTest` - for testing game folder commands, using gamedir settings</span>
<span class="sd">Other:</span>
<span class="sd">- `EvenniaTestMixin` - A class mixin for creating the test environment objects, for</span>
<span class="sd"> making custom tests.</span>
<span class="sd">- `EvenniaCommandMixin` - A class mixin that adds support for command testing with the .call()</span>
<span class="sd"> helper. Used by the command-test classes, but can be used for making a customt test class.</span>
<span class="sd">&quot;&quot;&quot;</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">types</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">TestCase</span><span class="p">,</span> <span class="n">override_settings</span>
<span class="kn">from</span> <span class="nn">mock</span> <span class="kn">import</span> <span class="n">MagicMock</span><span class="p">,</span> <span class="n">Mock</span><span class="p">,</span> <span class="n">patch</span>
<span class="kn">from</span> <span class="nn">twisted.internet.defer</span> <span class="kn">import</span> <span class="n">Deferred</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="kn">import</span> <span class="n">settings_default</span>
<span class="kn">from</span> <span class="nn">evennia.accounts.accounts</span> <span class="kn">import</span> <span class="n">DefaultAccount</span>
<span class="kn">from</span> <span class="nn">evennia.commands.command</span> <span class="kn">import</span> <span class="n">InterruptCommand</span>
<span class="kn">from</span> <span class="nn">evennia.commands.default.muxcommand</span> <span class="kn">import</span> <span class="n">MuxCommand</span>
<span class="kn">from</span> <span class="nn">evennia.objects.objects</span> <span class="kn">import</span> <span class="p">(</span>
<span class="n">DefaultCharacter</span><span class="p">,</span>
<span class="n">DefaultExit</span><span class="p">,</span>
<span class="n">DefaultObject</span><span class="p">,</span>
<span class="n">DefaultRoom</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span> <span class="nn">evennia.scripts.scripts</span> <span class="kn">import</span> <span class="n">DefaultScript</span>
<span class="kn">from</span> <span class="nn">evennia.server.serversession</span> <span class="kn">import</span> <span class="n">ServerSession</span>
<span class="kn">from</span> <span class="nn">evennia.server.sessionhandler</span> <span class="kn">import</span> <span class="n">SESSIONS</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">ansi</span><span class="p">,</span> <span class="n">create</span>
<span class="kn">from</span> <span class="nn">evennia.utils.idmapper.models</span> <span class="kn">import</span> <span class="n">flush_cache</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">all_from_module</span><span class="p">,</span> <span class="n">to_str</span>
<span class="n">_RE_STRIP_EVMENU</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="sa">r</span><span class="s2">&quot;^\+|-+\+|\+-+|--+|\|(?:\s|$)&quot;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
<span class="c1"># set up a &#39;pristine&#39; setting, unaffected by any changes in mygame</span>
<span class="n">DEFAULT_SETTING_RESETS</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="n">CONNECTION_SCREEN_MODULE</span><span class="o">=</span><span class="s2">&quot;evennia.game_template.server.conf.connection_screens&quot;</span><span class="p">,</span>
<span class="n">AT_SERVER_STARTSTOP_MODULE</span><span class="o">=</span><span class="s2">&quot;evennia.game_template.server.conf.at_server_startstop&quot;</span><span class="p">,</span>
<span class="n">AT_SERVICES_PLUGINS_MODULES</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;evennia.game_template.server.conf.server_services_plugins&quot;</span><span class="p">],</span>
<span class="n">PORTAL_SERVICES_PLUGIN_MODULES</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;evennia.game_template.server.conf.portal_services_plugins&quot;</span><span class="p">],</span>
<span class="n">MSSP_META_MODULE</span><span class="o">=</span><span class="s2">&quot;evennia.game_template.server.conf.mssp&quot;</span><span class="p">,</span>
<span class="n">WEB_PLUGINS_MODULE</span><span class="o">=</span><span class="s2">&quot;server.conf.web_plugins&quot;</span><span class="p">,</span>
<span class="n">LOCK_FUNC_MODULES</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;evennia.locks.lockfuncs&quot;</span><span class="p">,</span> <span class="s2">&quot;evennia.game_template.server.conf.lockfuncs&quot;</span><span class="p">),</span>
<span class="n">INPUT_FUNC_MODULES</span><span class="o">=</span><span class="p">[</span>
<span class="s2">&quot;evennia.server.inputfuncs&quot;</span><span class="p">,</span>
<span class="s2">&quot;evennia.game_template.server.conf.inputfuncs&quot;</span><span class="p">,</span>
<span class="p">],</span>
<span class="n">PROTOTYPE_MODULES</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;evennia.game_template.world.prototypes&quot;</span><span class="p">],</span>
<span class="n">CMDSET_UNLOGGEDIN</span><span class="o">=</span><span class="s2">&quot;evennia.game_template.commands.default_cmdsets.UnloggedinCmdSet&quot;</span><span class="p">,</span>
<span class="n">CMDSET_SESSION</span><span class="o">=</span><span class="s2">&quot;evennia.game_template.commands.default_cmdsets.SessionCmdSet&quot;</span><span class="p">,</span>
<span class="n">CMDSET_CHARACTER</span><span class="o">=</span><span class="s2">&quot;evennia.game_template.commands.default_cmdsets.CharacterCmdSet&quot;</span><span class="p">,</span>
<span class="n">CMDSET_ACCOUNT</span><span class="o">=</span><span class="s2">&quot;evennia.game_template.commands.default_cmdsets.AccountCmdSet&quot;</span><span class="p">,</span>
<span class="n">CMDSET_PATHS</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;evennia.game_template.commands&quot;</span><span class="p">,</span> <span class="s2">&quot;evennia&quot;</span><span class="p">,</span> <span class="s2">&quot;evennia.contrib&quot;</span><span class="p">],</span>
<span class="n">TYPECLASS_PATHS</span><span class="o">=</span><span class="p">[</span>
<span class="s2">&quot;evennia&quot;</span><span class="p">,</span>
<span class="s2">&quot;evennia.contrib&quot;</span><span class="p">,</span>
<span class="s2">&quot;evennia.contrib.game_systems&quot;</span><span class="p">,</span>
<span class="s2">&quot;evennia.contrib.base_systems&quot;</span><span class="p">,</span>
<span class="s2">&quot;evennia.contrib.full_systems&quot;</span><span class="p">,</span>
<span class="s2">&quot;evennia.contrib.tutorials&quot;</span><span class="p">,</span>
<span class="s2">&quot;evennia.contrib.utils&quot;</span><span class="p">,</span>
<span class="p">],</span>
<span class="n">BASE_ACCOUNT_TYPECLASS</span><span class="o">=</span><span class="s2">&quot;evennia.accounts.accounts.DefaultAccount&quot;</span><span class="p">,</span>
<span class="n">BASE_OBJECT_TYPECLASS</span><span class="o">=</span><span class="s2">&quot;evennia.objects.objects.DefaultObject&quot;</span><span class="p">,</span>
<span class="n">BASE_CHARACTER_TYPECLASS</span><span class="o">=</span><span class="s2">&quot;evennia.objects.objects.DefaultCharacter&quot;</span><span class="p">,</span>
<span class="n">BASE_ROOM_TYPECLASS</span><span class="o">=</span><span class="s2">&quot;evennia.objects.objects.DefaultRoom&quot;</span><span class="p">,</span>
<span class="n">BASE_EXIT_TYPECLASS</span><span class="o">=</span><span class="s2">&quot;evennia.objects.objects.DefaultExit&quot;</span><span class="p">,</span>
<span class="n">BASE_CHANNEL_TYPECLASS</span><span class="o">=</span><span class="s2">&quot;evennia.comms.comms.DefaultChannel&quot;</span><span class="p">,</span>
<span class="n">BASE_SCRIPT_TYPECLASS</span><span class="o">=</span><span class="s2">&quot;evennia.scripts.scripts.DefaultScript&quot;</span><span class="p">,</span>
<span class="n">BASE_BATCHPROCESS_PATHS</span><span class="o">=</span><span class="p">[</span>
<span class="s2">&quot;evennia.game_template.world&quot;</span><span class="p">,</span>
<span class="s2">&quot;evennia.contrib&quot;</span><span class="p">,</span>
<span class="s2">&quot;evennia.contrib.tutorials&quot;</span><span class="p">,</span>
<span class="p">],</span>
<span class="n">FILE_HELP_ENTRY_MODULES</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;evennia.game_template.world.help_entries&quot;</span><span class="p">],</span>
<span class="n">FUNCPARSER_OUTGOING_MESSAGES_MODULES</span><span class="o">=</span><span class="p">[</span>
<span class="s2">&quot;evennia.utils.funcparser&quot;</span><span class="p">,</span>
<span class="s2">&quot;evennia.game_template.server.conf.inlinefuncs&quot;</span><span class="p">,</span>
<span class="p">],</span>
<span class="n">FUNCPARSER_PROTOTYPE_PARSING_MODULES</span><span class="o">=</span><span class="p">[</span>
<span class="s2">&quot;evennia.prototypes.protfuncs&quot;</span><span class="p">,</span>
<span class="s2">&quot;evennia.game_template.server.conf.prototypefuncs&quot;</span><span class="p">,</span>
<span class="p">],</span>
<span class="n">BASE_GUEST_TYPECLASS</span><span class="o">=</span><span class="s2">&quot;evennia.accounts.accounts.DefaultGuest&quot;</span><span class="p">,</span>
<span class="c1"># a special setting boolean _TEST_ENVIRONMENT is set by the test runner</span>
<span class="c1"># while the test suite is running.</span>
<span class="p">)</span>
<span class="n">DEFAULT_SETTINGS</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">all_from_module</span><span class="p">(</span><span class="n">settings_default</span><span class="p">),</span> <span class="o">**</span><span class="n">DEFAULT_SETTING_RESETS</span><span class="p">}</span>
<span class="n">DEFAULT_SETTINGS</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;DATABASES&quot;</span><span class="p">)</span> <span class="c1"># we want different dbs tested in CI</span>
<span class="c1"># mocking of evennia.utils.utils.delay</span>
<div class="viewcode-block" id="mockdelay"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.mockdelay">[docs]</a><span class="k">def</span> <span class="nf">mockdelay</span><span class="p">(</span><span class="n">timedelay</span><span class="p">,</span> <span class="n">callback</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">callback</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">Deferred</span><span class="p">()</span></div>
<span class="c1"># mocking of twisted&#39;s deferLater</span>
<div class="viewcode-block" id="mockdeferLater"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.mockdeferLater">[docs]</a><span class="k">def</span> <span class="nf">mockdeferLater</span><span class="p">(</span><span class="n">reactor</span><span class="p">,</span> <span class="n">timedelay</span><span class="p">,</span> <span class="n">callback</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">callback</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">Deferred</span><span class="p">()</span></div>
<div class="viewcode-block" id="unload_module"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.unload_module">[docs]</a><span class="k">def</span> <span class="nf">unload_module</span><span class="p">(</span><span class="n">module</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Reset import so one can mock global constants.</span>
<span class="sd"> Args:</span>
<span class="sd"> module (module, object or str): The module will</span>
<span class="sd"> be removed so it will have to be imported again. If given</span>
<span class="sd"> an object, the module in which that object sits will be unloaded. A string</span>
<span class="sd"> should directly give the module pathname to unload.</span>
<span class="sd"> Example:</span>
<span class="sd"> ```python</span>
<span class="sd"> # (in a test method)</span>
<span class="sd"> unload_module(foo)</span>
<span class="sd"> with mock.patch(&quot;foo.GLOBALTHING&quot;, &quot;mockval&quot;):</span>
<span class="sd"> import foo</span>
<span class="sd"> ... # test code using foo.GLOBALTHING, now set to &#39;mockval&#39;</span>
<span class="sd"> ```</span>
<span class="sd"> This allows for mocking constants global to the module, since</span>
<span class="sd"> otherwise those would not be mocked (since a module is only</span>
<span class="sd"> loaded once).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">modulename</span> <span class="o">=</span> <span class="n">module</span>
<span class="k">elif</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="s2">&quot;__module__&quot;</span><span class="p">):</span>
<span class="n">modulename</span> <span class="o">=</span> <span class="n">module</span><span class="o">.</span><span class="vm">__module__</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">modulename</span> <span class="o">=</span> <span class="n">module</span><span class="o">.</span><span class="vm">__name__</span>
<span class="k">if</span> <span class="n">modulename</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">:</span>
<span class="k">del</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">[</span><span class="n">modulename</span><span class="p">]</span></div>
<span class="k">def</span> <span class="nf">_mock_deferlater</span><span class="p">(</span><span class="n">reactor</span><span class="p">,</span> <span class="n">timedelay</span><span class="p">,</span> <span class="n">callback</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">callback</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">Deferred</span><span class="p">()</span>
<div class="viewcode-block" id="EvenniaTestMixin"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaTestMixin">[docs]</a><span class="k">class</span> <span class="nc">EvenniaTestMixin</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Evennia test environment mixin</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">account_typeclass</span> <span class="o">=</span> <span class="n">DefaultAccount</span>
<span class="n">object_typeclass</span> <span class="o">=</span> <span class="n">DefaultObject</span>
<span class="n">character_typeclass</span> <span class="o">=</span> <span class="n">DefaultCharacter</span>
<span class="n">exit_typeclass</span> <span class="o">=</span> <span class="n">DefaultExit</span>
<span class="n">room_typeclass</span> <span class="o">=</span> <span class="n">DefaultRoom</span>
<span class="n">script_typeclass</span> <span class="o">=</span> <span class="n">DefaultScript</span>
<div class="viewcode-block" id="EvenniaTestMixin.create_accounts"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaTestMixin.create_accounts">[docs]</a> <span class="k">def</span> <span class="nf">create_accounts</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">account</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_account</span><span class="p">(</span>
<span class="s2">&quot;TestAccount&quot;</span><span class="p">,</span>
<span class="n">email</span><span class="o">=</span><span class="s2">&quot;test@test.com&quot;</span><span class="p">,</span>
<span class="n">password</span><span class="o">=</span><span class="s2">&quot;testpassword&quot;</span><span class="p">,</span>
<span class="n">typeclass</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">account_typeclass</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account2</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_account</span><span class="p">(</span>
<span class="s2">&quot;TestAccount2&quot;</span><span class="p">,</span>
<span class="n">email</span><span class="o">=</span><span class="s2">&quot;test@test.com&quot;</span><span class="p">,</span>
<span class="n">password</span><span class="o">=</span><span class="s2">&quot;testpassword&quot;</span><span class="p">,</span>
<span class="n">typeclass</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">account_typeclass</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">permissions</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;Developer&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaTestMixin.teardown_accounts"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaTestMixin.teardown_accounts">[docs]</a> <span class="k">def</span> <span class="nf">teardown_accounts</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;account&quot;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;account2&quot;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account2</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span></div>
<span class="c1"># Set up fake prototype module for allowing tests to use named prototypes.</span>
<div class="viewcode-block" id="EvenniaTestMixin.create_rooms"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaTestMixin.create_rooms">[docs]</a> <span class="nd">@override_settings</span><span class="p">(</span>
<span class="n">PROTOTYPE_MODULES</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;evennia.utils.tests.data.prototypes_example&quot;</span><span class="p">],</span> <span class="n">DEFAULT_HOME</span><span class="o">=</span><span class="s2">&quot;#1&quot;</span>
<span class="p">)</span>
<span class="k">def</span> <span class="nf">create_rooms</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">room1</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">room_typeclass</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;Room&quot;</span><span class="p">,</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">room1</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">desc</span> <span class="o">=</span> <span class="s2">&quot;room_desc&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">room2</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">room_typeclass</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;Room2&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exit</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exit_typeclass</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;out&quot;</span><span class="p">,</span> <span class="n">location</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">room1</span><span class="p">,</span> <span class="n">destination</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">room2</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaTestMixin.create_objs"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaTestMixin.create_objs">[docs]</a> <span class="k">def</span> <span class="nf">create_objs</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">obj1</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">object_typeclass</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;Obj&quot;</span><span class="p">,</span> <span class="n">location</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">room1</span><span class="p">,</span> <span class="n">home</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">room1</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">obj2</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">object_typeclass</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;Obj2&quot;</span><span class="p">,</span> <span class="n">location</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">room1</span><span class="p">,</span> <span class="n">home</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">room1</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaTestMixin.create_chars"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaTestMixin.create_chars">[docs]</a> <span class="k">def</span> <span class="nf">create_chars</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">char1</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">character_typeclass</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;Char&quot;</span><span class="p">,</span> <span class="n">location</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">room1</span><span class="p">,</span> <span class="n">home</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">room1</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="o">.</span><span class="n">permissions</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;Developer&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char2</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">character_typeclass</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;Char2&quot;</span><span class="p">,</span> <span class="n">location</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">room1</span><span class="p">,</span> <span class="n">home</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">room1</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="o">.</span><span class="n">account</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">account</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">char1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char2</span><span class="o">.</span><span class="n">account</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">account2</span>
<span class="bp">self</span><span class="o">.</span><span class="n">account2</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">_last_puppet</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">char2</span></div>
<div class="viewcode-block" id="EvenniaTestMixin.create_script"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaTestMixin.create_script">[docs]</a> <span class="k">def</span> <span class="nf">create_script</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">script</span> <span class="o">=</span> <span class="n">create</span><span class="o">.</span><span class="n">create_script</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">script_typeclass</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;Script&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvenniaTestMixin.setup_session"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaTestMixin.setup_session">[docs]</a> <span class="k">def</span> <span class="nf">setup_session</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">dummysession</span> <span class="o">=</span> <span class="n">ServerSession</span><span class="p">()</span>
<span class="n">dummysession</span><span class="o">.</span><span class="n">init_session</span><span class="p">(</span><span class="s2">&quot;telnet&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;localhost&quot;</span><span class="p">,</span> <span class="s2">&quot;testmode&quot;</span><span class="p">),</span> <span class="n">SESSIONS</span><span class="p">)</span>
<span class="n">dummysession</span><span class="o">.</span><span class="n">sessid</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">portal_connect</span><span class="p">(</span>
<span class="n">dummysession</span><span class="o">.</span><span class="n">get_sync_data</span><span class="p">()</span>
<span class="p">)</span> <span class="c1"># note that this creates a new Session!</span>
<span class="n">session</span> <span class="o">=</span> <span class="n">SESSIONS</span><span class="o">.</span><span class="n">session_from_sessid</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># the real session</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">account</span><span class="p">,</span> <span class="n">testmode</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="n">session</span></div>
<div class="viewcode-block" id="EvenniaTestMixin.teardown_session"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaTestMixin.teardown_session">[docs]</a> <span class="k">def</span> <span class="nf">teardown_session</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;sessions&quot;</span><span class="p">):</span>
<span class="k">del</span> <span class="n">SESSIONS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">sessid</span><span class="p">]</span></div>
<div class="viewcode-block" id="EvenniaTestMixin.setUp"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaTestMixin.setUp">[docs]</a> <span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.scripts.taskhandler.deferLater&quot;</span><span class="p">,</span> <span class="n">_mock_deferlater</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Sets up testing environment</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">backups</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">data_out</span><span class="p">,</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">disconnect</span><span class="p">,</span>
<span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_HOME</span><span class="p">,</span>
<span class="n">settings</span><span class="o">.</span><span class="n">PROTOTYPE_MODULES</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">data_out</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">disconnect</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_accounts</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_rooms</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_objs</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_chars</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_script</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">setup_session</span><span class="p">()</span></div>
<div class="viewcode-block" id="EvenniaTestMixin.tearDown"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaTestMixin.tearDown">[docs]</a> <span class="k">def</span> <span class="nf">tearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">flush_cache</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">data_out</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">backups</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">SESSIONS</span><span class="o">.</span><span class="n">disconnect</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">backups</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_HOME</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">backups</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="n">settings</span><span class="o">.</span><span class="n">PROTOTYPE_MODULES</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">backups</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">AttributeError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">err</span><span class="si">}</span><span class="s2">: Teardown error. If you overrode the `setUp()` method &quot;</span>
<span class="s2">&quot;in your test, make sure you also added `super().setUp()`!&quot;</span>
<span class="p">)</span>
<span class="k">del</span> <span class="n">SESSIONS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">sessid</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">teardown_accounts</span><span class="p">()</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">tearDown</span><span class="p">()</span></div></div>
<div class="viewcode-block" id="EvenniaCommandTestMixin"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaCommandTestMixin">[docs]</a><span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.server.portal.portal.LoopingCall&quot;</span><span class="p">,</span> <span class="n">new</span><span class="o">=</span><span class="n">MagicMock</span><span class="p">())</span>
<span class="k">class</span> <span class="nc">EvenniaCommandTestMixin</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Mixin to add to a test in order to provide the `.call` helper for</span>
<span class="sd"> testing the execution and returns of a command.</span>
<span class="sd"> Tests a Command by running it and comparing what messages it sends with</span>
<span class="sd"> expected values. This tests without actually spinning up the cmdhandler</span>
<span class="sd"> for every test, which is more controlled.</span>
<span class="sd"> Example:</span>
<span class="sd"> ::</span>
<span class="sd"> from commands.echo import CmdEcho</span>
<span class="sd"> class MyCommandTest(EvenniaTest, CommandTestMixin):</span>
<span class="sd"> def test_echo(self):</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="sd"> Test that the echo command really returns</span>
<span class="sd"> what you pass into it.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="sd"> self.call(MyCommand(), &quot;hello world!&quot;,</span>
<span class="sd"> &quot;You hear your echo: &#39;Hello world!&#39;&quot;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># formatting for .call&#39;s error message</span>
<span class="n">_ERROR_FORMAT</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">=========================== Wanted message ===================================</span>
<span class="si">{expected_msg}</span><span class="s2"></span>
<span class="s2">=========================== Returned message =================================</span>
<span class="si">{returned_msg}</span><span class="s2"></span>
<span class="s2">==============================================================================</span>
<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">rstrip</span><span class="p">()</span>
<div class="viewcode-block" id="EvenniaCommandTestMixin.call"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaCommandTestMixin.call">[docs]</a> <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">cmdobj</span><span class="p">,</span>
<span class="n">input_args</span><span class="p">,</span>
<span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">cmdset</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">noansi</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">caller</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">receiver</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">cmdstring</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">inputs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">raw_string</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test a command by assigning all the needed properties to a cmdobj and</span>
<span class="sd"> running the sequence. The resulting `.msg` calls will be mocked and</span>
<span class="sd"> the text= calls to them compared to a expected output.</span>
<span class="sd"> Args:</span>
<span class="sd"> cmdobj (Command): The command object to use.</span>
<span class="sd"> input_args (str): This should be the full input the Command should</span>
<span class="sd"> see, such as &#39;look here&#39;. This will become `.args` for the Command</span>
<span class="sd"> instance to parse.</span>
<span class="sd"> msg (str or dict, optional): This is the expected return value(s)</span>
<span class="sd"> returned through `caller.msg(text=...)` calls in the command. If a string, the</span>
<span class="sd"> receiver is controlled with the `receiver` kwarg (defaults to `caller`).</span>
<span class="sd"> If this is a `dict`, it is a mapping</span>
<span class="sd"> `{receiver1: &quot;expected1&quot;, receiver2: &quot;expected2&quot;,...}` and `receiver` is</span>
<span class="sd"> ignored. The message(s) are compared with the actual messages returned</span>
<span class="sd"> to the receiver(s) as the Command runs. Each check uses `.startswith`,</span>
<span class="sd"> so you can choose to only include the first part of the</span>
<span class="sd"> returned message if that&#39;s enough to verify a correct result. EvMenu</span>
<span class="sd"> decorations (like borders) are stripped and should not be included. This</span>
<span class="sd"> should also not include color tags unless `noansi=False`.</span>
<span class="sd"> If the command returns texts in multiple separate `.msg`-</span>
<span class="sd"> calls to a receiver, separate these with `|` if `noansi=True`</span>
<span class="sd"> (default) and `||` if `noansi=False`. If no `msg` is given (`None`),</span>
<span class="sd"> then no automatic comparison will be done.</span>
<span class="sd"> cmdset (str, optional): If given, make `.cmdset` available on the Command</span>
<span class="sd"> instance as it runs. While `.cmdset` is normally available on the</span>
<span class="sd"> Command instance by default, this is usually only used by</span>
<span class="sd"> commands that explicitly operates/displays cmdsets, like</span>
<span class="sd"> `examine`.</span>
<span class="sd"> noansi (str, optional): By default the color tags of the `msg` is</span>
<span class="sd"> ignored, this makes them significant. If unset, `msg` must contain</span>
<span class="sd"> the same color tags as the actual return message.</span>
<span class="sd"> caller (Object or Account, optional): By default `self.char1` is used as the</span>
<span class="sd"> command-caller (the `.caller` property on the Command). This allows to</span>
<span class="sd"> execute with another caller, most commonly an Account.</span>
<span class="sd"> receiver (Object or Account, optional): This is the object to receive the</span>
<span class="sd"> return messages we want to test. By default this is the same as `caller`</span>
<span class="sd"> (which in turn defaults to is `self.char1`). Note that if `msg` is</span>
<span class="sd"> a `dict`, this is ignored since the receiver is already specified there.</span>
<span class="sd"> cmdstring (str, optional): Normally this is the Command&#39;s `key`.</span>
<span class="sd"> This allows for tweaking the `.cmdname` property of the</span>
<span class="sd"> Command`. This isb used for commands with multiple aliases,</span>
<span class="sd"> where the command explicitly checs which alias was used to</span>
<span class="sd"> determine its functionality.</span>
<span class="sd"> obj (str, optional): This sets the `.obj` property of the Command - the</span>
<span class="sd"> object on which the Command &#39;sits&#39;. By default this is the same as `caller`.</span>
<span class="sd"> This can be used for testing on-object Command interactions.</span>
<span class="sd"> inputs (list, optional): A list of strings to pass to functions that pause to</span>
<span class="sd"> take input from the user (normally using `@interactive` and</span>
<span class="sd"> `ret = yield(question)` or `evmenu.get_input`). Each element of the</span>
<span class="sd"> list will be passed into the command as if the user answered each prompt</span>
<span class="sd"> in that order.</span>
<span class="sd"> raw_string (str, optional): Normally the `.raw_string` property is set as</span>
<span class="sd"> a combination of your `key/cmdname` and `input_args`. This allows</span>
<span class="sd"> direct control of what this is, for example for testing edge cases</span>
<span class="sd"> or malformed inputs.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str or dict: The message sent to `receiver`, or a dict of</span>
<span class="sd"> `{receiver: &quot;msg&quot;, ...}` if multiple are given. This is usually</span>
<span class="sd"> only used with `msg=None` to do the validation externally.</span>
<span class="sd"> Raises:</span>
<span class="sd"> AssertionError: If the returns of `.msg` calls (tested with `.startswith`) does not</span>
<span class="sd"> match `expected_input`.</span>
<span class="sd"> Notes:</span>
<span class="sd"> As part of the tests, all methods of the Command will be called in</span>
<span class="sd"> the proper order:</span>
<span class="sd"> - cmdobj.at_pre_cmd()</span>
<span class="sd"> - cmdobj.parse()</span>
<span class="sd"> - cmdobj.func()</span>
<span class="sd"> - cmdobj.at_post_cmd()</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># The `self.char1` is created in the `EvenniaTest` base along with</span>
<span class="c1"># other helper objects like self.room and self.obj</span>
<span class="n">caller</span> <span class="o">=</span> <span class="n">caller</span> <span class="k">if</span> <span class="n">caller</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">char1</span>
<span class="n">cmdobj</span><span class="o">.</span><span class="n">caller</span> <span class="o">=</span> <span class="n">caller</span>
<span class="n">cmdobj</span><span class="o">.</span><span class="n">cmdname</span> <span class="o">=</span> <span class="n">cmdstring</span> <span class="k">if</span> <span class="n">cmdstring</span> <span class="k">else</span> <span class="n">cmdobj</span><span class="o">.</span><span class="n">key</span>
<span class="n">cmdobj</span><span class="o">.</span><span class="n">raw_cmdname</span> <span class="o">=</span> <span class="n">cmdobj</span><span class="o">.</span><span class="n">cmdname</span>
<span class="n">cmdobj</span><span class="o">.</span><span class="n">cmdstring</span> <span class="o">=</span> <span class="n">cmdobj</span><span class="o">.</span><span class="n">cmdname</span> <span class="c1"># deprecated</span>
<span class="n">cmdobj</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="n">input_args</span>
<span class="n">cmdobj</span><span class="o">.</span><span class="n">cmdset</span> <span class="o">=</span> <span class="n">cmdset</span>
<span class="n">cmdobj</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="n">SESSIONS</span><span class="o">.</span><span class="n">session_from_sessid</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">cmdobj</span><span class="o">.</span><span class="n">account</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">account</span>
<span class="n">cmdobj</span><span class="o">.</span><span class="n">raw_string</span> <span class="o">=</span> <span class="n">raw_string</span> <span class="k">if</span> <span class="n">raw_string</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">cmdobj</span><span class="o">.</span><span class="n">key</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span> <span class="o">+</span> <span class="n">input_args</span>
<span class="n">cmdobj</span><span class="o">.</span><span class="n">obj</span> <span class="o">=</span> <span class="n">obj</span> <span class="ow">or</span> <span class="p">(</span><span class="n">caller</span> <span class="k">if</span> <span class="n">caller</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="p">)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="n">inputs</span> <span class="ow">or</span> <span class="p">[]</span>
<span class="c1"># set up receivers</span>
<span class="n">receiver_mapping</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="c1"># a mapping {receiver: msg, ...}</span>
<span class="n">receiver_mapping</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">recv</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">if</span> <span class="n">msg</span> <span class="k">else</span> <span class="kc">None</span> <span class="k">for</span> <span class="n">recv</span><span class="p">,</span> <span class="n">msg</span> <span class="ow">in</span> <span class="n">msg</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="p">}</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># a single expected string and thus a single receiver (defaults to caller)</span>
<span class="n">receiver</span> <span class="o">=</span> <span class="n">receiver</span> <span class="k">if</span> <span class="n">receiver</span> <span class="k">else</span> <span class="n">caller</span>
<span class="n">receiver_mapping</span><span class="p">[</span><span class="n">receiver</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">if</span> <span class="n">msg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="kc">None</span>
<span class="n">unmocked_msg_methods</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">receiver</span> <span class="ow">in</span> <span class="n">receiver_mapping</span><span class="p">:</span>
<span class="c1"># save the old .msg method so we can get it back</span>
<span class="c1"># cleanly after the test</span>
<span class="n">unmocked_msg_methods</span><span class="p">[</span><span class="n">receiver</span><span class="p">]</span> <span class="o">=</span> <span class="n">receiver</span><span class="o">.</span><span class="n">msg</span>
<span class="c1"># replace normal `.msg` with a mock</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span>
<span class="c1"># Run the methods of the Command. This mimics what happens in the</span>
<span class="c1"># cmdhandler. This will have the mocked .msg be called as part of the</span>
<span class="c1"># execution. Mocks remembers what was sent to them so we will be able</span>
<span class="c1"># to retrieve what was sent later.</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">cmdobj</span><span class="o">.</span><span class="n">at_pre_cmd</span><span class="p">():</span>
<span class="k">return</span>
<span class="n">cmdobj</span><span class="o">.</span><span class="n">parse</span><span class="p">()</span>
<span class="n">ret</span> <span class="o">=</span> <span class="n">cmdobj</span><span class="o">.</span><span class="n">func</span><span class="p">()</span>
<span class="c1"># handle func&#39;s with yield in them (making them generators)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ret</span><span class="p">,</span> <span class="n">types</span><span class="o">.</span><span class="n">GeneratorType</span><span class="p">):</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">inp</span> <span class="o">=</span> <span class="n">inputs</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span> <span class="k">if</span> <span class="n">inputs</span> <span class="k">else</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">inp</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># this mimics a user&#39;s reply to a prompt</span>
<span class="n">ret</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="nb">next</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span>
<span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># non-input yield, like yield(10). We don&#39;t pause</span>
<span class="c1"># but fire it immediately.</span>
<span class="nb">next</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">cmdobj</span><span class="o">.</span><span class="n">at_post_cmd</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">except</span> <span class="n">InterruptCommand</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">for</span> <span class="n">inp</span> <span class="ow">in</span> <span class="n">inputs</span><span class="p">:</span>
<span class="c1"># if there are any inputs left, we may have a non-generator</span>
<span class="c1"># input to handle (get_input/ask_yes_no that uses a separate</span>
<span class="c1"># cmdset rather than a yield</span>
<span class="n">caller</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="c1"># At this point the mocked .msg methods on each receiver will have</span>
<span class="c1"># stored all calls made to them (that&#39;s a basic function of the Mock</span>
<span class="c1"># class). We will not extract them and compare to what we expected to</span>
<span class="c1"># go to each receiver.</span>
<span class="n">returned_msgs</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">receiver</span><span class="p">,</span> <span class="n">expected_msg</span> <span class="ow">in</span> <span class="n">receiver_mapping</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="c1"># get the stored messages from the Mock with Mock.mock_calls.</span>
<span class="n">stored_msg</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">args</span> <span class="ow">and</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="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;text&quot;</span><span class="p">,</span> <span class="n">to_str</span><span class="p">(</span><span class="n">kwargs</span><span class="p">))</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="ow">in</span> <span class="n">receiver</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">mock_calls</span>
<span class="p">]</span>
<span class="c1"># we can return this now, we are done using the mock</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">unmocked_msg_methods</span><span class="p">[</span><span class="n">receiver</span><span class="p">]</span>
<span class="c1"># Get the first element of a tuple if msg received a tuple instead of a string</span>
<span class="n">stored_msg</span> <span class="o">=</span> <span class="p">[</span>
<span class="nb">str</span><span class="p">(</span><span class="n">smsg</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">smsg</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)</span> <span class="k">else</span> <span class="nb">str</span><span class="p">(</span><span class="n">smsg</span><span class="p">)</span> <span class="k">for</span> <span class="n">smsg</span> <span class="ow">in</span> <span class="n">stored_msg</span>
<span class="p">]</span>
<span class="k">if</span> <span class="n">expected_msg</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># no expected_msg; just build the returned_msgs dict</span>
<span class="n">returned_msg</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="k">for</span> <span class="n">msg</span> <span class="ow">in</span> <span class="n">stored_msg</span><span class="p">)</span>
<span class="n">returned_msgs</span><span class="p">[</span><span class="n">receiver</span><span class="p">]</span> <span class="o">=</span> <span class="n">ansi</span><span class="o">.</span><span class="n">parse_ansi</span><span class="p">(</span><span class="n">returned_msg</span><span class="p">,</span> <span class="n">strip_ansi</span><span class="o">=</span><span class="n">noansi</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># compare messages to expected</span>
<span class="c1"># set our separator for returned messages based on parsing ansi or not</span>
<span class="n">msg_sep</span> <span class="o">=</span> <span class="s2">&quot;|&quot;</span> <span class="k">if</span> <span class="n">noansi</span> <span class="k">else</span> <span class="s2">&quot;||&quot;</span>
<span class="c1"># We remove Evmenu decorations since that just makes it harder</span>
<span class="c1"># to write the comparison string. We also strip ansi before this</span>
<span class="c1"># comparison since otherwise it would mess with the regex.</span>
<span class="n">returned_msg</span> <span class="o">=</span> <span class="n">msg_sep</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="n">_RE_STRIP_EVMENU</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">ansi</span><span class="o">.</span><span class="n">parse_ansi</span><span class="p">(</span><span class="n">mess</span><span class="p">,</span> <span class="n">strip_ansi</span><span class="o">=</span><span class="n">noansi</span><span class="p">))</span>
<span class="k">for</span> <span class="n">mess</span> <span class="ow">in</span> <span class="n">stored_msg</span>
<span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="c1"># this is the actual test</span>
<span class="k">if</span> <span class="n">expected_msg</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span> <span class="ow">and</span> <span class="n">returned_msg</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">returned_msg</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">expected_msg</span><span class="p">):</span>
<span class="c1"># failed the test</span>
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_ERROR_FORMAT</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">expected_msg</span><span class="o">=</span><span class="n">expected_msg</span><span class="p">,</span> <span class="n">returned_msg</span><span class="o">=</span><span class="n">returned_msg</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="c1"># passed!</span>
<span class="n">returned_msgs</span><span class="p">[</span><span class="n">receiver</span><span class="p">]</span> <span class="o">=</span> <span class="n">returned_msg</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">returned_msgs</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="nb">list</span><span class="p">(</span><span class="n">returned_msgs</span><span class="o">.</span><span class="n">values</span><span class="p">())[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="n">returned_msgs</span></div></div>
<span class="c1"># Base testing classes</span>
<div class="viewcode-block" id="BaseEvenniaTestCase"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.BaseEvenniaTestCase">[docs]</a><span class="nd">@override_settings</span><span class="p">(</span><span class="o">**</span><span class="n">DEFAULT_SETTINGS</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">BaseEvenniaTestCase</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Base test (with no default objects) but with enforced default settings.</span>
<span class="sd"> &quot;&quot;&quot;</span></div>
<div class="viewcode-block" id="EvenniaTestCase"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaTestCase">[docs]</a><span class="k">class</span> <span class="nc">EvenniaTestCase</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> For use with gamedir settings; Just like the normal test case, only for naming consistency.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="BaseEvenniaTest"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.BaseEvenniaTest">[docs]</a><span class="nd">@override_settings</span><span class="p">(</span><span class="o">**</span><span class="n">DEFAULT_SETTINGS</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">BaseEvenniaTest</span><span class="p">(</span><span class="n">EvenniaTestMixin</span><span class="p">,</span> <span class="n">TestCase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This class parent has all default objects and uses only default settings.</span>
<span class="sd"> &quot;&quot;&quot;</span></div>
<div class="viewcode-block" id="EvenniaTest"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaTest">[docs]</a><span class="k">class</span> <span class="nc">EvenniaTest</span><span class="p">(</span><span class="n">EvenniaTestMixin</span><span class="p">,</span> <span class="n">TestCase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This test class is intended for inheriting in mygame tests.</span>
<span class="sd"> It helps ensure your tests are run with your own objects</span>
<span class="sd"> and settings from your game folder.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">account_typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_ACCOUNT_TYPECLASS</span>
<span class="n">object_typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_OBJECT_TYPECLASS</span>
<span class="n">character_typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_CHARACTER_TYPECLASS</span>
<span class="n">exit_typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_EXIT_TYPECLASS</span>
<span class="n">room_typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_ROOM_TYPECLASS</span>
<span class="n">script_typeclass</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_SCRIPT_TYPECLASS</span></div>
<div class="viewcode-block" id="BaseEvenniaCommandTest"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.BaseEvenniaCommandTest">[docs]</a><span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.account.COMMAND_DEFAULT_CLASS&quot;</span><span class="p">,</span> <span class="n">MuxCommand</span><span class="p">)</span>
<span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.admin.COMMAND_DEFAULT_CLASS&quot;</span><span class="p">,</span> <span class="n">MuxCommand</span><span class="p">)</span>
<span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.batchprocess.COMMAND_DEFAULT_CLASS&quot;</span><span class="p">,</span> <span class="n">MuxCommand</span><span class="p">)</span>
<span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.building.COMMAND_DEFAULT_CLASS&quot;</span><span class="p">,</span> <span class="n">MuxCommand</span><span class="p">)</span>
<span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.comms.COMMAND_DEFAULT_CLASS&quot;</span><span class="p">,</span> <span class="n">MuxCommand</span><span class="p">)</span>
<span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.general.COMMAND_DEFAULT_CLASS&quot;</span><span class="p">,</span> <span class="n">MuxCommand</span><span class="p">)</span>
<span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.help.COMMAND_DEFAULT_CLASS&quot;</span><span class="p">,</span> <span class="n">MuxCommand</span><span class="p">)</span>
<span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.syscommands.COMMAND_DEFAULT_CLASS&quot;</span><span class="p">,</span> <span class="n">MuxCommand</span><span class="p">)</span>
<span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.system.COMMAND_DEFAULT_CLASS&quot;</span><span class="p">,</span> <span class="n">MuxCommand</span><span class="p">)</span>
<span class="nd">@patch</span><span class="p">(</span><span class="s2">&quot;evennia.commands.unloggedin.COMMAND_DEFAULT_CLASS&quot;</span><span class="p">,</span> <span class="n">MuxCommand</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">BaseEvenniaCommandTest</span><span class="p">(</span><span class="n">BaseEvenniaTest</span><span class="p">,</span> <span class="n">EvenniaCommandTestMixin</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Commands only using the default settings.</span>
<span class="sd"> &quot;&quot;&quot;</span></div>
<div class="viewcode-block" id="EvenniaCommandTest"><a class="viewcode-back" href="../../../api/evennia.utils.test_resources.html#evennia.utils.test_resources.EvenniaCommandTest">[docs]</a><span class="k">class</span> <span class="nc">EvenniaCommandTest</span><span class="p">(</span><span class="n">EvenniaTest</span><span class="p">,</span> <span class="n">EvenniaCommandTestMixin</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Parent class to inherit from - makes tests use your own</span>
<span class="sd"> classes and settings in mygame.</span>
<span class="sd"> &quot;&quot;&quot;</span></div>
</pre></div>
</div>
</div>
</div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<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="nav-item nav-item-0"><a href="../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.utils.test_resources</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2022, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>