Files

201 lines
6.2 KiB
Python

"""Tests for CLI interface."""
import json
import tempfile
from click.testing import CliRunner
from repohealth.cli.cli import analyze, health, main, report
class TestCLI:
"""Tests for CLI commands."""
def test_main_help(self):
"""Test main command help."""
runner = CliRunner()
result = runner.invoke(main, ["--help"])
assert result.exit_code == 0
assert "RepoHealth CLI" in result.output
assert "analyze" in result.output
assert "report" in result.output
assert "health" in result.output
def test_analyze_help(self):
"""Test analyze command help."""
runner = CliRunner()
result = runner.invoke(analyze, ["--help"])
assert result.exit_code == 0
assert "--depth" in result.output
assert "--path" in result.output
assert "--extensions" in result.output
assert "--json" in result.output
def test_report_help(self):
"""Test report command help."""
runner = CliRunner()
result = runner.invoke(report, ["--help"])
assert result.exit_code == 0
assert "--format" in result.output
assert "--output" in result.output
def test_health_help(self):
"""Test health command help."""
runner = CliRunner()
result = runner.invoke(health, ["--help"])
assert result.exit_code == 0
def test_analyze_invalid_repo(self):
"""Test analyze with invalid repository path."""
runner = CliRunner()
result = runner.invoke(analyze, ["/nonexistent/path"])
assert result.exit_code != 0
assert "not a valid Git repository" in result.output
def test_health_invalid_repo(self):
"""Test health with invalid repository path."""
runner = CliRunner()
result = runner.invoke(health, ["/nonexistent/path"])
assert result.exit_code != 0
def test_analyze_negative_depth(self):
"""Test analyze with negative depth option."""
runner = CliRunner()
with tempfile.TemporaryDirectory() as tmpdir:
result = runner.invoke(analyze, [tmpdir, "--depth", "-5"])
assert result.exit_code != 0
assert "positive integer" in result.output
def test_analyze_json_output(self, sample_git_repo, temp_dir):
"""Test analyze with JSON output."""
runner = CliRunner()
result = runner.invoke(analyze, [str(sample_git_repo), "--json"])
assert result.exit_code == 0
output = json.loads(result.output)
assert "repository" in output
assert "summary" in output
assert "files" in output
def test_analyze_json_to_file(self, sample_git_repo, temp_dir):
"""Test analyze saving JSON to file."""
runner = CliRunner()
output_file = temp_dir / "output.json"
result = runner.invoke(
analyze,
[str(sample_git_repo), "--output", str(output_file)]
)
assert result.exit_code == 0
assert output_file.exists()
content = json.loads(output_file.read_text())
assert "repository" in content
def test_report_html_output(self, sample_git_repo, temp_dir):
"""Test report generating HTML output."""
runner = CliRunner()
output_file = temp_dir / "report.html"
result = runner.invoke(
report,
[str(sample_git_repo), "--format", "html", "--output", str(output_file)]
)
assert result.exit_code == 0
assert output_file.exists()
html_content = output_file.read_text()
assert "<html>" in html_content
assert "Repository Health Report" in html_content
def test_health_display(self, sample_git_repo):
"""Test health command display output."""
runner = CliRunner()
result = runner.invoke(health, [str(sample_git_repo)])
assert result.exit_code == 0
assert "Repository Health" in result.output or "Bus Factor" in result.output
def test_analyze_with_extensions(self, sample_git_repo):
"""Test analyze with file extension filter."""
runner = CliRunner()
result = runner.invoke(
analyze,
[str(sample_git_repo), "--extensions", "py", "--json"]
)
assert result.exit_code == 0
output = json.loads(result.output)
assert output["files_analyzed"] >= 0
def test_analyze_with_depth(self, sample_git_repo):
"""Test analyze with commit depth limit."""
runner = CliRunner()
result = runner.invoke(
analyze,
[str(sample_git_repo), "--depth", "2", "--json"]
)
assert result.exit_code == 0
output = json.loads(result.output)
assert "files_analyzed" in output
class TestRepoHealthCLI:
"""Unit tests for RepoHealthCLI class."""
def test_cli_initialization(self):
"""Test CLI class initialization."""
from repohealth.cli.cli import RepoHealthCLI
cli = RepoHealthCLI()
assert cli.terminal_reporter is not None
assert cli.json_reporter is not None
assert cli.html_reporter is not None
def test_analyze_repository_result_structure(self, sample_git_repo):
"""Test that analyze produces valid result structure."""
from repohealth.cli.cli import RepoHealthCLI
cli = RepoHealthCLI()
result = cli.analyze_repository(str(sample_git_repo))
assert result.repository_path is not None
assert isinstance(result.files_analyzed, int)
assert isinstance(result.total_commits, int)
assert isinstance(result.unique_authors, int)
assert isinstance(result.overall_bus_factor, float)
assert result.files is not None
assert result.risk_summary is not None
def test_analyze_repository_min_commits(self, sample_git_repo):
"""Test analyze with min_commits filter."""
from repohealth.cli.cli import RepoHealthCLI
cli = RepoHealthCLI()
result_all = cli.analyze_repository(
str(sample_git_repo),
min_commits=1
)
result_filtered = cli.analyze_repository(
str(sample_git_repo),
min_commits=100
)
assert result_all.files_analyzed >= result_filtered.files_analyzed