68 lines
1.3 KiB
Python
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
|