diff --git a/evennia/web/website/tests.py b/evennia/web/website/tests.py index 3afb842d54..5e52c16f94 100644 --- a/evennia/web/website/tests.py +++ b/evennia/web/website/tests.py @@ -5,6 +5,9 @@ from django.urls import reverse from evennia.utils import class_from_module from evennia.utils.create import create_help_entry from evennia.utils.test_resources import EvenniaTest +from evennia.help import filehelp + +_FILE_HELP_ENTRIES = None class EvenniaWebTest(EvenniaTest): @@ -140,20 +143,46 @@ class HelpListTest(EvenniaWebTest): url_name = "help" +HELP_ENTRY_DICTS = [ + { + "key": "unit test file entry", + "category": "General", + "text": "cache test file entry text" + } +] + class HelpDetailTest(EvenniaWebTest): url_name = "help-entry-detail" def setUp(self): super().setUp() - create_help_entry('unit test entry', 'unit test entry text', category="General") + + # create a db help entry + create_help_entry('unit test db entry', 'unit test db entry text', category="General") def get_kwargs(self): return {"category": slugify("general"), - "topic": slugify('unit test entry')} + "topic": slugify('unit test db entry')} def test_view(self): response = self.client.get(reverse(self.url_name, kwargs=self.get_kwargs()), follow=True) - self.assertEqual(response.context["entry_text"], 'unit test entry text') + self.assertEqual(response.context["entry_text"], 'unit test db entry text') + + def test_object_cache(self): + # clear file help entries, use local HELP_ENTRY_DICTS to recreate new entries + global _FILE_HELP_ENTRIES + if _FILE_HELP_ENTRIES is None: + from evennia.help.filehelp import FILE_HELP_ENTRIES as _FILE_HELP_ENTRIES + help_module = 'evennia.web.website.tests' + self.file_help_store = _FILE_HELP_ENTRIES.__init__(help_file_modules=[help_module]) + + # request access to an entry + response = self.client.get(reverse(self.url_name, kwargs=self.get_kwargs()), follow=True) + self.assertEqual(response.context["entry_text"], 'unit test db entry text') + # request a second entry, verifing the cached object is not provided on a new topic request + entry_two_args = {"category": slugify("general"), "topic": slugify('unit test file entry')} + response = self.client.get(reverse(self.url_name, kwargs=entry_two_args), follow=True) + self.assertEqual(response.context["entry_text"], 'cache test file entry text') class HelpLockedDetailTest(EvenniaWebTest): diff --git a/evennia/web/website/views/help.py b/evennia/web/website/views/help.py index 1875156351..e0923ec241 100644 --- a/evennia/web/website/views/help.py +++ b/evennia/web/website/views/help.py @@ -283,6 +283,10 @@ class HelpDetailView(HelpMixin, DetailView): entry (HelpEntry, FileHelpEntry or Command): HelpEntry requested in the URL. """ + + if hasattr(self, 'obj'): + return getattr(self, 'obj', None) + # Get the queryset for the help entries the user can access if not queryset: queryset = self.get_queryset() @@ -309,5 +313,8 @@ class HelpDetailView(HelpMixin, DetailView): return HttpResponseBadRequest( f"No ({category}/{topic})s found matching the query." ) + else: + # cache the object if one was found + self.obj = obj return obj