"""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