"""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()