127 lines
3.7 KiB
Python
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']]
|