diff --git a/tests/unit/test_cli.py b/tests/unit/test_cli.py new file mode 100644 index 0000000..80479af --- /dev/null +++ b/tests/unit/test_cli.py @@ -0,0 +1,109 @@ +import pytest +import tempfile +import os +from click.testing import CliRunner +from unittest.mock import patch, MagicMock +from pathlib import Path +from src.cli.main import cli, analyze, visualize, complexity, deps, export +from src.graph.builder import GraphBuilder, GraphType + + +class TestCLI: + def setup_method(self): + self.runner = CliRunner() + + def test_cli_help(self): + result = self.runner.invoke(cli, ["--help"]) + assert result.exit_code == 0 + assert "Usage:" in result.output + + @patch("src.cli.main._parse_files") + @patch("src.cli.main._get_parser") + def test_analyze_command(self, mock_get_parser, mock_parse_files): + mock_parser = MagicMock() + mock_get_parser.return_value = mock_parser + + mock_result = MagicMock() + mock_result.file_path = Path("/test.py") + mock_result.entities = [] + mock_result.imports = [] + mock_parse_files.return_value = [mock_result] + + mock_graph_builder = MagicMock() + mock_graph_builder.get_nodes.return_value = [] + + with patch("src.cli.main.GraphBuilder") as MockGraphBuilder: + MockGraphBuilder.return_value = mock_graph_builder + + with tempfile.TemporaryDirectory() as tmpdir: + result = self.runner.invoke(cli, ["analyze", tmpdir]) + + assert result.exit_code == 0 + + @patch("src.cli.main._parse_files") + @patch("src.cli.main._get_parser") + def test_visualize_command(self, mock_get_parser, mock_parse_files): + mock_parser = MagicMock() + mock_get_parser.return_value = mock_parser + + mock_result = MagicMock() + mock_result.file_path = Path("/test.py") + mock_result.entities = [] + mock_result.imports = [] + mock_parse_files.return_value = [mock_result] + + mock_graph_builder = MagicMock() + mock_graph_builder.get_nodes.return_value = [] + + with patch("src.cli.main.GraphBuilder") as MockGraphBuilder: + MockGraphBuilder.return_value = mock_graph_builder + + with tempfile.TemporaryDirectory() as tmpdir: + result = self.runner.invoke(visualize, [tmpdir]) + + assert result.exit_code == 0 + + @patch("src.cli.main._parse_files") + @patch("src.cli.main._get_parser") + def test_complexity_command(self, mock_get_parser, mock_parse_files): + mock_parser = MagicMock() + mock_get_parser.return_value = mock_parser + + mock_result = MagicMock() + mock_result.file_path = Path("/test.py") + mock_result.entities = [] + mock_result.imports = [] + mock_parse_files.return_value = [mock_result] + + with tempfile.TemporaryDirectory() as tmpdir: + result = self.runner.invoke(complexity, [tmpdir]) + + assert result.exit_code == 0 + + @patch("src.cli.main._parse_files") + @patch("src.cli.main._get_parser") + def test_deps_command(self, mock_get_parser, mock_parse_files): + mock_parser = MagicMock() + mock_get_parser.return_value = mock_parser + + mock_result = MagicMock() + mock_result.file_path = Path("/test.py") + mock_result.entities = [] + mock_result.imports = [] + mock_parse_files.return_value = [mock_result] + + mock_graph_builder = MagicMock() + mock_graph_builder.get_nodes.return_value = [] + mock_graph_builder.edges = [] + + with patch("src.cli.main.GraphBuilder") as MockGraphBuilder: + MockGraphBuilder.return_value = mock_graph_builder + + with tempfile.TemporaryDirectory() as tmpdir: + result = self.runner.invoke(deps, [tmpdir]) + + assert result.exit_code == 0 + + def test_verbose_flag(self): + result = self.runner.invoke(cli, ["--verbose", "--help"]) + assert result.exit_code == 0