初始提交
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
from pathlib import Path
|
||||
|
||||
import typer
|
||||
from pytest import MonkeyPatch
|
||||
|
||||
from cli.completion.installers import (
|
||||
CompletionInstallerService,
|
||||
CompletionInstallerShellSupport,
|
||||
CompletionShellRuntimePolicy,
|
||||
CompletionShellRuntimePolicyRegistry,
|
||||
)
|
||||
|
||||
|
||||
def test_build_source_command_uses_shell_runtime_policy() -> None:
|
||||
"""
|
||||
校验安装服务会按 shell 运行时策略构建 source 命令。
|
||||
|
||||
:return: None
|
||||
"""
|
||||
installer = CompletionInstallerService()
|
||||
target_file = Path('/tmp/shierfeng-completion')
|
||||
|
||||
assert installer.build_source_command(target_file, 'bash') == 'source /tmp/shierfeng-completion'
|
||||
assert installer.build_source_command(target_file, 'zsh') == 'source /tmp/shierfeng-completion'
|
||||
assert (
|
||||
installer.build_source_command(target_file, 'fish')
|
||||
== 'status --is-interactive; and source /tmp/shierfeng-completion'
|
||||
)
|
||||
assert installer.build_source_command(target_file, 'powershell') == '. "/tmp/shierfeng-completion"'
|
||||
|
||||
|
||||
def test_make_bash_completion_script_compatible_wraps_legacy_instructions() -> None:
|
||||
"""
|
||||
校验 Bash 兼容转换会包装旧版 shell 不支持的指令。
|
||||
|
||||
:return: None
|
||||
"""
|
||||
script_text = 'compopt -o dirnames\ncompopt -o default\ncomplete -o nosort -F _shierfeng_completion shierfeng'
|
||||
|
||||
compatible_script = CompletionInstallerShellSupport.make_bash_completion_script_compatible(script_text)
|
||||
|
||||
assert 'if command -v compopt >/dev/null 2>&1; then' in compatible_script
|
||||
assert 'complete -F _shierfeng_completion shierfeng' in compatible_script
|
||||
assert 'complete -o nosort -F _shierfeng_completion shierfeng 2>/dev/null' in compatible_script
|
||||
|
||||
|
||||
def test_render_completion_script_uses_runtime_policy_transformer(monkeypatch: MonkeyPatch) -> None:
|
||||
"""
|
||||
校验脚本渲染会通过 shell 运行时策略执行脚本后处理。
|
||||
|
||||
:param monkeypatch: pytest monkeypatch 工具
|
||||
:return: None
|
||||
"""
|
||||
|
||||
class DummyComplete:
|
||||
"""
|
||||
模拟 Click completion 生成器。
|
||||
"""
|
||||
|
||||
def __init__(self, *args, **kwargs) -> None:
|
||||
"""
|
||||
初始化模拟生成器。
|
||||
|
||||
:param args: 位置参数
|
||||
:param kwargs: 关键字参数
|
||||
:return: None
|
||||
"""
|
||||
|
||||
@staticmethod
|
||||
def source() -> str:
|
||||
"""
|
||||
返回原始脚本文本。
|
||||
|
||||
:return: 原始脚本文本
|
||||
"""
|
||||
return 'raw-script'
|
||||
|
||||
runtime_policy_registry = CompletionShellRuntimePolicyRegistry(
|
||||
policies={
|
||||
'bash': CompletionShellRuntimePolicy(
|
||||
name='bash',
|
||||
click_completion_class=DummyComplete,
|
||||
script_transformer=lambda script_text: f'transformed::{script_text}',
|
||||
source_command_builder=lambda target_file: f'source {target_file}',
|
||||
)
|
||||
}
|
||||
)
|
||||
installer = CompletionInstallerService(shell_runtime_policy_registry=runtime_policy_registry)
|
||||
monkeypatch.setattr(installer, 'build_completion_click_command', lambda root_cli: object())
|
||||
|
||||
rendered_script = installer.render_completion_script(typer.Typer(), 'bash')
|
||||
|
||||
assert rendered_script == 'transformed::raw-script'
|
||||
|
||||
|
||||
def test_render_powershell_completion_script_contains_native_completer() -> None:
|
||||
"""
|
||||
校验 PowerShell completion 脚本会注册原生命令补全器。
|
||||
|
||||
:return: None
|
||||
"""
|
||||
installer = CompletionInstallerService()
|
||||
root_cli = typer.Typer()
|
||||
|
||||
@root_cli.command()
|
||||
def demo() -> None:
|
||||
return None
|
||||
|
||||
rendered_script = installer.render_completion_script(root_cli, 'powershell')
|
||||
|
||||
assert 'Register-ArgumentCompleter -Native -CommandName shierfeng' in rendered_script
|
||||
assert '$env:_SHIERFENG_COMPLETE = "powershell_complete"' in rendered_script
|
||||
Reference in New Issue
Block a user