This commit is contained in:
107
tests/test_cli.py
Normal file
107
tests/test_cli.py
Normal file
@@ -0,0 +1,107 @@
|
||||
"""Tests for the CLI interface."""
|
||||
|
||||
from unittest.mock import patch, MagicMock
|
||||
|
||||
import pytest
|
||||
from click.testing import CliRunner
|
||||
|
||||
from src.cli import main, presets, cache, version
|
||||
|
||||
|
||||
class TestCLIBasic:
|
||||
"""Tests for basic CLI commands."""
|
||||
|
||||
@pytest.fixture
|
||||
def runner(self):
|
||||
"""Create a CLI runner."""
|
||||
return CliRunner()
|
||||
|
||||
def test_main_help(self, runner):
|
||||
"""Test main command help."""
|
||||
result = runner.invoke(main, ["--help"])
|
||||
|
||||
assert result.exit_code == 0
|
||||
assert "Search GitHub repositories by code patterns" in result.output
|
||||
|
||||
def test_version_command(self, runner):
|
||||
"""Test version command."""
|
||||
result = runner.invoke(version)
|
||||
|
||||
assert result.exit_code == 0
|
||||
assert "Code Pattern Search CLI" in result.output
|
||||
|
||||
def test_presets_command(self, runner):
|
||||
"""Test presets command."""
|
||||
result = runner.invoke(presets)
|
||||
|
||||
assert result.exit_code == 0
|
||||
assert "Available Presets" in result.output
|
||||
|
||||
def test_presets_list_content(self, runner):
|
||||
"""Test that presets are listed."""
|
||||
result = runner.invoke(presets)
|
||||
|
||||
assert "python-dataclass" in result.output
|
||||
assert "react-useeffect" in result.output
|
||||
|
||||
def test_cache_clear(self, runner):
|
||||
"""Test cache clear command."""
|
||||
with patch("src.cli.CacheManager") as mock_cache:
|
||||
mock_instance = MagicMock()
|
||||
mock_cache.return_value = mock_instance
|
||||
|
||||
result = runner.invoke(cache, ["--clear"])
|
||||
|
||||
assert result.exit_code == 0
|
||||
mock_instance.clear.assert_called_once()
|
||||
|
||||
def test_cache_show_stats(self, runner):
|
||||
"""Test cache show stats."""
|
||||
with patch("src.cli.CacheManager") as mock_cache:
|
||||
mock_instance = MagicMock()
|
||||
mock_instance.get_stats.return_value = {
|
||||
"size": 10,
|
||||
"hits": 100,
|
||||
"misses": 5,
|
||||
"cache_size_mb": 1.5,
|
||||
}
|
||||
mock_cache.return_value = mock_instance
|
||||
|
||||
result = runner.invoke(cache)
|
||||
|
||||
assert result.exit_code == 0
|
||||
assert "10" in result.output
|
||||
|
||||
|
||||
class TestSearchCommandValidation:
|
||||
"""Tests for search command validation."""
|
||||
|
||||
@pytest.fixture
|
||||
def runner(self):
|
||||
"""Create a CLI runner."""
|
||||
return CliRunner()
|
||||
|
||||
def test_search_requires_pattern(self, runner):
|
||||
"""Test that search requires a pattern."""
|
||||
result = runner.invoke(main, ["search"])
|
||||
|
||||
assert result.exit_code != 0
|
||||
|
||||
def test_search_with_invalid_regex(self, runner):
|
||||
"""Test search with invalid regex pattern - handles gracefully."""
|
||||
result = runner.invoke(main, ["search", r"def\w+", "--repos", "1"])
|
||||
|
||||
assert result.exit_code == 0
|
||||
|
||||
def test_search_with_unknown_preset(self, runner):
|
||||
"""Test search with unknown preset shows error."""
|
||||
result = runner.invoke(main, ["search", "--preset", "nonexistent_preset_xyz"])
|
||||
|
||||
assert result.exit_code == 1
|
||||
assert "Unknown preset" in result.output
|
||||
|
||||
def test_search_with_valid_preset(self, runner):
|
||||
"""Test search with valid preset pattern - should run without error."""
|
||||
result = runner.invoke(main, ["search", "--preset", "python-dataclass", "--repos", "1"])
|
||||
|
||||
assert result.exit_code == 0
|
||||
Reference in New Issue
Block a user