From 4a5c9744c2db8ea173bbcc9eb9361d3c6a0af4ad Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Sun, 1 Feb 2026 19:31:09 +0000 Subject: [PATCH] Initial upload: Git AI Documentation Generator v0.1.0 --- tests/test_commands.py | 141 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 tests/test_commands.py diff --git a/tests/test_commands.py b/tests/test_commands.py new file mode 100644 index 0000000..e844ba6 --- /dev/null +++ b/tests/test_commands.py @@ -0,0 +1,141 @@ +"""Tests for CLI commands.""" + +from unittest.mock import Mock, patch, MagicMock + +import pytest +from click.testing import CliRunner + +from src.cli import main +from src.commands.commit import commit +from src.commands.changelog import changelog +from src.commands.api_docs import api_docs +from src.config import Config + + +class TestCommitCommand: + """Tests for the commit command.""" + + @pytest.fixture + def runner(self): + """Create a CLI runner.""" + return CliRunner() + + @pytest.fixture + def mock_ollama_client(self): + """Create a mock Ollama client.""" + with patch("src.commands.commit.OllamaClient") as mock: + mock_instance = Mock() + mock.return_value = mock_instance + mock_instance.connect_with_retry.return_value = True + mock_instance.generate_commit_message.return_value = "feat: new feature" + yield mock_instance + + def test_commit_command_with_staged_changes(self, runner, mock_ollama_client): + """Test commit command with staged changes.""" + with patch("src.commands.commit.get_repo") as mock_get_repo: + mock_repo = Mock() + mock_get_repo.return_value = mock_repo + mock_repo.index.diff.return_value = [] + + with patch("src.commands.commit.get_staged_diff") as mock_staged: + mock_staged.return_value = "diff content" + + result = runner.invoke(commit, ["--staged"], obj={"config": Config()}) + assert result.exit_code == 0 + + def test_commit_command_no_changes(self, runner, mock_ollama_client): + """Test commit command with no changes.""" + with patch("src.commands.commit.get_repo") as mock_get_repo: + mock_repo = Mock() + mock_get_repo.return_value = mock_repo + + with patch("src.commands.commit.get_staged_diff") as mock_staged: + mock_staged.return_value = "" + + result = runner.invoke(commit, ["--staged"], obj={"config": Config()}) + assert "No staged changes" in result.output + + +class TestChangelogCommand: + """Tests for the changelog command.""" + + @pytest.fixture + def runner(self): + """Create a CLI runner.""" + return CliRunner() + + @pytest.fixture + def mock_ollama_client(self): + """Create a mock Ollama client.""" + with patch("src.commands.changelog.OllamaClient") as mock: + mock_instance = Mock() + mock.return_value = mock_instance + mock_instance.connect_with_retry.return_value = True + mock_instance.generate_changelog.return_value = "# Changelog\n\n## Features\n- New feature" + yield mock_instance + + def test_changelog_command(self, runner, mock_ollama_client): + """Test changelog command.""" + with patch("src.commands.changelog.get_repo") as mock_get_repo: + mock_repo = Mock() + mock_get_repo.return_value = mock_repo + mock_repo.iter_commits.return_value = [] + + result = runner.invoke(changelog, ["--from", "v1.0.0"], obj={"config": Config()}) + assert result.exit_code == 0 + + +class TestApiDocsCommand: + """Tests for the api-docs command.""" + + @pytest.fixture + def runner(self): + """Create a CLI runner.""" + return CliRunner() + + @pytest.fixture + def mock_ollama_client(self): + """Create a mock Ollama client.""" + with patch("src.commands.api_docs.OllamaClient") as mock: + mock_instance = Mock() + mock.return_value = mock_instance + mock_instance.connect_with_retry.return_value = True + mock_instance.generate_api_docs.return_value = "# API Documentation\n\n## GET /users" + yield mock_instance + + def test_api_docs_command(self, runner, mock_ollama_client): + """Test API docs command.""" + with patch("src.commands.api_docs.get_repo") as mock_get_repo: + mock_repo = Mock() + mock_get_repo.return_value = mock_repo + + with patch("src.commands.api_docs.get_unstaged_diff") as mock_diff: + mock_diff.return_value = "diff --git a/api.py b/api.py\n+def new_endpoint()" + + result = runner.invoke(api_docs, ["--all"], obj={"config": Config()}) + assert result.exit_code == 0 + + +class TestMainCLI: + """Tests for the main CLI.""" + + @pytest.fixture + def runner(self): + """Create a CLI runner.""" + return CliRunner() + + def test_version_command(self, runner): + """Test version command.""" + with patch("src.cli.load_config") as mock_load: + mock_load.return_value = Config() + result = runner.invoke(main, ["version"]) + assert result.exit_code == 0 + assert "Git AI Documentation Generator" in result.output + + def test_help_command(self, runner): + """Test help command.""" + result = runner.invoke(main, ["--help"]) + assert result.exit_code == 0 + assert "commit" in result.output + assert "changelog" in result.output + assert "api-docs" in result.output