disagreement/tests/test_cache.py

68 lines
1.3 KiB
Python

import time
from disagreement.cache import Cache
def test_cache_store_and_get():
cache = Cache()
cache.set("a", 123)
assert cache.get("a") == 123
def test_cache_ttl_expiry():
cache = Cache(ttl=0.01)
cache.set("b", 1)
assert cache.get("b") == 1
time.sleep(0.02)
assert cache.get("b") is None
def test_cache_lru_eviction():
cache = Cache(maxlen=2)
cache.set("a", 1)
cache.set("b", 2)
assert cache.get("a") == 1
cache.set("c", 3)
assert cache.get("b") is None
assert cache.get("a") == 1
assert cache.get("c") == 3
def test_get_or_fetch_uses_cache():
cache = Cache()
cache.set("a", 1)
def fetch():
raise AssertionError("fetch should not be called")
assert cache.get_or_fetch("a", fetch) == 1
def test_get_or_fetch_fetches_and_stores():
cache = Cache()
called = False
def fetch():
nonlocal called
called = True
return 2
assert cache.get_or_fetch("b", fetch) == 2
assert called
assert cache.get("b") == 2
def test_get_or_fetch_fetches_expired_item():
cache = Cache(ttl=0.01)
cache.set("c", 1)
time.sleep(0.02)
called = False
def fetch():
nonlocal called
called = True
return 3
assert cache.get_or_fetch("c", fetch) == 3
assert called