131 lines
4.3 KiB
Python
131 lines
4.3 KiB
Python
"""Tests for flow.commands.completion dynamic suggestions."""
|
|
|
|
from flow.commands import completion
|
|
|
|
|
|
def test_complete_top_level_prefix():
|
|
out = completion.complete(["flow", "do"], 2)
|
|
assert "dotfiles" in out
|
|
assert "dot" in out
|
|
|
|
|
|
def test_complete_bootstrap_profiles(monkeypatch):
|
|
monkeypatch.setattr(completion, "_list_bootstrap_profiles", lambda: ["linux-vm", "macos-host"])
|
|
out = completion.complete(["flow", "bootstrap", "show", "li"], 4)
|
|
assert out == ["linux-vm"]
|
|
|
|
|
|
def test_complete_bootstrap_packages_options(monkeypatch):
|
|
monkeypatch.setattr(completion, "_list_bootstrap_profiles", lambda: ["linux-vm", "macos-host"])
|
|
out = completion.complete(["flow", "bootstrap", "packages", "--p"], 4)
|
|
assert out == ["--profile"]
|
|
|
|
out = completion.complete(["flow", "bootstrap", "packages", "--profile", "m"], 5)
|
|
assert out == ["macos-host"]
|
|
|
|
|
|
def test_complete_package_install(monkeypatch):
|
|
monkeypatch.setattr(completion, "_list_manifest_packages", lambda: ["neovim", "fzf"])
|
|
out = completion.complete(["flow", "package", "install", "n"], 4)
|
|
assert out == ["neovim"]
|
|
|
|
|
|
def test_complete_package_remove(monkeypatch):
|
|
monkeypatch.setattr(completion, "_list_installed_packages", lambda: ["hello", "jq"])
|
|
out = completion.complete(["flow", "package", "remove", "h"], 4)
|
|
assert out == ["hello"]
|
|
|
|
|
|
def test_list_manifest_packages_is_consistent_for_list_and_dict_forms(monkeypatch):
|
|
manifests = [
|
|
{
|
|
"packages": [
|
|
{"name": "neovim", "type": "binary"},
|
|
{"name": "ripgrep", "type": "pkg"},
|
|
{"name": "fzf", "type": "binary"},
|
|
]
|
|
},
|
|
{
|
|
"packages": {
|
|
"neovim": {"type": "binary"},
|
|
"ripgrep": {"type": "pkg"},
|
|
"fzf": {"type": "binary"},
|
|
}
|
|
},
|
|
]
|
|
|
|
monkeypatch.setattr(completion, "_safe_manifest", lambda: manifests.pop(0))
|
|
|
|
from_list = completion._list_manifest_packages()
|
|
from_dict = completion._list_manifest_packages()
|
|
|
|
assert from_list == ["fzf", "neovim"]
|
|
assert from_dict == ["fzf", "neovim"]
|
|
|
|
|
|
def test_list_manifest_packages_uses_mapping_key_when_name_missing(monkeypatch):
|
|
monkeypatch.setattr(
|
|
completion,
|
|
"_safe_manifest",
|
|
lambda: {"packages": {"bat": {"type": "binary"}, "git": {"type": "pkg"}}},
|
|
)
|
|
|
|
assert completion._list_manifest_packages() == ["bat"]
|
|
|
|
|
|
def test_complete_dotfiles_profile_value(monkeypatch):
|
|
monkeypatch.setattr(completion, "_list_dotfiles_profiles", lambda: ["work", "personal"])
|
|
out = completion.complete(["flow", "dotfiles", "link", "--profile", "w"], 5)
|
|
assert out == ["work"]
|
|
|
|
|
|
def test_complete_dotfiles_repo_subcommands():
|
|
out = completion.complete(["flow", "dotfiles", "repo", "p"], 4)
|
|
assert out == ["pull", "push"]
|
|
|
|
|
|
def test_complete_dotfiles_top_level_includes_undo():
|
|
out = completion.complete(["flow", "dotfiles", "u"], 3)
|
|
assert out == ["undo", "unlink"]
|
|
|
|
|
|
def test_complete_dotfiles_modules_subcommands():
|
|
out = completion.complete(["flow", "dotfiles", "modules", "s"], 4)
|
|
assert out == ["sync"]
|
|
|
|
|
|
def test_complete_dotfiles_modules_profile_value(monkeypatch):
|
|
monkeypatch.setattr(completion, "_list_dotfiles_profiles", lambda: ["work", "personal"])
|
|
out = completion.complete(["flow", "dotfiles", "modules", "list", "--profile", "w"], 6)
|
|
assert out == ["work"]
|
|
|
|
|
|
def test_complete_enter_targets(monkeypatch):
|
|
monkeypatch.setattr(completion, "_list_targets", lambda: ["personal@orb", "work@ec2"])
|
|
out = completion.complete(["flow", "enter", "p"], 3)
|
|
assert out == ["personal@orb"]
|
|
|
|
|
|
def test_complete_dev_subcommands():
|
|
out = completion.complete(["flow", "dev", "c"], 3)
|
|
assert out == ["connect", "create"]
|
|
|
|
|
|
def test_complete_completion_subcommands():
|
|
out = completion.complete(["flow", "completion", "i"], 3)
|
|
assert out == ["install-zsh"]
|
|
|
|
|
|
def test_rc_snippet_is_idempotent(tmp_path):
|
|
rc_path = tmp_path / ".zshrc"
|
|
completion_dir = tmp_path / "completions"
|
|
|
|
first = completion._ensure_rc_snippet(rc_path, completion_dir)
|
|
second = completion._ensure_rc_snippet(rc_path, completion_dir)
|
|
|
|
assert first is True
|
|
assert second is False
|
|
text = rc_path.read_text()
|
|
assert text.count(completion.ZSH_RC_START) == 1
|
|
assert text.count(completion.ZSH_RC_END) == 1
|