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