diff --git a/pelican/tests/test_utils.py b/pelican/tests/test_utils.py index 449a6814..1890ffb9 100644 --- a/pelican/tests/test_utils.py +++ b/pelican/tests/test_utils.py @@ -860,3 +860,34 @@ class TestSanitisedJoin(unittest.TestCase): utils.posixize_path( os.path.abspath(os.path.join("/foo/bar", "test"))) ) + + +class TestMemoized(unittest.TestCase): + def test_memoized(self): + class Container: + def _get(self, key): + pass + + @utils.memoized + def get(self, key): + return self._get(key) + + container = Container() + + with unittest.mock.patch.object( + container, "_get", side_effect=lambda x: x + ) as get_mock: + self.assertEqual("foo", container.get("foo")) + get_mock.assert_called_once_with("foo") + + get_mock.reset_mock() + self.assertEqual("foo", container.get("foo")) + get_mock.assert_not_called() + + self.assertEqual("bar", container.get("bar")) + get_mock.assert_called_once_with("bar") + + get_mock.reset_mock() + container.get.cache.clear() + self.assertEqual("bar", container.get("bar")) + get_mock.assert_called_once_with("bar") diff --git a/pelican/utils.py b/pelican/utils.py index f3a01217..de6ef9bf 100644 --- a/pelican/utils.py +++ b/pelican/utils.py @@ -155,7 +155,9 @@ class memoized: def __get__(self, obj, objtype): '''Support instance methods.''' - return partial(self.__call__, obj) + fn = partial(self.__call__, obj) + fn.cache = self.cache + return fn def deprecated_attribute(old, new, since=None, remove=None, doc=None):