File size: 1,505 Bytes
dcc24f8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Tests for FinEE Cache (Tier 0).
"""

import time
from finee.cache import LRUCache, ExtractionResult

def test_cache_hashing():
    cache = LRUCache()
    text = "  Rs.500 spent  "
    
    # Should normalize whitespace and case
    key1 = cache.hash_text("Rs.500 spent")
    key2 = cache.hash_text("rs.500 SPENT")
    
    assert key1 == key2

def test_cache_operations():
    cache = LRUCache(max_size=2)
    
    # Add item
    res1 = ExtractionResult(amount=100.0)
    cache.set("tx1", res1)
    
    # Get item
    cached = cache.get("tx1")
    assert cached.amount == 100.0
    assert cached.from_cache is True
    
    # Check stats
    stats = cache.get_stats()
    assert stats.hits == 1
    assert stats.size == 1

def test_lru_eviction():
    cache = LRUCache(max_size=2)
    
    # Fill cache
    cache.set("tx1", ExtractionResult(amount=1))
    cache.set("tx2", ExtractionResult(amount=2))
    
    # Access tx1 to make it recent
    cache.get("tx1")
    
    # Add 3rd item (should evict tx2, because tx1 was just used)
    cache.set("tx3", ExtractionResult(amount=3))
    
    assert cache.contains("tx1")  # Kept
    assert cache.contains("tx3")  # New
    assert not cache.contains("tx2")  # Evicted

def test_cache_threading_safety():
    # Basic check ensuring no crash on rapid updates
    cache = LRUCache(max_size=100)
    for i in range(200):
        cache.set(f"tx{i}", ExtractionResult(amount=i))
    
    assert len(cache) == 100
    assert cache.get("tx199").amount == 199.0