ShiErFeng/shierfeng-fastapi-backend/tests/cli/runtime/test_config.py
2026-07-24 09:43:10 +08:00

211 lines
5.6 KiB
Python

import pytest
from cli.exit_codes import RUNTIME_ERROR
from cli.runtime.config import ConfigRuntimeService
from cli.runtime.config.gateway import ConfigInfrastructureGateway
from cli.runtime.config.support import ConfigDomainSupport
MISSING_CONFIG_KEY = 'sys.demo.key'
def test_config_domain_support_builds_missing_config_result() -> None:
"""
校验参数配置领域支持对象会生成统一的缺失结果。
:return: None
"""
support = ConfigDomainSupport(ConfigInfrastructureGateway())
payload = support.build_missing_config_result(MISSING_CONFIG_KEY, 'cache')
assert payload == {
'ok': False,
'message': f'参数缓存不存在:{MISSING_CONFIG_KEY}',
'source': 'cache',
'exit_code': RUNTIME_ERROR,
}
def test_config_domain_support_serializes_cache_payload_with_sanitizer() -> None:
"""
校验参数配置领域支持对象会对缓存配置做脱敏序列化。
:return: None
"""
class FakeSanitizer:
"""
模拟脱敏工具。
"""
@staticmethod
def sanitize_data(payload: dict[str, str]) -> dict[str, str]:
"""
返回带标记的脱敏结果。
:param payload: 原始载荷
:return: 脱敏结果
"""
return {**payload, 'sanitized': 'yes'}
gateway = ConfigInfrastructureGateway()
support = ConfigDomainSupport(gateway)
def _fake_get_log_sanitizer() -> FakeSanitizer:
return FakeSanitizer()
object.__setattr__(gateway, 'get_log_sanitizer', _fake_get_log_sanitizer)
payload = support.serialize_cache_payload(MISSING_CONFIG_KEY, 'demo-value')
assert payload == {
'configKey': MISSING_CONFIG_KEY,
'configValue': 'demo-value',
'sanitized': 'yes',
}
def test_config_runtime_service_builds_cli_config_model_from_orm_record() -> None:
"""
校验 CLI 会将 ORM 配置记录显式映射为可序列化的配置模型。
:return: None
"""
class FakeOrmConfigRecord:
"""
模拟 ORM 配置记录。
"""
config_id = 2
config_name = '用户管理-账号初始密码'
config_key = 'sys.user.initPassword'
config_value = '123456'
config_type = 'Y'
create_by = 'admin'
create_time = None
update_by = ''
update_time = None
remark = '初始化密码 123456'
class FakeConfigModel:
"""
模拟 VO 配置模型。
"""
def __init__(self, **kwargs: object) -> None:
self.kwargs = kwargs
class FakeConfigVoModule:
"""
模拟配置 VO 模块。
"""
ConfigModel = FakeConfigModel
model = ConfigRuntimeService.build_cli_config_model(FakeConfigVoModule, FakeOrmConfigRecord())
assert isinstance(model, FakeConfigModel)
assert model.kwargs == {
'configId': 2,
'configName': '用户管理-账号初始密码',
'configKey': 'sys.user.initPassword',
'configValue': '123456',
'configType': 'Y',
'createBy': 'admin',
'createTime': None,
'updateBy': '',
'updateTime': None,
'remark': '初始化密码 123456',
}
@pytest.mark.asyncio
async def test_config_runtime_service_returns_missing_db_config_result() -> None:
"""
校验参数配置运行时在数据库中未找到配置时会返回统一结果。
:return: None
"""
class FakeSession:
"""
模拟异步会话。
"""
async def __aenter__(self) -> 'FakeSession':
return self
async def __aexit__(
self,
exc_type: type[BaseException] | None,
exc: BaseException | None,
tb: object,
) -> None:
del exc_type, exc, tb
class FakeSessionFactory:
"""
模拟异步会话工厂。
"""
def __call__(self) -> FakeSession:
return FakeSession()
class FakeConfigModel:
"""
模拟配置模型。
"""
def __init__(self, **kwargs: str) -> None:
self.kwargs = kwargs
class FakeConfigVoModule:
"""
模拟配置 VO 模块。
"""
ConfigModel = FakeConfigModel
class FakeConfigDao:
"""
模拟配置 DAO。
"""
@staticmethod
async def get_config_detail_by_info(session: FakeSession, config_model: FakeConfigModel) -> None:
"""
返回空结果。
:param session: 数据库会话
:param config_model: 配置模型
:return: None
"""
assert isinstance(session, FakeSession)
assert config_model.kwargs == {'configKey': MISSING_CONFIG_KEY}
gateway = ConfigInfrastructureGateway()
service = ConfigRuntimeService(infrastructure_gateway=gateway)
def _fake_get_async_session_local() -> FakeSessionFactory:
return FakeSessionFactory()
def _fake_get_config_dao() -> FakeConfigDao:
return FakeConfigDao()
def _fake_get_config_vo_module() -> FakeConfigVoModule:
return FakeConfigVoModule()
object.__setattr__(gateway, 'get_async_session_local', _fake_get_async_session_local)
object.__setattr__(gateway, 'get_config_dao', _fake_get_config_dao)
object.__setattr__(gateway, 'get_config_vo_module', _fake_get_config_vo_module)
payload = await service.get_config(MISSING_CONFIG_KEY, source='db')
assert payload == {
'ok': False,
'message': f'参数配置不存在:{MISSING_CONFIG_KEY}',
'source': 'db',
'exit_code': RUNTIME_ERROR,
}