Initial upload: Git AI Documentation Generator v0.1.0
Some checks failed
CI / test (push) Has been cancelled
Some checks failed
CI / test (push) Has been cancelled
This commit is contained in:
141
tests/test_commands.py
Normal file
141
tests/test_commands.py
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user