|
|
|
|
@ -40,6 +40,11 @@ def patch_lifespan_deps():
|
|
|
|
|
for p in patches:
|
|
|
|
|
p.stop()
|
|
|
|
|
|
|
|
|
|
# 清理 StorageManager 全局单例,避免测试间状态泄漏
|
|
|
|
|
import app.storage_manager as _sm_module
|
|
|
|
|
|
|
|
|
|
_sm_module._storage_manager = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
|
|
|
async def test_lifespan_calls_redis_and_mysql_init(patch_lifespan_deps, caplog):
|
|
|
|
|
@ -145,3 +150,36 @@ async def test_lifespan_storage_init_failure_does_not_raise(patch_lifespan_deps,
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
assert "存储模式: SQLite (Redis 和 MySQL 均不可用)" in caplog.text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_storage_manager_initialize_accepts_clients_and_updates_references():
|
|
|
|
|
"""initialize 应可选接收 redis_client 和 mysql_engine 并更新内部引用。"""
|
|
|
|
|
from app.storage_manager import StorageManager
|
|
|
|
|
|
|
|
|
|
manager = StorageManager(redis_client=None, mysql_engine=None)
|
|
|
|
|
fake_redis = MagicMock()
|
|
|
|
|
fake_mysql = MagicMock()
|
|
|
|
|
|
|
|
|
|
manager.initialize(redis_client=fake_redis, mysql_engine=fake_mysql)
|
|
|
|
|
|
|
|
|
|
assert manager.redis_client is fake_redis
|
|
|
|
|
assert manager.mysql_engine is fake_mysql
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
|
|
|
async def test_lifespan_injects_redis_and_mysql_into_storage_manager(patch_lifespan_deps):
|
|
|
|
|
"""lifespan 初始化后应将 Redis/MySQL 客户端注入 StorageManager 单例。"""
|
|
|
|
|
from app.main import lifespan, app
|
|
|
|
|
from app.storage_manager import StorageManager
|
|
|
|
|
|
|
|
|
|
fake_redis = MagicMock()
|
|
|
|
|
fake_mysql = MagicMock()
|
|
|
|
|
patch_lifespan_deps["init_redis"].return_value = fake_redis
|
|
|
|
|
patch_lifespan_deps["init_mysql"].return_value = fake_mysql
|
|
|
|
|
|
|
|
|
|
mock_manager = MagicMock(spec=StorageManager)
|
|
|
|
|
with patch("app.storage_manager.get_storage_manager", return_value=mock_manager):
|
|
|
|
|
async with lifespan(app):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
mock_manager.initialize.assert_called_once_with(fake_redis, fake_mysql)
|
|
|
|
|
|