Files
flow/tests/test_cli.py
2026-05-14 16:19:15 +03:00

151 lines
4.4 KiB
Python

"""Tests for CLI."""
import os
import subprocess
import sys
from typer.testing import CliRunner
from flow.cli import app
runner = CliRunner()
def test_typer_runner_version():
result = runner.invoke(app, ["--version"])
assert result.exit_code == 0
assert "flow" in result.stdout
def test_version_flag():
"""Test --version flag works."""
result = subprocess.run(
[sys.executable, "-m", "flow", "--version"],
capture_output=True, text=True,
)
assert result.returncode == 0
assert "flow" in result.stdout
def test_help_flag():
"""Test --help shows commands."""
result = subprocess.run(
[sys.executable, "-m", "flow", "--help"],
capture_output=True, text=True,
)
assert result.returncode == 0
assert "dotfiles" in result.stdout
assert "packages" in result.stdout
assert "setup" in result.stdout
def test_short_help_flag():
"""Test -h shows commands."""
result = subprocess.run(
[sys.executable, "-m", "flow", "-h"],
capture_output=True, text=True,
)
assert result.returncode == 0
assert "dotfiles" in result.stdout
assert "packages" in result.stdout
assert "setup" in result.stdout
def test_help_groups_aliases():
result = subprocess.run(
[sys.executable, "-m", "flow", "--help"],
capture_output=True,
text=True,
)
assert result.returncode == 0
lines = [line for line in result.stdout.splitlines() if "" in line]
dotfiles_line = next(line for line in lines if "dotfiles" in line and "dot" in line)
assert "dotfiles, dot" in dotfiles_line
assert next(line for line in lines if "packages" in line and "package" in line).startswith("")
packages_line = next(line for line in lines if "packages" in line and "pkg" in line)
assert "packages, package, pkg" in packages_line
setup_line = next(line for line in lines if "setup" in line and "bootstrap" in line)
assert "setup, bootstrap, provision" in setup_line
projects_line = next(line for line in lines if "projects" in line and "project" in line)
assert "projects, project" in projects_line
def test_no_color_flag():
"""Test --no-color flag is accepted."""
result = subprocess.run(
[sys.executable, "-m", "flow", "--no-color", "--help"],
capture_output=True, text=True,
)
assert result.returncode == 0
def test_dotfiles_help():
result = subprocess.run(
[sys.executable, "-m", "flow", "dotfiles", "--help"],
capture_output=True, text=True,
)
assert result.returncode == 0
assert "link" in result.stdout
assert "unlink" in result.stdout
# Removed commands should not appear
assert "relink" not in result.stdout
assert "undo" not in result.stdout
assert "clean" not in result.stdout
assert "sync" not in result.stdout
assert "modules" not in result.stdout
repos_lines = [line for line in result.stdout.splitlines() if "repos" in line]
assert len(repos_lines) == 1
assert "repos, repo" in repos_lines[0]
def test_packages_help():
result = subprocess.run(
[sys.executable, "-m", "flow", "packages", "--help"],
capture_output=True, text=True,
)
assert result.returncode == 0
assert "install" in result.stdout
def test_invalid_config_is_reported_without_traceback(tmp_path):
config_root = tmp_path / "config"
(config_root / "flow").mkdir(parents=True)
(config_root / "flow" / "config.yaml").write_text(":\n bad\n")
env = dict(os.environ)
env["XDG_CONFIG_HOME"] = str(config_root)
result = subprocess.run(
[sys.executable, "-m", "flow", "completion"],
capture_output=True,
text=True,
env=env,
)
assert result.returncode == 1
assert "Invalid YAML" in result.stderr
assert "Traceback" not in result.stderr
def test_local_manifest_is_loaded(tmp_path):
config_root = tmp_path / "config"
flow_dir = config_root / "flow"
flow_dir.mkdir(parents=True)
(flow_dir / "manifest.yaml").write_text(
"profiles:\n"
" demo:\n"
" os: linux\n"
)
env = dict(os.environ)
env["XDG_CONFIG_HOME"] = str(config_root)
result = subprocess.run(
[sys.executable, "-m", "flow", "setup", "list"],
capture_output=True,
text=True,
env=env,
)
assert result.returncode == 0
assert "demo" in result.stdout