Files
Sheerka-Old/tests/cache/test_cache_manager.py
T

158 lines
6.4 KiB
Python

import pytest
from cache.Cache import Cache
from cache.CacheManager import CacheManager, ConceptNotFound
from cache.DictionaryCache import DictionaryCache
from cache.ListCache import ListCache
from cache.ListIfNeededCache import ListIfNeededCache
from core.concept import Concept
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka
class TestCacheManager(TestUsingMemoryBasedSheerka):
def test_i_do_not_push_into_sdp_when_cache_only(self):
sheerka = self.get_sheerka()
context = self.get_context(sheerka)
cache_manager = CacheManager(True)
cache_manager.register_cache("test", Cache(), persist=True)
cache_manager.put("test", "key", "value")
cache_manager.commit(context)
assert not sheerka.sdp.exists("test", "key")
def test_i_do_not_get_value_from_sdp_when_cache_only_is_true(self):
sheerka = self.get_sheerka()
context = self.get_context(sheerka)
with sheerka.sdp.get_transaction(context.event) as transaction:
transaction.add("test", "key", "value")
cache = Cache(default=lambda k: sheerka.sdp.get("test", k))
cache_manager = CacheManager(True)
cache_manager.register_cache("test", cache, persist=True)
assert cache_manager.get("test", "key") is None
def test_i_can_get_value_from_sdp_when_cache_only_is_false(self):
sheerka = self.get_sheerka()
context = self.get_context(sheerka)
with sheerka.sdp.get_transaction(context.event) as transaction:
transaction.add("test", "key", "value")
cache = Cache(default=lambda k: sheerka.sdp.get("test", k))
cache_manager = CacheManager(False)
cache_manager.register_cache("test", cache, persist=True)
assert cache_manager.get("test", "key") == "value"
def test_i_can_commit_simple_cache(self):
sheerka = self.get_sheerka()
context = self.get_context(sheerka)
cache_manager = CacheManager(False)
cache_manager.register_cache("test", Cache(), persist=True)
cache = cache_manager.caches["test"].cache
cache_manager.put("test", "key", "value")
cache_manager.commit(context)
assert sheerka.sdp.get("test", "key") == "value"
cache.update("key", "value", "key", "another_value")
cache_manager.commit(context)
assert sheerka.sdp.get("test", "key") == "another_value"
cache.update("key", "another_value", "key2", "another_value")
cache_manager.commit(context)
assert sheerka.sdp.get("test", "key") is None
assert sheerka.sdp.get("test", "key2") == "another_value"
def test_i_can_commit_list_cache(self):
sheerka = self.get_sheerka()
context = self.get_context(sheerka)
cache_manager = CacheManager(False)
cache_manager.register_cache("test", ListCache(), persist=True)
cache = cache_manager.caches["test"].cache
cache.put("key", "value")
cache_manager.commit(context)
assert sheerka.sdp.get("test", "key") == ["value"]
cache.put("key", "value2")
cache_manager.commit(context)
assert sheerka.sdp.get("test", "key") == ["value", "value2"]
cache.update("key", "value2", "key2", "value2")
cache_manager.commit(context)
assert sheerka.sdp.get("test", "key") == ["value"]
assert sheerka.sdp.get("test", "key2") == ["value2"]
cache.update("key2", "value2", "key3", "value2")
cache_manager.commit(context)
assert sheerka.sdp.get("test", "key") == ["value"]
assert sheerka.sdp.get("test", "key2") is None
assert sheerka.sdp.get("test", "key3") == ["value2"]
def test_i_can_commit_dictionary_cache(self):
sheerka = self.get_sheerka()
context = self.get_context(sheerka)
cache_manager = CacheManager(False)
cache_manager.register_cache("test", DictionaryCache(), persist=True)
cache = cache_manager.caches["test"].cache
cache.put(False, {"key": "value", "key2": "value2"})
cache_manager.commit(context)
assert sheerka.sdp.get("test") == {"key": "value", "key2": "value2"}
assert sheerka.sdp.get("test", "key") == "value"
cache.put(False, {"key": "value", "key2": "value2", "key3": "value3"})
cache_manager.commit(context)
assert sheerka.sdp.get("test") == {"key": "value", "key2": "value2", "key3": "value3"}
def test_i_can_remove_a_concept_from_concepts_caches(self):
cache_manager = CacheManager(True)
cache_manager.register_concept_cache("id", Cache(), lambda c: c.id, True)
cache_manager.register_concept_cache("key", ListIfNeededCache(), lambda c: c.key, True)
sheerka, context, one, two, three, two_bis = self.init_concepts("one", "two", "three", Concept("two", body="2"))
for concept in [one, two, three, two_bis]:
cache_manager.add_concept(concept)
# sanity check
cache_def = cache_manager.caches["id"]
assert cache_def.cache.copy() == {one.id: one, two.id: two, three.id: three, two_bis.id: two_bis}
cache_def = cache_manager.caches["key"]
assert cache_def.cache.copy() == {one.key: one, two.key: [two, two_bis], three.key: three}
for cache_name in cache_manager.concept_caches:
cache_manager.caches[cache_name].cache.reset_events()
cache_manager.remove_concept(sheerka.new(("two", two_bis.id)))
cache_def = cache_manager.caches["id"]
assert cache_def.cache.copy() == {one.id: one, two.id: two, three.id: three}
assert cache_def.cache.to_remove == {two_bis.id}
assert cache_def.cache.to_add == set()
assert len(cache_def.cache) == 3
cache_def = cache_manager.caches["key"]
assert cache_def.cache.copy() == {one.key: one, two.key: two, three.key: three}
assert cache_def.cache.to_remove == set()
assert cache_def.cache.to_add == {"two"}
assert len(cache_def.cache) == 3
def test_i_cannot_remove_a_concept_that_does_not_exists(self):
cache_manager = CacheManager(True)
cache_manager.register_concept_cache("id", Cache(), lambda c: c.id, True)
cache_manager.register_concept_cache("key", ListIfNeededCache(), lambda c: c.key, True)
with pytest.raises(ConceptNotFound) as ex:
cache_manager.remove_concept(Concept("foo", id="1001"))
assert ex.value.concept == Concept("foo", id="1001")