From 6aa38073dc3c93fd72870bbfc4c18771f414c6ec Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Mon, 2 Feb 2026 18:27:19 +0000 Subject: [PATCH] Initial upload with CI/CD workflow --- tests/test_cli.py | 107 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 tests/test_cli.py diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..96fe396 --- /dev/null +++ b/tests/test_cli.py @@ -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