Files
python-mcp/tests/test_code_analysis.py
2026-06-03 04:46:51 -05:00

83 lines
2.8 KiB
Python

from __future__ import annotations
import pytest
from pathlib import Path
import tempfile
from core.tools.base import ToolContext
from tools.code_analysis import CodeAnalysisTool
class TestCodeAnalysisTool:
"""Test code analysis tool."""
@pytest.fixture
def tool(self) -> CodeAnalysisTool:
return CodeAnalysisTool()
@pytest.fixture
def sample_py_file(self) -> Path:
"""Create a sample Python file for testing."""
with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f:
f.write(
'''"""Sample module."""
def hello(name: str) -> str:
"""Say hello."""
return f"Hello {name}"
class Calculator:
"""Simple calculator."""
def add(self, a: int, b: int) -> int:
"""Add two numbers."""
return a + b
import os
import sys
'''
)
return Path(f.name)
def test_analyze_file_valid(self, tool: CodeAnalysisTool, sample_py_file: Path) -> None:
"""Test analyzing a valid Python file."""
result = tool.analyze_file({"path": str(sample_py_file)})
assert result["valid_syntax"] is True
assert result["functions"] >= 1
assert result["classes"] >= 1
assert result["imports"] >= 2
def test_analyze_file_invalid_type(self, tool: CodeAnalysisTool) -> None:
"""Test with invalid path type."""
with pytest.raises(ValueError, match="path must be string"):
tool.analyze_file({"path": 123})
def test_extract_functions(self, tool: CodeAnalysisTool, sample_py_file: Path) -> None:
"""Test extracting functions from file."""
result = tool.extract_functions({"path": str(sample_py_file)})
assert result["count"] >= 2
assert any(f["name"] == "hello" for f in result["functions"])
assert any(f["name"] == "add" for f in result["functions"])
def test_check_complexity(self, tool: CodeAnalysisTool, sample_py_file: Path) -> None:
"""Test complexity calculation."""
result = tool.check_complexity({"path": str(sample_py_file)})
assert "functions" in result
assert "avg_complexity" in result
assert result["avg_complexity"] > 0
def test_execute_analyze(self, tool: CodeAnalysisTool, sample_py_file: Path) -> None:
"""Test execute with analyze_file action."""
ctx = ToolContext(dry_run=False)
result = tool.execute(
{"action": "analyze_file", "path": str(sample_py_file)},
ctx
)
assert result["valid_syntax"] is True
def test_execute_invalid_action(self, tool: CodeAnalysisTool) -> None:
"""Test with invalid action."""
ctx = ToolContext(dry_run=False)
with pytest.raises(ValueError, match="Unknown analysis action"):
tool.execute({"action": "invalid_action"}, ctx)