Files
group_xinghuo_jinrong/tests/test_cache_service.py
T
zyi b19a2415f9 feat: 数据分析 Agent 实现(API/服务/表结构元数据/文档/测试)
- 新增 app/api、app/service 数据分析 Agent 全套服务与接口
- schemas.py 重构为 schemas 包(analyst schema)
- 新增 SQL 防注入、guardrail、缓存、字典、LLM 等服务
- 新增 tests 测试套件与 scripts/dev、scripts/setup 脚本
- 补充需求规格、架构说明书、开发清单、表设计等文档
2026-09-09 18:04:45 +08:00

50 lines
1.8 KiB
Python

"""cache_service 缓存单元测试(内存后端,无需 Redis)。"""
import time
import unittest
from app.service.cache_service import CacheService, InMemoryBackend
class TestCacheService(unittest.TestCase):
def setUp(self):
self.svc = CacheService(backend=InMemoryBackend())
def test_sql_hash_deterministic(self):
self.assertEqual(self.svc.sql_hash("SELECT 1"), self.svc.sql_hash("SELECT 1"))
self.assertNotEqual(self.svc.sql_hash("SELECT 1"), self.svc.sql_hash("SELECT 2"))
def test_permission_fingerprint_differs_by_scope(self):
a = self.svc.permission_fingerprint("S1", "assigned", ["CUST-1"])
b = self.svc.permission_fingerprint("S1", "assigned", ["CUST-2"])
self.assertNotEqual(a, b)
def test_ttl_layering(self):
self.assertEqual(self.svc.ttl_for(["core_trade"]), 5 * 60)
self.assertEqual(self.svc.ttl_for(["risk_alert"]), 60 * 60)
self.assertEqual(self.svc.ttl_for(["core_customer"]), 24 * 60 * 60)
def test_roundtrip(self):
fp = self.svc.permission_fingerprint("S1", "full")
sql = "SELECT COUNT(*) FROM core_customer"
self.assertIsNone(self.svc.get_result(fp, sql))
self.svc.set_result(fp, sql, {"cnt": 33}, ["core_customer"])
self.assertEqual(self.svc.get_result(fp, sql), {"cnt": 33})
def test_invalidate(self):
fp = self.svc.permission_fingerprint("S1", "full")
sql = "SELECT 1"
self.svc.set_result(fp, sql, {"x": 1}, ["core_customer"])
self.svc.invalidate_by_sql(fp, sql)
self.assertIsNone(self.svc.get_result(fp, sql))
def test_inmemory_expiry(self):
b = InMemoryBackend()
b.set("k", "v", ttl=1)
self.assertEqual(b.get("k"), "v")
time.sleep(1.2)
self.assertIsNone(b.get("k"))
if __name__ == "__main__":
unittest.main()