diff --git a/evennia/commands/default/tests.py b/evennia/commands/default/tests.py index c426a2879a..0f0f7809bb 100644 --- a/evennia/commands/default/tests.py +++ b/evennia/commands/default/tests.py @@ -23,7 +23,7 @@ from unittest.mock import patch, Mock, MagicMock from evennia import DefaultRoom, DefaultExit, ObjectDB from evennia.commands.default.cmdset_character import CharacterCmdSet -from evennia.utils.test_resources import EvenniaTest +from evennia.utils.test_resources import EvenniaTest, LocalEvenniaTest from evennia.commands.default import ( help as help_module, general, @@ -57,8 +57,11 @@ _RE_STRIP_EVMENU = re.compile(r"^\+|-+\+|\+-+|--+|\|(?:\s|$)", re.MULTILINE) # ------------------------------------------------------------ @patch("evennia.server.portal.portal.LoopingCall", new=MagicMock()) -class CommandTest(EvenniaTest): +class CommandTestMixin: """ + Mixin to add to a test in order to provide the `.call` helper for + testing the execution and returns of a command. + Tests a Command by running it and comparing what messages it sends with expected values. This tests without actually spinning up the cmdhandler for every test, which is more controlled. @@ -68,7 +71,7 @@ class CommandTest(EvenniaTest): from commands.echo import CmdEcho - class MyCommandTest(CommandTest): + class MyCommandTest(EvenniaTest, CommandTestMixin): def test_echo(self): ''' @@ -306,12 +309,26 @@ class CommandTest(EvenniaTest): return returned_msgs +class EvenniaCommandTest(EvenniaTest, CommandTestMixin): + """ + Commands only using the default settings. + + """ + + +class LocalEvenniaCommandTest(LocalEvenniaTest, CommandTestMixin): + """ + Parent class to inherit from - makes tests use your own + classes and settings in mygame. + + """ + # ------------------------------------------------------------ # Individual module Tests # ------------------------------------------------------------ -class TestGeneral(CommandTest): +class TestGeneral(EvenniaCommandTest): def test_look(self): rid = self.room1.id self.call(general.CmdLook(), "here", "Room(#{})\nroom_desc".format(rid)) @@ -407,7 +424,7 @@ class TestGeneral(CommandTest): self.call(general.CmdAccess(), "", "Permission Hierarchy (climbing):") -class TestHelp(CommandTest): +class TestHelp(EvenniaCommandTest): maxDiff = None @@ -557,7 +574,7 @@ class TestHelp(CommandTest): cmdset=TestCmdSet()) -class TestSystem(CommandTest): +class TestSystem(EvenniaCommandTest): def test_py(self): # we are not testing CmdReload, CmdReset and CmdShutdown, CmdService or CmdTime # since the server is not running during these tests. @@ -581,7 +598,7 @@ _TASK_HANDLER = None def func_test_cmd_tasks(): return 'success' -class TestCmdTasks(CommandTest): +class TestCmdTasks(EvenniaCommandTest): def setUp(self): super().setUp() @@ -741,7 +758,7 @@ class TestCmdTasks(CommandTest): self.call(system.CmdTasks(), f'/cancel', wanted_msg) -class TestAdmin(CommandTest): +class TestAdmin(EvenniaCommandTest): def test_emit(self): self.call(admin.CmdEmit(), "Char2 = Test", "Emitted to Char2:\nTest") @@ -772,7 +789,7 @@ class TestAdmin(CommandTest): ) -class TestAccount(CommandTest): +class TestAccount(EvenniaCommandTest): def test_ooc_look(self): if settings.MULTISESSION_MODE < 2: self.call( @@ -896,7 +913,7 @@ class TestAccount(CommandTest): ) -class TestBuilding(CommandTest): +class TestBuilding(EvenniaCommandTest): def test_create(self): name = settings.BASE_OBJECT_TYPECLASS.rsplit(".", 1)[1] self.call( @@ -1943,13 +1960,13 @@ class TestBuilding(CommandTest): import evennia.commands.default.comms as cmd_comms # noqa from evennia.utils.create import create_channel # noqa -class TestCommsChannel(CommandTest): +class TestCommsChannel(EvenniaCommandTest): """ Test the central `channel` command. """ def setUp(self): - super(CommandTest, self).setUp() + super(EvenniaCommandTest, self).setUp() self.channel = create_channel( key="testchannel", desc="A test channel") @@ -2165,7 +2182,7 @@ class TestCommsChannel(CommandTest): from evennia.commands.default import comms # noqa -class TestComms(CommandTest): +class TestComms(EvenniaCommandTest): def test_page(self): self.call( @@ -2177,7 +2194,7 @@ class TestComms(CommandTest): ) -class TestBatchProcess(CommandTest): +class TestBatchProcess(EvenniaCommandTest): """ Test the batch processor. @@ -2213,13 +2230,13 @@ class CmdInterrupt(Command): self.msg("in func") -class TestInterruptCommand(CommandTest): +class TestInterruptCommand(EvenniaCommandTest): def test_interrupt_command(self): ret = self.call(CmdInterrupt(), "") self.assertEqual(ret, "") -class TestUnconnectedCommand(CommandTest): +class TestUnconnectedCommand(EvenniaCommandTest): def test_info_command(self): # instead of using SERVER_START_TIME (0), we use 86400 because Windows won't let us use anything lower gametime.SERVER_START_TIME = 86400 @@ -2239,7 +2256,7 @@ class TestUnconnectedCommand(CommandTest): # Test syscommands -class TestSystemCommands(CommandTest): +class TestSystemCommands(EvenniaCommandTest): def test_simple_defaults(self): self.call(syscommands.SystemNoInput(), "") self.call(syscommands.SystemNoMatch(), "Huh?") diff --git a/evennia/contrib/base_systems/building_menu/tests.py b/evennia/contrib/base_systems/building_menu/tests.py index aafcd3fe32..e8c04a2951 100644 --- a/evennia/contrib/base_systems/building_menu/tests.py +++ b/evennia/contrib/base_systems/building_menu/tests.py @@ -3,7 +3,7 @@ Building menu tests. """ -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from . building_menu import BuildingMenu, CmdNoMatch @@ -12,7 +12,7 @@ class Submenu(BuildingMenu): self.add_choice("title", key="t", attr="key") -class TestBuildingMenu(CommandTest): +class TestBuildingMenu(EvenniaCommandTest): def setUp(self): super(TestBuildingMenu, self).setUp() self.menu = BuildingMenu(caller=self.char1, obj=self.room1, title="test") diff --git a/evennia/contrib/base_systems/custom_gametime/__init__.py b/evennia/contrib/base_systems/custom_gametime/__init__.py index c797e34dde..1ba7f52308 100644 --- a/evennia/contrib/base_systems/custom_gametime/__init__.py +++ b/evennia/contrib/base_systems/custom_gametime/__init__.py @@ -3,4 +3,10 @@ Custom gametime contrib - Griatch, vlgeoff 2017 """ -from .custom_gametime import * # noqa +from .custom_gametime import time_to_tuple, UNITS # noqa +from .custom_gametime import gametime_to_realtime # noqa +from .custom_gametime import realtime_to_gametime # noqa +from .custom_gametime import custom_gametime # noqa +from .custom_gametime import real_seconds_until # noqa +from .custom_gametime import schedule # noqa +from .custom_gametime import GametimeScript # noqa diff --git a/evennia/contrib/base_systems/custom_gametime/tests.py b/evennia/contrib/base_systems/custom_gametime/tests.py index 0f69ce7e91..ae10560d98 100644 --- a/evennia/contrib/base_systems/custom_gametime/tests.py +++ b/evennia/contrib/base_systems/custom_gametime/tests.py @@ -6,7 +6,7 @@ Testing custom game time # Testing custom_gametime from mock import Mock, patch from evennia.utils.test_resources import EvenniaTest -from . import custom_gametime +from .. import custom_gametime def _testcallback(): diff --git a/evennia/contrib/base_systems/email_login/tests.py b/evennia/contrib/base_systems/email_login/tests.py index bd0625adba..f9999256ed 100644 --- a/evennia/contrib/base_systems/email_login/tests.py +++ b/evennia/contrib/base_systems/email_login/tests.py @@ -3,11 +3,11 @@ Test email login. """ -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from . import email_login -class TestEmailLogin(CommandTest): +class TestEmailLogin(EvenniaCommandTest): def test_connect(self): self.call( email_login.CmdUnconnectedConnect(), diff --git a/evennia/contrib/base_systems/ingame_python/tests.py b/evennia/contrib/base_systems/ingame_python/tests.py index 93472467f5..56ebd8c130 100644 --- a/evennia/contrib/base_systems/ingame_python/tests.py +++ b/evennia/contrib/base_systems/ingame_python/tests.py @@ -7,7 +7,7 @@ from textwrap import dedent from django.conf import settings from evennia import ScriptDB -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from evennia.objects.objects import ExitCommand from evennia.utils import ansi, utils from evennia.utils.create import create_object, create_script @@ -246,7 +246,7 @@ class TestEventHandler(EvenniaTest): self.assertEqual(self.room1.callbacks.all(), {}) -class TestCmdCallback(CommandTest): +class TestCmdCallback(EvenniaCommandTest): """Test the @callback command.""" @@ -425,7 +425,7 @@ class TestCmdCallback(CommandTest): self.assertEqual(callback.valid, True) -class TestDefaultCallbacks(CommandTest): +class TestDefaultCallbacks(EvenniaCommandTest): """Test the default callbacks.""" diff --git a/evennia/contrib/base_systems/menu_login/__init__.py b/evennia/contrib/base_systems/menu_login/__init__.py index 35a5637d91..bc1abd9b42 100644 --- a/evennia/contrib/base_systems/menu_login/__init__.py +++ b/evennia/contrib/base_systems/menu_login/__init__.py @@ -4,4 +4,4 @@ Menu-login - Vinvent-lg 2016, Griatch 2019 """ from .menu_login import UnloggedinCmdSet # noqa -from .menu_login import connection_screens # noqa +from . import connection_screens # noqa diff --git a/evennia/contrib/base_systems/menu_login/tests.py b/evennia/contrib/base_systems/menu_login/tests.py index 679f20c976..144176081d 100644 --- a/evennia/contrib/base_systems/menu_login/tests.py +++ b/evennia/contrib/base_systems/menu_login/tests.py @@ -3,10 +3,10 @@ Test menu_login """ -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from . import menu_login -class TestMenuLogin(CommandTest): +class TestMenuLogin(EvenniaCommandTest): def test_cmdunloggedlook(self): self.call(menu_login.CmdUnloggedinLook(), "", "======") diff --git a/evennia/contrib/base_systems/mux_comms_cmds/tests.py b/evennia/contrib/base_systems/mux_comms_cmds/tests.py index 98e0f7e78e..3aa9a785d5 100644 --- a/evennia/contrib/base_systems/mux_comms_cmds/tests.py +++ b/evennia/contrib/base_systems/mux_comms_cmds/tests.py @@ -3,17 +3,17 @@ Legacy Mux comms tests (extracted from 0.9.5) """ -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from . import mux_comms_cmds as comms -class TestLegacyMuxComms(CommandTest): +class TestLegacyMuxComms(EvenniaCommandTest): """ Test the legacy comms contrib. """ def setUp(self): - super(CommandTest, self).setUp() + super().setUp() self.call( comms.CmdChannelCreate(), "testchan;test=Test Channel", diff --git a/evennia/contrib/base_systems/unixcommand/tests.py b/evennia/contrib/base_systems/unixcommand/tests.py index 6fb19077f4..e92768e75c 100644 --- a/evennia/contrib/base_systems/unixcommand/tests.py +++ b/evennia/contrib/base_systems/unixcommand/tests.py @@ -3,7 +3,7 @@ Test of the Unixcommand. """ -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from .unixcommand import UnixCommand @@ -30,7 +30,7 @@ class CmdDummy(UnixCommand): self.msg("{} * {} = {}".format(nb1, nb2, result)) -class TestUnixCommand(CommandTest): +class TestUnixCommand(EvenniaCommandTest): def test_success(self): """See the command parsing succeed.""" self.call(CmdDummy(), "5 10", "5 * 10 = 50") diff --git a/evennia/contrib/full_systems/__init__.py b/evennia/contrib/full_systems/__init__.py index e69de29bb2..cd5af0bf6e 100644 --- a/evennia/contrib/full_systems/__init__.py +++ b/evennia/contrib/full_systems/__init__.py @@ -0,0 +1,4 @@ +""" +Complete game implementations/engines. + +""" diff --git a/evennia/contrib/full_systems/evscaperoom/__init__.py b/evennia/contrib/full_systems/evscaperoom/__init__.py index 6c837f57a3..859a53d9e1 100644 --- a/evennia/contrib/full_systems/evscaperoom/__init__.py +++ b/evennia/contrib/full_systems/evscaperoom/__init__.py @@ -3,11 +3,11 @@ Evscaperoom - Griatch 2019 """ -from .evscaperoom import commands # noqa -from .evscaperoom import menu # noqa -from .evscaperoom import objects # noqa -from .evscaperoom import room # noqa -from .evscaperoom import scripts # noqa -from .evscaperoom import state # noqa -from .evscaperoom import tests # noqa -from .evscaperoom import utils # noqa +from . import commands # noqa +from . import menu # noqa +from . import objects # noqa +from . import room # noqa +from . import scripts # noqa +from . import state # noqa +from . import tests # noqa +from . import utils # noqa diff --git a/evennia/contrib/full_systems/evscaperoom/scripts.py b/evennia/contrib/full_systems/evscaperoom/scripts.py index 6aeb4dfc8c..003e740566 100644 --- a/evennia/contrib/full_systems/evscaperoom/scripts.py +++ b/evennia/contrib/full_systems/evscaperoom/scripts.py @@ -9,7 +9,7 @@ Just start this global script manually or at server creation. from evennia import DefaultScript -from evscaperoom.room import EvscapeRoom +from .room import EvscapeRoom class CleanupScript(DefaultScript): diff --git a/evennia/contrib/full_systems/evscaperoom/tests.py b/evennia/contrib/full_systems/evscaperoom/tests.py index 0b37c98d0f..c4c8ce7826 100644 --- a/evennia/contrib/full_systems/evscaperoom/tests.py +++ b/evennia/contrib/full_systems/evscaperoom/tests.py @@ -5,7 +5,7 @@ Unit tests for the Evscaperoom import inspect import pkgutil from os import path -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from evennia import InterruptCommand from evennia.utils.test_resources import EvenniaTest from evennia.utils import mod_import @@ -15,7 +15,7 @@ from . import objects from . import utils -class TestEvscaperoomCommands(CommandTest): +class TestEvscaperoomCommands(EvenniaCommandTest): def setUp(self): super().setUp() self.room1 = utils.create_evscaperoom_object("evscaperoom.room.EvscapeRoom", key="Testroom") diff --git a/evennia/contrib/game_systems/barter/tests.py b/evennia/contrib/game_systems/barter/tests.py index 1ef36812cf..c50e3dbdde 100644 --- a/evennia/contrib/game_systems/barter/tests.py +++ b/evennia/contrib/game_systems/barter/tests.py @@ -3,12 +3,12 @@ Test the contrib barter system """ from mock import Mock -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from evennia.utils.create import create_object from . import barter -class TestBarter(CommandTest): +class TestBarter(EvenniaCommandTest): def setUp(self): super().setUp() self.tradeitem1 = create_object(key="TradeItem1", location=self.char1) diff --git a/evennia/contrib/game_systems/clothing/tests.py b/evennia/contrib/game_systems/clothing/tests.py index 04a4c12a35..3ae45aa0f7 100644 --- a/evennia/contrib/game_systems/clothing/tests.py +++ b/evennia/contrib/game_systems/clothing/tests.py @@ -3,14 +3,14 @@ Testing clothing contrib """ -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from evennia.utils.create import create_object from evennia.objects.objects import DefaultRoom from evennia.utils.test_resources import EvenniaTest from . import clothing -class TestClothingCmd(CommandTest): +class TestClothingCmd(EvenniaCommandTest): def test_clothingcommands(self): wearer = create_object(clothing.ClothedCharacter, key="Wearer") friend = create_object(clothing.ClothedCharacter, key="Friend") diff --git a/evennia/contrib/game_systems/cooldowns/tests.py b/evennia/contrib/game_systems/cooldowns/tests.py index eea54ef103..461993dfea 100644 --- a/evennia/contrib/game_systems/cooldowns/tests.py +++ b/evennia/contrib/game_systems/cooldowns/tests.py @@ -8,7 +8,7 @@ from evennia.utils.test_resources import EvenniaTest from . import cooldowns -@patch("evennia.contrib.game_systems.cooldowns.time.time", return_value=0.0) +@patch("evennia.contrib.game_systems.cooldowns.cooldowns.time.time", return_value=0.0) class TestCooldowns(EvenniaTest): def setUp(self): super().setUp() diff --git a/evennia/contrib/game_systems/crafting/tests.py b/evennia/contrib/game_systems/crafting/tests.py index 0e74946d98..f7e52c94eb 100644 --- a/evennia/contrib/game_systems/crafting/tests.py +++ b/evennia/contrib/game_systems/crafting/tests.py @@ -6,13 +6,13 @@ Unit tests for the crafting system contrib. from unittest import mock from django.test import override_settings from django.core.exceptions import ObjectDoesNotExist -from evennia.commands.default.tests import CommandTest -from evennia.utils.test_resources import TestCase +from evennia.commands.default.tests import EvenniaCommandTest +from evennia.utils.test_resources import EvenniaTestCase from evennia.utils.create import create_object from . import crafting, example_recipes -class TestCraftUtils(TestCase): +class TestCraftUtils(EvenniaTestCase): """ Test helper utils for crafting. @@ -52,7 +52,7 @@ class _TestMaterial: return self.name -class TestCraftingRecipeBase(TestCase): +class TestCraftingRecipeBase(EvenniaTestCase): """ Test the parent recipe class. """ @@ -137,7 +137,7 @@ class _MockRecipe(crafting.CraftingRecipe): @override_settings(CRAFT_RECIPE_MODULES=[]) -class TestCraftingRecipe(TestCase): +class TestCraftingRecipe(EvenniaTestCase): """ Test the CraftingRecipe class with one recipe """ @@ -474,7 +474,7 @@ class TestCraftingRecipe(TestCase): self.assertIsNotNone(self.tool2.pk) -class TestCraftSword(TestCase): +class TestCraftSword(EvenniaTestCase): """ Test the `craft` function by crafting the example sword. @@ -655,7 +655,7 @@ class TestCraftSword(TestCase): @mock.patch("evennia.contrib.game_systems.crafting.crafting._load_recipes", new=mock.MagicMock()) @mock.patch("evennia.contrib.game_systems.crafting.crafting._RECIPE_CLASSES", new={"testrecipe": _MockRecipe}) @override_settings(CRAFT_RECIPE_MODULES=[], DEFAULT_HOME="#999999") -class TestCraftCommand(CommandTest): +class TestCraftCommand(EvenniaCommandTest): """Test the crafting command""" def setUp(self): diff --git a/evennia/contrib/game_systems/gendersub/tests.py b/evennia/contrib/game_systems/gendersub/tests.py index bf14aef1e0..55aeaa71b0 100644 --- a/evennia/contrib/game_systems/gendersub/tests.py +++ b/evennia/contrib/game_systems/gendersub/tests.py @@ -4,13 +4,13 @@ Test gendersub contrib. """ -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from evennia.utils.create import create_object from mock import patch from . import gendersub -class TestGenderSub(CommandTest): +class TestGenderSub(EvenniaCommandTest): def test_setgender(self): self.call(gendersub.SetGender(), "male", "Your gender was set to male.") self.call(gendersub.SetGender(), "ambiguous", "Your gender was set to ambiguous.") @@ -22,7 +22,7 @@ class TestGenderSub(CommandTest): self.assertEqual( gendersub._RE_GENDER_PRONOUN.sub(char._get_pronoun, txt), "Test their gender" ) - with patch("evennia.contrib.game_systems.gendersub.DefaultCharacter.msg") as mock_msg: + with patch("evennia.contrib.game_systems.gendersub.gendersub.DefaultCharacter.msg") as mock_msg: char.db.gender = "female" char.msg("Test |p gender") mock_msg.assert_called_with("Test her gender", from_obj=None, session=None) diff --git a/evennia/contrib/game_systems/mail/tests.py b/evennia/contrib/game_systems/mail/tests.py index 56dc4c7f2f..0d357b8636 100644 --- a/evennia/contrib/game_systems/mail/tests.py +++ b/evennia/contrib/game_systems/mail/tests.py @@ -3,11 +3,11 @@ Test mail contrib """ -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from . import mail -class TestMail(CommandTest): +class TestMail(EvenniaCommandTest): def test_mail(self): self.call(mail.CmdMail(), "2", "'2' is not a valid mail id.", caller=self.account) self.call(mail.CmdMail(), "test", "'test' is not a valid mail id.", caller=self.account) diff --git a/evennia/contrib/game_systems/multidescer/tests.py b/evennia/contrib/game_systems/multidescer/tests.py index 574375430e..4f43483979 100644 --- a/evennia/contrib/game_systems/multidescer/tests.py +++ b/evennia/contrib/game_systems/multidescer/tests.py @@ -3,11 +3,11 @@ Test multidescer contrib. """ -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from . import multidescer -class TestMultidescer(CommandTest): +class TestMultidescer(EvenniaCommandTest): def test_cmdmultidesc(self): self.call(multidescer.CmdMultiDesc(), "/list", "Stored descs:\ncaller:") self.call( diff --git a/evennia/contrib/game_systems/puzzles/tests.py b/evennia/contrib/game_systems/puzzles/tests.py index c494947b2a..43c11cb7e5 100644 --- a/evennia/contrib/game_systems/puzzles/tests.py +++ b/evennia/contrib/game_systems/puzzles/tests.py @@ -9,12 +9,12 @@ import re import itertools from mock import Mock from evennia.utils import search -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from evennia.utils.create import create_object from . import puzzles -class TestPuzzles(CommandTest): +class TestPuzzles(EvenniaCommandTest): def setUp(self): super(TestPuzzles, self).setUp() self.steel = create_object(self.object_typeclass, key="steel", location=self.char1.location) diff --git a/evennia/contrib/game_systems/turnbattle/tests.py b/evennia/contrib/game_systems/turnbattle/tests.py index 4d4d3405d7..a9e20e0672 100644 --- a/evennia/contrib/game_systems/turnbattle/tests.py +++ b/evennia/contrib/game_systems/turnbattle/tests.py @@ -4,14 +4,14 @@ Turnbattle tests. """ from mock import patch, MagicMock -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from evennia.utils.create import create_object from evennia.utils.test_resources import EvenniaTest from evennia.objects.objects import DefaultRoom from . import tb_basic, tb_equip, tb_range, tb_items, tb_magic -class TestTurnBattleBasicCmd(CommandTest): +class TestTurnBattleBasicCmd(EvenniaCommandTest): # Test basic combat commands def test_turnbattlecmd(self): @@ -22,7 +22,7 @@ class TestTurnBattleBasicCmd(CommandTest): self.call(tb_basic.CmdRest(), "", "Char rests to recover HP.") -class TestTurnBattleEquipCmd(CommandTest): +class TestTurnBattleEquipCmd(EvenniaCommandTest): def setUp(self): super(TestTurnBattleEquipCmd, self).setUp() self.testweapon = create_object(tb_equip.TBEWeapon, key="test weapon") @@ -45,7 +45,7 @@ class TestTurnBattleEquipCmd(CommandTest): self.call(tb_equip.CmdRest(), "", "Char rests to recover HP.") -class TestTurnBattleRangeCmd(CommandTest): +class TestTurnBattleRangeCmd(EvenniaCommandTest): # Test range commands def test_turnbattlerangecmd(self): # Start with range module specific commands. @@ -61,7 +61,7 @@ class TestTurnBattleRangeCmd(CommandTest): self.call(tb_range.CmdRest(), "", "Char rests to recover HP.") -class TestTurnBattleItemsCmd(CommandTest): +class TestTurnBattleItemsCmd(EvenniaCommandTest): def setUp(self): super(TestTurnBattleItemsCmd, self).setUp() self.testitem = create_object(key="test item") @@ -78,7 +78,7 @@ class TestTurnBattleItemsCmd(CommandTest): self.call(tb_items.CmdRest(), "", "Char rests to recover HP.") -class TestTurnBattleMagicCmd(CommandTest): +class TestTurnBattleMagicCmd(EvenniaCommandTest): # Test magic commands def test_turnbattlemagiccmd(self): diff --git a/evennia/contrib/grid/extended_room/tests.py b/evennia/contrib/grid/extended_room/tests.py index a4fb897b04..54ce11aced 100644 --- a/evennia/contrib/grid/extended_room/tests.py +++ b/evennia/contrib/grid/extended_room/tests.py @@ -6,7 +6,7 @@ Testing of ExtendedRoom contrib import datetime from mock import patch, Mock from django.conf import settings -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from evennia.objects.objects import DefaultRoom from . import extended_room @@ -24,7 +24,7 @@ class ForceUTCDatetime(datetime.datetime): @patch("evennia.contrib.grid.extended_room.extended_room.datetime.datetime", ForceUTCDatetime) # mock gametime to return April 9, 2064, at 21:06 (spring evening) @patch("evennia.utils.gametime.gametime", new=Mock(return_value=2975000766)) -class TestExtendedRoom(CommandTest): +class TestExtendedRoom(EvenniaCommandTest): room_typeclass = extended_room.ExtendedRoom DETAIL_DESC = "A test detail." SPRING_DESC = "A spring description." diff --git a/evennia/contrib/grid/mapbuilder/tests.py b/evennia/contrib/grid/mapbuilder/tests.py index 9ebc465c94..4ac852afed 100644 --- a/evennia/contrib/grid/mapbuilder/tests.py +++ b/evennia/contrib/grid/mapbuilder/tests.py @@ -3,7 +3,7 @@ Test map builder. """ -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from . import mapbuilder # -*- coding: utf-8 -*- @@ -187,7 +187,7 @@ EXAMPLE2_LEGEND = { } -class TestMapBuilder(CommandTest): +class TestMapBuilder(EvenniaCommandTest): def test_cmdmapbuilder(self): self.call( mapbuilder.CmdMapBuilder(), diff --git a/evennia/contrib/grid/simpledoor/tests.py b/evennia/contrib/grid/simpledoor/tests.py index a7bdc93882..2a5083bf10 100644 --- a/evennia/contrib/grid/simpledoor/tests.py +++ b/evennia/contrib/grid/simpledoor/tests.py @@ -4,11 +4,11 @@ Tests of simpledoor. """ -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from . import simpledoor -class TestSimpleDoor(CommandTest): +class TestSimpleDoor(EvenniaCommandTest): def test_cmdopen(self): self.call( simpledoor.CmdOpen(), diff --git a/evennia/contrib/grid/slow_exit/tests.py b/evennia/contrib/grid/slow_exit/tests.py index dac96b368c..f5feae20eb 100644 --- a/evennia/contrib/grid/slow_exit/tests.py +++ b/evennia/contrib/grid/slow_exit/tests.py @@ -4,7 +4,7 @@ Slow exit tests. """ from mock import Mock, patch -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from evennia.utils.create import create_object from . import slow_exit @@ -16,7 +16,7 @@ def _cancellable_mockdelay(time, callback, *args, **kwargs): return Mock() -class TestSlowExit(CommandTest): +class TestSlowExit(EvenniaCommandTest): @patch("evennia.utils.delay", _cancellable_mockdelay) def test_exit(self): exi = create_object( diff --git a/evennia/contrib/rpg/dice/tests.py b/evennia/contrib/rpg/dice/tests.py index 08ce808b77..d9c9110c7e 100644 --- a/evennia/contrib/rpg/dice/tests.py +++ b/evennia/contrib/rpg/dice/tests.py @@ -3,13 +3,13 @@ Testing of TestDice. """ -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from mock import patch from . import dice -@patch("evennia.contrib.dice.randint", return_value=5) -class TestDice(CommandTest): +@patch("evennia.contrib.rpg.dice.dice.randint", return_value=5) +class TestDice(EvenniaCommandTest): def test_roll_dice(self, mocked_randint): self.assertEqual(dice.roll_dice(6, 6, modifier=("+", 4)), mocked_randint() * 6 + 4) self.assertEqual(dice.roll_dice(6, 6, conditional=("<", 35)), True) diff --git a/evennia/contrib/rpg/rpsystem/tests.py b/evennia/contrib/rpg/rpsystem/tests.py index fa77ff795a..c441913645 100644 --- a/evennia/contrib/rpg/rpsystem/tests.py +++ b/evennia/contrib/rpg/rpsystem/tests.py @@ -4,7 +4,7 @@ Tests for RP system """ import time from anything import Anything -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from evennia.utils.test_resources import EvenniaTest from evennia import create_object @@ -278,7 +278,7 @@ class TestRPSystem(EvenniaTest): self.assertEqual(result, (Anything, self.speaker, self.speaker.key)) -class TestRPSystemCommands(CommandTest): +class TestRPSystemCommands(EvenniaCommandTest): def setUp(self): super().setUp() self.char1.swap_typeclass(rpsystem.ContribRPCharacter) diff --git a/evennia/contrib/rpg/traits/tests.py b/evennia/contrib/rpg/traits/tests.py index 1d3811f896..7204b70204 100644 --- a/evennia/contrib/rpg/traits/tests.py +++ b/evennia/contrib/rpg/traits/tests.py @@ -9,7 +9,7 @@ Unit test module for Trait classes. from copy import copy from anything import Something from mock import MagicMock, patch -from django.test import TestCase +from evennia.utils.test_resources import EvenniaTestCase from . import traits @@ -39,10 +39,10 @@ _TEST_TRAIT_CLASS_PATHS = [ ] -class _TraitHandlerBase(TestCase): +class _TraitHandlerBase(EvenniaTestCase): "Base for trait tests" - @patch("evennia.contrib.rpg.traits._TRAIT_CLASS_PATHS", new=_TEST_TRAIT_CLASS_PATHS) + @patch("evennia.contrib.rpg.traits.traits._TRAIT_CLASS_PATHS", new=_TEST_TRAIT_CLASS_PATHS) def setUp(self): self.obj = _MockObj() self.traithandler = traits.TraitHandler(self.obj) @@ -494,7 +494,7 @@ class TestTraitCounterTimed(_TraitHandlerBase): Test for trait with timer component """ - @patch("evennia.contrib.rpg.traits.time", new=MagicMock(return_value=1000)) + @patch("evennia.contrib.rpg.traits.traits.time", new=MagicMock(return_value=1000)) def setUp(self): super().setUp() self.traithandler.add( @@ -522,7 +522,7 @@ class TestTraitCounterTimed(_TraitHandlerBase): self.trait.ratetarget, ) - @patch("evennia.contrib.rpg.traits.time") + @patch("evennia.contrib.rpg.traits.traits.time") def test_timer_rate(self, mock_time): """Test time stepping""" mock_time.return_value = 1000 @@ -549,7 +549,7 @@ class TestTraitCounterTimed(_TraitHandlerBase): mock_time.return_value = 1218 self.assertEqual(self._get_timer_data(), (0, -2, -10, None, None)) - @patch("evennia.contrib.rpg.traits.time") + @patch("evennia.contrib.rpg.traits.traits.time") def test_timer_ratetarget(self, mock_time): """test ratetarget""" mock_time.return_value = 1000 @@ -751,7 +751,7 @@ class TestTraitGaugeTimed(_TraitHandlerBase): Test for trait with timer component """ - @patch("evennia.contrib.rpg.traits.time", new=MagicMock(return_value=1000)) + @patch("evennia.contrib.rpg.traits.traits.time", new=MagicMock(return_value=1000)) def setUp(self): super().setUp() self.traithandler.add( @@ -778,7 +778,7 @@ class TestTraitGaugeTimed(_TraitHandlerBase): self.trait.ratetarget, ) - @patch("evennia.contrib.rpg.traits.time") + @patch("evennia.contrib.rpg.traits.traits.time") def test_timer_rate(self, mock_time): """Test time stepping""" mock_time.return_value = 1000 @@ -806,7 +806,7 @@ class TestTraitGaugeTimed(_TraitHandlerBase): mock_time.return_value = 1218 self.assertEqual(self._get_timer_data(), (0, 0, -10, None, None)) - @patch("evennia.contrib.rpg.traits.time") + @patch("evennia.contrib.rpg.traits.traits.time") def test_timer_ratetarget(self, mock_time): """test ratetarget""" mock_time.return_value = 1000 @@ -826,7 +826,7 @@ class TestTraitGaugeTimed(_TraitHandlerBase): self.assertEqual(self._get_timer_data(), (70, 70, 1, None, 70)) -class TestNumericTraitOperators(TestCase): +class TestNumericTraitOperators(EvenniaTestCase): """Test case for numeric magic method implementations.""" def setUp(self): @@ -909,13 +909,13 @@ class DummyCharacter(_MockObj): health = traits.TraitProperty("Health value", trait_type="gauge", base=100) -class TestTraitFields(TestCase): +class TestTraitFields(EvenniaTestCase): """ Test the TraitField class. """ - @patch("evennia.contrib.rpg.traits._TRAIT_CLASS_PATHS", new=_TEST_TRAIT_CLASS_PATHS) + @patch("evennia.contrib.rpg.traits.traits._TRAIT_CLASS_PATHS", new=_TEST_TRAIT_CLASS_PATHS) def test_traitfields(self): obj = DummyCharacter() obj2 = DummyCharacter() diff --git a/evennia/contrib/tutorials/bodyfunctions/tests.py b/evennia/contrib/tutorials/bodyfunctions/tests.py index e95f37a5cd..11536b97d2 100644 --- a/evennia/contrib/tutorials/bodyfunctions/tests.py +++ b/evennia/contrib/tutorials/bodyfunctions/tests.py @@ -7,7 +7,7 @@ from evennia.utils.test_resources import EvenniaTest from .bodyfunctions import BodyFunctions -@patch("evennia.contrib.tutorials.bodyfunctions.random") +@patch("evennia.contrib.tutorials.bodyfunctions.bodyfunctions.random") class TestBodyFunctions(EvenniaTest): script_typeclass = BodyFunctions diff --git a/evennia/contrib/tutorials/talking_npc/tests.py b/evennia/contrib/tutorials/talking_npc/tests.py index 3ec331d008..95e46a7f26 100644 --- a/evennia/contrib/tutorials/talking_npc/tests.py +++ b/evennia/contrib/tutorials/talking_npc/tests.py @@ -2,12 +2,12 @@ Tutorial - talking NPC tests. """ -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from evennia.utils.create import create_object from . import talking_npc -class TestTalkingNPC(CommandTest): +class TestTalkingNPC(EvenniaCommandTest): def test_talkingnpc(self): npc = create_object(talking_npc.TalkingNPC, key="npctalker", location=self.room1) self.call(talking_npc.CmdTalk(), "", "(You walk up and talk to Char.)") diff --git a/evennia/contrib/tutorials/tutorial_world/__init__.py b/evennia/contrib/tutorials/tutorial_world/__init__.py index 0d106e1049..ee700e30ac 100644 --- a/evennia/contrib/tutorials/tutorial_world/__init__.py +++ b/evennia/contrib/tutorials/tutorial_world/__init__.py @@ -4,4 +4,4 @@ Tutorial world - Griatch, 2011, 2015 """ -from . import mob, objects, rooms # noqa +from . import mob, objects, rooms, intro_menu # noqa diff --git a/evennia/contrib/tutorials/tutorial_world/tests.py b/evennia/contrib/tutorials/tutorial_world/tests.py index 75b209af6d..38b2a06b40 100644 --- a/evennia/contrib/tutorials/tutorial_world/tests.py +++ b/evennia/contrib/tutorials/tutorial_world/tests.py @@ -6,7 +6,7 @@ Test tutorial_world/mob from mock import patch from twisted.trial.unittest import TestCase as TwistedTestCase from twisted.internet.base import DelayedCall -from evennia.commands.default.tests import CommandTest +from evennia.commands.default.tests import EvenniaCommandTest from evennia.utils.create import create_object from evennia.utils.test_resources import EvenniaTest, mockdelay, mockdeferLater from . import mob, objects as tutobjects, rooms as tutrooms @@ -30,7 +30,7 @@ class TestTutorialWorldMob(EvenniaTest): DelayedCall.debug = True -class TestTutorialWorldObjects(TwistedTestCase, CommandTest): +class TestTutorialWorldObjects(TwistedTestCase, EvenniaCommandTest): def test_tutorialobj(self): obj1 = create_object(tutobjects.TutorialObject, key="tutobj") obj1.reset() @@ -129,7 +129,7 @@ class TestTutorialWorldObjects(TwistedTestCase, CommandTest): self.call(tutobjects.CmdGetWeapon(), "", "You find Rusty sword.", obj=rack) -class TestTutorialWorldRooms(CommandTest): +class TestTutorialWorldRooms(EvenniaCommandTest): def test_cmdtutorial(self): room = create_object(tutrooms.TutorialRoom, key="tutroom") self.char1.location = room diff --git a/evennia/contrib/utils/auditing/tests.py b/evennia/contrib/utils/auditing/tests.py index 2c37615844..1bf4145701 100644 --- a/evennia/contrib/utils/auditing/tests.py +++ b/evennia/contrib/utils/auditing/tests.py @@ -4,20 +4,16 @@ Module containing the test cases for the Audit system. """ from anything import Anything -from django.conf import settings +from django.test import override_settings from evennia.utils.test_resources import EvenniaTest import re -# Configure session auditing settings - TODO: This is bad practice that leaks over to other tests -settings.AUDIT_CALLBACK = "evennia.contrib.utils.auditing.outputs.to_syslog" -settings.AUDIT_IN = True -settings.AUDIT_OUT = True -settings.AUDIT_ALLOW_SPARSE = True - -# Configure settings to use custom session - TODO: This is bad practice, changing global settings -settings.SERVER_SESSION_CLASS = "evennia.contrib.utils.auditing.server.AuditedServerSession" - +@override_settings( + AUDIT_CALLBACK="evennia.contrib.utils.auditing.outputs.to_syslog", + AUDIT_IN=True, + AUDIT_OUT=True, + AUDIT_ALLOW_SPARSE=True) class AuditingTest(EvenniaTest): def test_mask(self): """ diff --git a/evennia/contrib/utils/random_string_generator/__init__.py b/evennia/contrib/utils/random_string_generator/__init__.py index 07f92e9b82..8c64d91367 100644 --- a/evennia/contrib/utils/random_string_generator/__init__.py +++ b/evennia/contrib/utils/random_string_generator/__init__.py @@ -4,3 +4,5 @@ Pseudo-random generator - vlgeoff 2017 """ from .random_string_generator import RandomStringGenerator # noqa +from .random_string_generator import RandomStringGeneratorScript # noqa +from .random_string_generator import RejectedRegex, ExhaustedGenerator # noqa diff --git a/evennia/contrib/utils/random_string_generator/tests.py b/evennia/contrib/utils/random_string_generator/tests.py index f8890a16e4..2d72117941 100644 --- a/evennia/contrib/utils/random_string_generator/tests.py +++ b/evennia/contrib/utils/random_string_generator/tests.py @@ -4,7 +4,7 @@ Random string tests. """ from evennia.utils.test_resources import EvenniaTest -from evennia.contrib import random_string_generator +from . import random_string_generator SIMPLE_GENERATOR = random_string_generator.RandomStringGenerator("simple", "[01]{2}") diff --git a/evennia/contrib/utils/tree_select/tests.py b/evennia/contrib/utils/tree_select/tests.py index cbbba9cd3e..c5e4b2085a 100644 --- a/evennia/contrib/utils/tree_select/tests.py +++ b/evennia/contrib/utils/tree_select/tests.py @@ -4,8 +4,8 @@ Test tree select """ from evennia.utils.test_resources import EvenniaTest -from evennia.contrib import tree_select -from evennia.contrib import fieldfill +from . import tree_select +from evennia.contrib.utils.fieldfill import fieldfill TREE_MENU_TESTSTR = """Foo Bar diff --git a/evennia/settings_default.py b/evennia/settings_default.py index e6d2ed6a4b..8b5bb1910b 100644 --- a/evennia/settings_default.py +++ b/evennia/settings_default.py @@ -508,7 +508,11 @@ TYPECLASS_PATHS = [ "typeclasses", "evennia", "evennia.contrib", + "evennia.contrib.game_systems", + "evennia.contrib.base_systems", + "evennia.contrib.full_systems", "evennia.contrib.tutorials", + "evennia.contrib.utils", ] # Typeclass for account objects (linked to a character) (fallback) @@ -671,7 +675,8 @@ FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLED = False FUNCPARSER_OUTGOING_MESSAGES_MODULES = ["evennia.utils.funcparser", "server.conf.inlinefuncs"] # Prototype values are also parsed with FuncParser. These modules # define which $func callables are available to use in prototypes. -FUNCPARSER_PROTOTYPE_PARSING_MODULES = ["evennia.prototypes.protfuncs", "server.conf.prototypefuncs"] +FUNCPARSER_PROTOTYPE_PARSING_MODULES = ["evennia.prototypes.protfuncs", + "server.conf.prototypefuncs"] ###################################################################### # Global Scripts diff --git a/evennia/utils/test_resources.py b/evennia/utils/test_resources.py index c641bb8919..fad58a93af 100644 --- a/evennia/utils/test_resources.py +++ b/evennia/utils/test_resources.py @@ -5,7 +5,7 @@ Various helper resources for writing unittests. import sys from twisted.internet.defer import Deferred from django.conf import settings -from django.test import TestCase +from django.test import TestCase, override_settings from mock import Mock, patch from evennia.objects.objects import DefaultObject, DefaultCharacter, DefaultRoom, DefaultExit from evennia.accounts.accounts import DefaultAccount @@ -14,6 +14,57 @@ from evennia.server.serversession import ServerSession from evennia.server.sessionhandler import SESSIONS from evennia.utils import create from evennia.utils.idmapper.models import flush_cache +from evennia.utils.utils import all_from_module +from evennia import settings_default + + +# set up a 'pristine' setting, unaffected by any changes in mygame +DEFAULT_SETTING_RESETS = dict( + CONNECTION_SCREEN_MODULE="evennia.game_template.server.conf.connection_screens", + AT_SERVER_STARTSTOP_MODULE="evennia.game_template.server.conf.at_server_startstop", + AT_SERVICES_PLUGINS_MODULES=["evennia.game_template.server.conf.server_services_plugins"], + PORTAL_SERVICES_PLUGIN_MODULES=["evennia.game_template.server.conf.portal_services_plugins"], + MSSP_META_MODULE="evennia.game_template.server.conf.mssp", + WEB_PLUGINS_MODULE="server.conf.web_plugins", + LOCK_FUNC_MODULES=("evennia.locks.lockfuncs", "evennia.game_template.server.conf.lockfuncs"), + INPUT_FUNC_MODULES=["evennia.server.inputfuncs", + "evennia.game_template.server.conf.inputfuncs"], + PROTOTYPE_MODULES=["evennia.game_template.world.prototypes"], + CMDSET_UNLOGGEDIN="evennia.game_template.commands.default_cmdsets.UnloggedinCmdSet", + CMDSET_SESSION="evennia.game_template.commands.default_cmdsets.SessionCmdSet", + CMDSET_CHARACTER="evennia.game_template.commands.default_cmdsets.CharacterCmdSet", + CMDSET_ACCOUNT="evennia.game_template.commands.default_cmdsets.AccountCmdSet", + CMDSET_PATHS=["evennia.game_template.commands", "evennia", "evennia.contrib"], + TYPECLASS_PATHS=[ + "evennia", + "evennia.contrib", + "evennia.contrib.game_systems", + "evennia.contrib.base_systems", + "evennia.contrib.full_systems", + "evennia.contrib.tutorials", + "evennia.contrib.utils"], + BASE_ACCOUNT_TYPECLASS="evennia.accounts.accounts.DefaultAccount", + BASE_OBJECT_TYPECLASS="evennia.objects.objects.DefaultObject", + BASE_CHARACTER_TYPECLASS="evennia.objects.objects.DefaultCharacter", + BASE_ROOM_TYPECLASS="evennia.objects.objects.DefaultRoom", + BASE_EXIT_TYPECLASS="evennia.objects.objects.DefaultExit", + BASE_CHANNEL_TYPECLASS="evennia.comms.comms.DefaultChannel", + BASE_SCRIPT_TYPECLASS="evennia.scripts.scripts.DefaultScript", + BASE_BATCHPROCESS_PATHS=["evennia.game_template.world", + "evennia.contrib", "evennia.contrib.tutorials"], + FILE_HELP_ENTRY_MODULES=["evennia.game_template.world.help_entries"], + FUNCPARSER_OUTGOING_MESSAGES_MODULES=["evennia.utils.funcparser", + "evennia.game_template.server.conf.inlinefuncs"], + FUNCPARSER_PROTOTYPE_PARSING_MODULES=["evennia.prototypes.protfuncs", + "evennia.game_template.server.conf.prototypefuncs"], + BASE_GUEST_TYPECLASS="evennia.accounts.accounts.DefaultGuest", +) + +DEFAULT_SETTINGS = { + **all_from_module(settings_default), + **DEFAULT_SETTING_RESETS +} +DEFAULT_SETTINGS.pop("DATABASES") # we want different dbs tested in CI # mocking of evennia.utils.utils.delay @@ -69,9 +120,9 @@ def _mock_deferlater(reactor, timedelay, callback, *args, **kwargs): return Deferred() -class EvenniaTest(TestCase): +class EvenniaTestMixin: """ - Base test for Evennia, sets up a basic environment. + Evennia test environment mixin """ account_typeclass = DefaultAccount @@ -161,10 +212,29 @@ class EvenniaTest(TestCase): super().tearDown() -class LocalEvenniaTest(EvenniaTest): +@override_settings(**DEFAULT_SETTINGS) +class EvenniaTestCase(TestCase): + """ + Base test (with no default objects) but with + enforced default settings. + + """ + + +@override_settings(**DEFAULT_SETTINGS) +class EvenniaTest(EvenniaTestMixin, TestCase): + """ + This class parent uses only default settings. + + """ + + +class LocalEvenniaTest(EvenniaTestMixin, TestCase): """ This test class is intended for inheriting in mygame tests. - It helps ensure your tests are run with your own objects. + It helps ensure your tests are run with your own objects + and settings from your game folder. + """ account_typeclass = settings.BASE_ACCOUNT_TYPECLASS