Files
flow/tests/test_completion.py

117 lines
3.4 KiB
Python

"""Tests for zsh completion."""
import subprocess
from flow.app.completion import complete, install_zsh_completion
from flow.core import paths
from flow.core.config import AppConfig, FlowContext
from flow.core.console import Console
from flow.core.platform import PlatformInfo
from flow.core.runtime import SystemRuntime
def _make_ctx():
return FlowContext(
config=AppConfig(),
manifest={},
platform=PlatformInfo(),
console=Console(color=False),
runtime=SystemRuntime(),
)
def test_complete_top_level():
result = complete(_make_ctx(), ["flow", ""], 1)
assert "dotfiles" in result
assert "packages" in result
assert "setup" in result
assert "remote" in result
assert "dev" in result
assert "projects" in result
def test_complete_top_level_prefix():
result = complete(_make_ctx(), ["flow", "do"], 1)
assert result == ["dotfiles"]
def test_complete_dotfiles_subcommands():
result = complete(_make_ctx(), ["flow", "dotfiles", ""], 2)
assert "link" in result
assert "unlink" in result
assert "status" in result
assert "edit" in result
assert "repos" in result
# Removed commands should not appear
assert "sync" not in result
assert "relink" not in result
assert "undo" not in result
assert "clean" not in result
assert "modules" not in result
def test_complete_dotfiles_repos_subcommands():
result = complete(_make_ctx(), ["flow", "dotfiles", "repos", ""], 3)
assert "list" in result
assert "status" in result
assert "pull" in result
assert "push" in result
def test_complete_dotfiles_repos_pull_flags():
result = complete(_make_ctx(), ["flow", "dotfiles", "repos", "pull", "--"], 4)
assert "--repo" in result
assert "--dry-run" in result
def test_complete_dotfiles_edit_packages():
result = complete(_make_ctx(), ["flow", "dotfiles", "edit", "--"], 3)
assert "--no-commit" in result
def test_complete_dotfiles_link_flags():
result = complete(_make_ctx(), ["flow", "dotfiles", "link", "--"], 3)
assert "--profile" in result
assert "--dry-run" in result
def test_complete_unknown_command():
result = complete(_make_ctx(), ["flow", "unknown", ""], 2)
assert result == []
def test_complete_packages_subcommands():
result = complete(_make_ctx(), ["flow", "packages", ""], 2)
assert "install" in result
assert "remove" in result
assert "list" in result
def test_complete_dev_attach_returns_empty_on_timeout():
ctx = _make_ctx()
def fake_ps(**kwargs):
assert kwargs["timeout"] == 1.0
raise subprocess.TimeoutExpired("docker ps", kwargs["timeout"])
ctx.runtime.containers.ps = fake_ps # type: ignore[method-assign]
result = complete(ctx, ["flow", "dev", "attach", ""], 3)
assert result == []
def test_install_zsh_completion_uses_action_runtime(tmp_path, monkeypatch):
monkeypatch.setattr(paths, "HOME", tmp_path)
monkeypatch.setattr(paths, "STATE_DIR", tmp_path / "state")
ctx = _make_ctx()
completion_file = install_zsh_completion(
ctx,
directory=str(tmp_path / "completions"),
rc=str(tmp_path / ".zshrc"),
)
assert completion_file == tmp_path / "completions" / "_flow"
assert "compdef _flow flow" in completion_file.read_text()
assert "# >>> flow completion >>>" in (tmp_path / ".zshrc").read_text()
assert (tmp_path / "state" / "actions.jsonl").exists()