示例#1
0
    async def test_prefix(self, cache_instance_factory):
        simple_prefix = 'project1'
        cache_instance = await cache_instance_factory(prefix=simple_prefix)

        await cache_instance.set('key1', 'value1')
        assert await cache_instance.get('key1') == 'value1'

        keys = await cache_instance.get_all_keys()
        assert len(keys) == 1
        assert create_cache_key(simple_prefix, 'key1') == keys[0]
        await cache_instance.clear()

        cache_data = {
            'key2': 'value2',
            'key3': 'value3',
        }

        await cache_instance.set_many(cache_data)

        keys = await cache_instance.get_all_keys()
        assert len(keys) == len(cache_data)
        assert (sorted([
            create_cache_key(simple_prefix, key) for key in cache_data
        ]) == sorted(keys))

        data = await cache_instance.get_many(cache_data.keys())
        assert data == cache_data
    async def test_default_cache_key(self):
        cache_callable = self.user.instance_default_cache_key
        cache_key = create_cache_key(
            __test_name__ +
            '.{}.instance_default_cache_key'.format(self.user_class_name), 1,
            2, 8)
        await self._check_base(cache_callable)
        await self._check_cache_key(cache_callable, cache_key, 1, 2)
        await self._check_timeout(cache_key, DEFAULT_TIMEOUT)

        cache_callable = self.user_class.class_method_default_cache_key
        cache_key = create_cache_key(
            __test_name__ +
            '.{}.class_method_default_cache_key'.format(self.user_class_name),
            2, 3, 9, 'Иван')

        await self._check_base(cache_callable)
        await self._check_cache_key(cache_callable, cache_key, 2, 3)
        await self._check_timeout(cache_key, DEFAULT_TIMEOUT)

        cache_callable = computation
        cache_key = create_cache_key(__name__ + '.computation', 'a', 'b', 'c')

        await self._check_base(cache_callable)
        await self._check_cache_key(cache_callable, cache_key, 'a', 'b', 'c')
        await self._check_timeout(cache_key, 100)
    async def test_instance_method_dynamic_timeout(self):
        cache_callable = self.user.instance_dynamic_timeout

        await self._check_base(cache_callable)

        cache_key = create_cache_key('dyn_timeout', 2)
        await self._check_cache_key(cache_callable, cache_key, 2, 3, 4)
        await self._check_timeout(cache_key, 2 * 100)

        self.cache_mock.reset_mock()

        cache_key = create_cache_key('dyn_timeout', 4)
        await self._check_cache_key(cache_callable, cache_key, 4, 5, 6)
        await self._check_timeout(cache_key, 4 * 100)
    async def test_class_method_full_spec(self):
        cache_callable = self.user_class.class_method_full_spec
        a = 'ф'
        b = 'ю'
        c = 10

        cache_prefix = create_cache_key('USER', a, b)
        cache_key = create_cache_key(cache_prefix, self.user_class.name, a)

        await self._check_base(cache_callable)
        await self._check_cache_key(cache_callable, cache_key, a, b, c)
        await self._check_timeout(cache_key, 500)
        await self._check_tags(
            cache_callable,
            ['tag4', create_cache_key('tag5', self.user_class.name)], a, b, c)
        await self._check_cache_prefix(cache_callable, cache_prefix, a, b, c)
    async def test_default_cache_key_for_property(self):
        async def check_property():
            assert await self._get_awaitable_value(self.user.test_property
                                                   ) == 'property'

        await check_property()
        cache_callable = lambda: getattr(self.user, 'test_property')
        cache_callable.property = True

        cache_key = create_cache_key(
            __test_name__ + '.{}.test_property'.format(self.user_class_name))

        await self._check_cache_key(cache_callable, cache_key)

        await self.local_cache.clear()
        self.cache_mock.reset_mock()

        await check_property()
        self.cache_mock.assert_called_once_with('property')
        self.cache_mock.reset_mock()

        await check_property()
        self.cache_mock.assert_not_called()

        # invalidate cache
        await self.user_class.test_property.invalidate_cache_by_key()
        await check_property()
        self.cache_mock.assert_called_once_with('property')
    async def test_method_prefixed(self):
        cache_callable = self.user.instance_method_prefixed
        cache_prefix = create_cache_key('USER', self.user.id)

        # prefix should ba attached
        cache_key = create_cache_key(cache_prefix, 'p1', 1, 2, 3)

        await self._check_base(cache_callable)
        await self._check_cache_key(cache_callable, cache_key, 1, 2, 3)
        await self._check_timeout(cache_key, 3600)

        # prefix is a tag actually
        await self._check_cache_prefix(cache_callable, cache_prefix, 1, 2, 3)
        await self._check_tags(cache_callable,
                               [create_cache_key(self.user.id, 'tag1')], 1, 2,
                               3)
    async def test_not_default_timeout(self):
        cache_callable = self.user.instance_method_timeout
        cache_key = create_cache_key(self.user.id, 5, 5)

        await self._check_base(cache_callable)
        await self._check_cache_key(cache_callable, cache_key, 5, 5)
        await self._check_timeout(cache_key, 400)
    async def test_cache_key_as_list(self):
        cache_callable = self.user.instance_method_list
        cache_key = create_cache_key(self.user.id, 2, 3)

        await self._check_base(cache_callable)
        await self._check_cache_key(cache_callable, cache_key, 2, 3)
        await self._check_timeout(cache_key, DEFAULT_TIMEOUT)
    async def test_propery_with_parametrized_cache_key(self):
        async def check_property():
            assert await self._get_awaitable_value(
                self.user.test_manufacture_property) == 'manufacture_property'

        await check_property()
        cache_callable = lambda: getattr(self.user, 'test_manufacture_property'
                                         )
        cache_callable.property = True

        cache_key = create_cache_key('manufacturer:{}'.format(self.user.id))

        await self._check_cache_key(cache_callable, cache_key)

        await self.local_cache.clear()
        self.cache_mock.reset_mock()

        await check_property()
        self.cache_mock.assert_called_once_with('manufacture_property')
        self.cache_mock.reset_mock()

        await check_property()
        self.cache_mock.assert_not_called()

        # invalidate cache
        await self.user_class.test_manufacture_property.invalidate_cache_by_key(
            self.user)
        await check_property()
        self.cache_mock.assert_called_once_with('manufacture_property')
示例#10
0
    async def test_ordinal_func(self):
        cache_callable = ordinal_func
        cache_prefix = ordinal_func.prefix
        cache_key = create_cache_key(cache_prefix, 10, 20)

        result = self.cache_mock.create_args(a=10, b=10)

        assert await cache_callable(a=10, b=10) == result
        self.cache_mock.assert_called_once_with(result)
        self.cache_mock.reset_mock()

        # cached version
        assert await cache_callable(a=10, b=10) == result
        self.cache_mock.assert_not_called()
        self.cache_mock.reset_mock()

        result = self.cache_mock.create_args(a=10, b=22)

        # different params, no cache
        assert await cache_callable(a=10, b=22) == result
        self.cache_mock.assert_called_once_with(result)
        self.cache_mock.reset_mock()

        await self._check_cache_key(cache_callable, cache_key, a=10, b=20)
        await self._check_cache_prefix(cache_callable,
                                       cache_prefix,
                                       a=10,
                                       b=20)
示例#11
0
    async def test_second_func(self):
        cache_callable = second_func
        cache_key = create_cache_key('second', 100)

        await self._check_base(cache_callable, param_to_change='c')
        await self._check_cache_key(cache_callable, cache_key, 1, 2, c=100)
        await self._check_timeout(cache_key, 450)
        await self._check_tags(cache_callable, ['yyy'], 'yyy', 111)
    async def test_cache_custom_tags(self):
        cache_callable = self.user.instance_method_custom_tags
        cache_key = create_cache_key(10, 11)
        cache_tags = await self._get_awaitable_value(
            self.user.generate_custom_tags(MetaCallable(args=(self.user, 10))))

        await self._check_cache_key(cache_callable, cache_key, 10, 11)
        await self._check_tags(cache_callable, cache_tags, 10, 11)
    async def test_cache_tags(self):
        cache_callable = self.user.instance_method_tags
        cache_key = create_cache_key(self.user.id, 5, 5)

        await self._check_base(cache_callable)
        await self._check_cache_key(cache_callable, cache_key, 5, 5)
        await self._check_timeout(cache_key, 500)
        await self._check_tags(cache_callable, ['tag1', 'tag2'], 6, 7)
    async def test_cache_key_as_string(self):
        cache_callable = self.user.instance_method_string
        cache_key = create_cache_key(self.user.id, 1, 2, 3)

        await self._check_base(self.user.instance_method_string)
        await self._check_cache_key(cache_callable, cache_key, 1, 2, c=3)
        await self._check_timeout(cache_key, DEFAULT_TIMEOUT)
        assert await self.local_cache.get_len() == 1
    async def test_property_no_tags(self):
        assert await self._get_awaitable_value(self.user.property_no_tags
                                               ) == '42'

        cache_callable = lambda: getattr(self.user, 'property_no_tags')
        cache_callable.property = True
        cache_key = create_cache_key('static_key')

        await self._check_cache_key(cache_callable, cache_key)
    async def test_instance_method_and_meta_accepted_decorator(self):
        cache_callable = self.user.instance_method_meta_test

        cache_key = create_cache_key(1, 2, 5)

        await self._check_base(cache_callable)
        await self._check_cache_key(cache_callable, cache_key, 1, 2, c=5)
        await self._check_timeout(cache_key, DEFAULT_TIMEOUT)
        assert await self.local_cache.get_len() == 1
    async def test_class_method_key_string(self):
        cache_callable = self.user_class.class_method_cache_key_string
        cache_key = create_cache_key(self.user_class.name, 17)

        await self._check_base(cache_callable, param_to_change='c')
        await self._check_cache_key(cache_callable, cache_key, 1, 2)
        await self._check_timeout(cache_key, DEFAULT_TIMEOUT)

        cache_callable = self.user.class_method_cache_key_string
        await self._check_base(cache_callable, param_to_change='c')
        await self._check_cache_key(cache_callable, cache_key, 4, 5)
    async def test_static_method(self):
        cache_callable = self.user_class.static_method
        hg = 123
        test = 'ЫЮЯ'

        cache_prefix = cache_callable.prefix
        cache_key = create_cache_key(cache_prefix, hg, hg, test)

        await self._check_base(cache_callable)
        await self._check_cache_key(cache_callable, cache_key, hg, test)
        await self._check_timeout(cache_key, DEFAULT_TIMEOUT)
        await self._check_cache_prefix(cache_callable, cache_prefix, hg, test)
    async def test_static_method_default_key(self):
        cache_callable = self.user_class.static_method_default_key
        cache_prefix = create_cache_key('ppp', 2)
        cache_key = create_cache_key(
            cache_prefix, __test_name__ +
            '.{}.static_method_default_key'.format(self.user_class_name), 1, 2,
            11)

        await self._check_base(cache_callable, param_to_change='b')
        await self._check_cache_key(cache_callable, cache_key, a=1, b=2)

        # check partial invalidation
        self.cache_mock.reset_mock()
        self.cache_mock.assert_not_called()

        await cache_callable(1, 2, 3)
        self.cache_mock.assert_called_once_with(
            self.cache_mock.create_args(1, 2, 3))
        self.cache_mock.reset_mock()

        await cache_callable(1, 2, 3)
        self.cache_mock.assert_not_called()
        self.cache_mock.reset_mock()

        await cache_callable.invalidate_cache_by_tags(c=3)
        await cache_callable(1, 2, 3)
        self.cache_mock.assert_called_once_with(
            self.cache_mock.create_args(1, 2, 3))
        self.cache_mock.reset_mock()

        await cache_callable.invalidate_cache_by_prefix(b=2)
        await cache_callable(1, 2, 3)
        self.cache_mock.assert_called_once_with(
            self.cache_mock.create_args(1, 2, 3))
        self.cache_mock.reset_mock()

        await cache_callable.invalidate_cache_by_key(1, b=2, c=3)
        await cache_callable(1, 2, 3)
        self.cache_mock.assert_called_once_with(
            self.cache_mock.create_args(1, 2, 3))
    async def test_property_friends_count(self):
        assert await self._get_awaitable_value(self.user.friends_count) == 15

        cache_callable = lambda: getattr(self.user, 'friends_count')
        cache_callable.property = True
        cache_callable.invalidate_cache_by_prefix = (
            self.user_class.friends_count.invalidate_cache_by_prefix)

        cache_prefix = 'USER_PROPERTY'
        cache_key = create_cache_key(cache_prefix, self.user.id,
                                     'friends_count')

        await self._check_cache_key(cache_callable, cache_key)
        await self._check_timeout(cache_key, 100)
        await self._check_cache_prefix(cache_callable, cache_prefix)
示例#21
0
    async def test_invalidators(self):
        a, b = 'a', 'b'
        cache_callable = ordinal_func
        cache_prefix = ordinal_func.prefix
        cache_key = create_cache_key(cache_prefix, a, b)

        result = self.cache_mock.create_args(a=a, b=b)

        assert await cache_callable(a=a, b=b) == result
        self.cache_mock.assert_called_once_with(result)
        self.cache_mock.reset_mock()

        # cached version
        assert await cache_callable(a=a, b=b) == result
        self.cache_mock.assert_not_called()
        self.cache_mock.reset_mock()

        # invalidate cache via cache key
        await invalidate_cache_key(cache_key)

        # second invalidation should fail silently
        await invalidate_cache_key(cache_key)

        assert await cache_callable(a=a, b=b) == result
        self.cache_mock.assert_called_once_with(result)
        self.cache_mock.reset_mock()

        # cached version
        assert await cache_callable(a=a, b=b) == result
        self.cache_mock.assert_not_called()
        self.cache_mock.reset_mock()

        # invalidate cache via prefix
        await invalidate_cache_prefix(cache_prefix)
        assert await cache_callable(a=a, b=b) == result
        self.cache_mock.assert_called_once_with(result)
        self.cache_mock.reset_mock()

        # cached version
        assert await cache_callable(a=a, b=b) == result
        self.cache_mock.assert_not_called()
        self.cache_mock.reset_mock()

        # invalidate cache via attached invalidator
        await cache_callable.invalidate_cache_by_key(a=a, b=b)
        assert await cache_callable(a=a, b=b) == result
        self.cache_mock.assert_called_once_with(result)
        self.cache_mock.reset_mock()
示例#22
0
 def key_maker(key):
     return create_cache_key('hello', 'world', key)