File size: 2,240 Bytes
23d337e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
"""Unit tests for storage/cache.py."""

from __future__ import annotations

import time

import pytest

from storage.cache import Cache


class TestCache:
    def test_set_and_get(self):
        c = Cache(ttl_seconds=60, max_entries=10)
        c.set("key1", "value1")
        assert c.get("key1") == "value1"

    def test_get_missing_key(self):
        c = Cache()
        assert c.get("missing") is None

    def test_ttl_expiration(self):
        c = Cache(ttl_seconds=1, max_entries=10)
        c.set("key1", "value1")
        assert c.get("key1") == "value1"
        time.sleep(1.2)
        assert c.get("key1") is None

    def test_lru_eviction(self):
        c = Cache(ttl_seconds=60, max_entries=3)
        c.set("k1", "v1")
        c.set("k2", "v2")
        c.set("k3", "v3")
        # Access k1 to mark it as recently used
        c.get("k1")
        # Add k4 — should evict k2 (least recently used)
        c.set("k4", "v4")
        assert c.get("k1") == "v1"  # still there
        assert c.get("k2") is None  # evicted
        assert c.get("k3") == "v3"
        assert c.get("k4") == "v4"

    def test_invalidate(self):
        c = Cache()
        c.set("k1", "v1")
        assert c.invalidate("k1") is True
        assert c.get("k1") is None
        assert c.invalidate("k1") is False  # already gone

    def test_clear(self):
        c = Cache()
        c.set("k1", "v1")
        c.set("k2", "v2")
        n = c.clear()
        assert n == 2
        assert c.get("k1") is None

    def test_stats_hit_miss(self):
        c = Cache()
        c.set("k1", "v1")
        c.get("k1")  # hit
        c.get("missing")  # miss
        s = c.stats()
        assert s["hits"] == 1
        assert s["misses"] == 1
        assert s["hit_ratio"] == 0.5

    def test_stats_evictions(self):
        c = Cache(ttl_seconds=60, max_entries=2)
        c.set("k1", "v1")
        c.set("k2", "v2")
        c.set("k3", "v3")  # should evict k1
        s = c.stats()
        assert s["evictions"] == 1
        assert s["entries"] == 2

    def test_overwrite_existing_key(self):
        c = Cache()
        c.set("k1", "v1")
        c.set("k1", "v2")
        assert c.get("k1") == "v2"
        s = c.stats()
        assert s["entries"] == 1