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

127 lines
3.7 KiB
Python

from cli.exit_codes import DEPENDENCY_ERROR
from cli.runtime.base import RuntimeEnvironmentService
from cli.runtime.dev import DevelopmentRuntimeService
from cli.runtime.dev.gateway import DevelopmentProcessGateway
from cli.runtime.dev.support import DevelopmentCommandSupport, DevelopmentToolingSupport
class FakeRuntimeEnvironment(RuntimeEnvironmentService):
"""
模拟运行时环境服务。
"""
@staticmethod
def get_backend_dir() -> str:
"""
返回固定后端目录。
:return: 固定目录
"""
return '/tmp/shierfeng-backend'
@staticmethod
def get_python_executable() -> str:
"""
返回固定 Python 可执行文件。
:return: Python 可执行文件路径
"""
return '/usr/bin/python3'
def test_development_runtime_service_returns_dependency_error_when_pytest_missing() -> None:
"""
校验开发运行时在 pytest 缺失时会返回依赖错误结果。
:return: None
"""
class FakeToolingSupport(DevelopmentToolingSupport):
"""
模拟开发工具支持对象。
"""
@staticmethod
def is_pytest_available() -> bool:
"""
返回 pytest 不可用状态。
:return: False
"""
return False
service = DevelopmentRuntimeService(
runtime_environment=FakeRuntimeEnvironment(),
tooling_support=FakeToolingSupport(),
)
payload = service.run_tests(['tests/cli'])
assert payload == {
'ok': False,
'message': 'pytest 未安装,无法执行 dev test',
'hint': '请在当前环境安装 pytest 后重试',
'exit_code': DEPENDENCY_ERROR,
}
def test_development_runtime_service_run_lint_uses_command_support() -> None:
"""
校验开发运行时会通过命令支持对象串联 format/check 执行流程。
:return: None
"""
class FakeCommandSupport(DevelopmentCommandSupport):
"""
模拟开发命令支持对象。
"""
def __init__(self) -> None:
self.recorded_commands: list[list[str]] = []
def build_format_command(self, normalized_targets: list[str], *, check_only: bool) -> list[str]:
assert normalized_targets == ['tests/cli']
assert check_only is True
return ['format-command']
def build_check_command(
self,
normalized_targets: list[str],
*,
check_only: bool,
fix: bool,
unsafe_fixes: bool,
) -> list[str]:
assert normalized_targets == ['tests/cli']
assert check_only is True
assert fix is False
assert unsafe_fixes is False
return ['check-command']
class FakeProcessGateway(DevelopmentProcessGateway):
"""
模拟开发子进程执行网关。
"""
def __init__(self) -> None:
self.recorded_commands: list[list[str]] = []
def run_command(self, command: list[str]) -> dict[str, object]:
self.recorded_commands.append(command)
return {'ok': True, 'command': command, 'returnCode': 0}
command_support = FakeCommandSupport()
process_gateway = FakeProcessGateway()
service = DevelopmentRuntimeService(
runtime_environment=FakeRuntimeEnvironment(),
command_support=command_support,
process_gateway=process_gateway,
)
payload = service.run_lint(['tests/cli'], check_only=True)
assert payload['ok'] is True
assert payload['targets'] == ['tests/cli']
assert process_gateway.recorded_commands == [['format-command'], ['check-command']]