bristol-eurostar/tests/test_cache.py
Edward Betts 6b044b9493 Add 24-hour TTL to Eurostar price cache
Cache reads now accept an optional ttl (seconds). get_cached checks the
file mtime and returns None if the entry is older than the TTL, triggering
a fresh fetch. Eurostar prices use a 24-hour TTL; timetable caches remain
indefinite (date-scoped keys become irrelevant once the date passes).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 10:38:47 +01:00

42 lines
1.1 KiB
Python

import os
import time
import pytest
from cache import get_cached, set_cached
@pytest.fixture
def tmp_cache(tmp_path, monkeypatch):
import cache as cache_module
monkeypatch.setattr(cache_module, 'CACHE_DIR', str(tmp_path))
return tmp_path
def test_get_cached_returns_none_for_missing_key(tmp_cache):
assert get_cached('no_such_key') is None
def test_set_and_get_cached_roundtrip(tmp_cache):
set_cached('my_key', {'a': 1})
assert get_cached('my_key') == {'a': 1}
def test_get_cached_no_ttl_never_expires(tmp_cache):
set_cached('k', [1, 2, 3])
# Backdate the file by 2 days
path = tmp_cache / 'k.json'
old = time.time() - 2 * 86400
os.utime(path, (old, old))
assert get_cached('k') == [1, 2, 3]
def test_get_cached_within_ttl(tmp_cache):
set_cached('k', 'fresh')
assert get_cached('k', ttl=3600) == 'fresh'
def test_get_cached_expired_returns_none(tmp_cache):
set_cached('k', 'stale')
path = tmp_cache / 'k.json'
old = time.time() - 25 * 3600 # 25 hours ago
os.utime(path, (old, old))
assert get_cached('k', ttl=24 * 3600) is None