From ece8f4f1384a7f13436c137b048edf3d956fc9cc Mon Sep 17 00:00:00 2001 From: Cal Date: Sat, 4 May 2024 21:22:01 -0600 Subject: [PATCH] tests for reports contrib --- .../base_systems/ingame_reports/reports.py | 7 +- .../base_systems/ingame_reports/tests.py | 87 ++++++++++++++++++- 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/evennia/contrib/base_systems/ingame_reports/reports.py b/evennia/contrib/base_systems/ingame_reports/reports.py index 2cbc0decfd..416546f24f 100644 --- a/evennia/contrib/base_systems/ingame_reports/reports.py +++ b/evennia/contrib/base_systems/ingame_reports/reports.py @@ -86,7 +86,7 @@ Initializes a menu for reviewing and changing the status of current reports. return helptext def func(self): - _, report_type = self.cmdstring.split()[-1] + report_type = self.cmdstring.split()[-1] if report_type == "reports": report_type = "players" if report_type not in _REPORT_TYPES: @@ -98,7 +98,9 @@ Initializes a menu for reviewing and changing the status of current reports. if not hub: self.msg("You cannot manage that.") - evmenu.EvMenu(self.account, menu, startnode="menunode_list_reports", hub=hub, persistent=True) + evmenu.EvMenu( + self.account, menu, startnode="menunode_list_reports", hub=hub, persistent=True + ) class ReportCmdBase(_DEFAULT_COMMAND_CLASS): @@ -212,6 +214,7 @@ class CmdIdea(ReportCmdBase): key = "idea" aliases = ("ideas",) report_locks = "read:pperm(Builder)" + success_msg = "Thank you for your suggestion!" def func(self): # we add an extra feature to this command, allowing you to see all your submitted ideas diff --git a/evennia/contrib/base_systems/ingame_reports/tests.py b/evennia/contrib/base_systems/ingame_reports/tests.py index 777ab4dd18..4556c250a4 100644 --- a/evennia/contrib/base_systems/ingame_reports/tests.py +++ b/evennia/contrib/base_systems/ingame_reports/tests.py @@ -1 +1,86 @@ -# TODO: write tests +from unittest.mock import Mock, patch, MagicMock +from evennia.utils import create +from evennia.comms.models import TempMsg +from evennia.utils.test_resources import EvenniaCommandTest + +from . import menu, reports + + +class _MockQuerySet(list): + def order_by(self, *args, **kwargs): + return self + + def exclude(self, *args, **kwargs): + return self + + def filter(self, *args, **kwargs): + return self + + +def _mock_pre(cmdobj): + """helper to mock at_pre_cmd""" + cmdobj.hub = Mock() + + +class TestReportCommands(EvenniaCommandTest): + @patch.object(create, "create_message", new=MagicMock()) + def test_report_cmd_base(self): + """verify that the base command functionality works""" + cmd = reports.ReportCmdBase + + # avoid test side-effects + with patch.object(cmd, "at_pre_cmd", new=_mock_pre) as _: + # no arguments + self.call(cmd(), "", "You must provide a message.") + # arguments, no target, no target required + self.call(cmd(), "test", "Your report has been filed.") + # arguments, custom success message + custom_success = "custom success message" + cmd.success_msg = custom_success + self.call(cmd(), "test", custom_success) + # arguments, no target, target required + cmd.require_target = True + self.call(cmd(), "test", "You must include a target.") + + @patch.object(create, "create_message", new=MagicMock()) + @patch.object(reports, "datetime_format", return_value="now") + def test_ideas_list(self, mock_datetime_format): + cmd = reports.CmdIdea + + fake_ideas = _MockQuerySet([TempMsg(message=f"idea {i+1}") for i in range(3)]) + expected = """\ +Ideas you've submitted: + idea 1 (submitted now) + idea 2 (submitted now) + idea 3 (submitted now) +""" + + with patch.object(cmd, "at_pre_cmd", new=_mock_pre) as _: + # submitting an idea + self.call(cmd(), "", "You must provide a message.") + # arguments, no target, no target required + self.call(cmd(), "test", "Thank you for your suggestion!") + + # viewing your submitted ideas + with patch.object(reports.Msg.objects, "search_message", return_value=fake_ideas): + self.call(cmd(), "", cmdstring="ideas", msg=expected) + + @patch.object(reports.evmenu, "EvMenu") + def test_cmd_manage_reports(self, evmenu_mock): + cmd = reports.CmdManageReports + hub = Mock() + + with patch.object(reports, "_get_report_hub", return_value=hub) as _: + # invalid report type fails + self.call( + cmd(), "", cmdstring="manage custom", msg="'custom' is not a valid report category." + ) + # verify valid type triggers evmenu + self.call(cmd(), "", cmdstring="manage bugs") + evmenu_mock.assert_called_once_with( + self.account, + menu, + startnode="menunode_list_reports", + hub=hub, + persistent=True, + )