"""
Tests for mcp4mcp tool functionality
"""
import pytest
import asyncio
import tempfile
import os
from pathlib import Path
from mcp4mcp.tools.state_management import get_project_state, update_project_state, scan_project_files
from mcp4mcp.tools.intelligence import check_before_build, suggest_next_action, analyze_tool_similarity
from mcp4mcp.tools.tracking import track_development_session, end_development_session
from mcp4mcp.models import ToolStatus
class TestStateManagement:
"""Test state management tools"""
def setup_method(self):
"""Setup test environment"""
self.temp_dir = tempfile.mkdtemp()
self.db_path = Path(self.temp_dir) / "test.db"
# Override the global DB_PATH for testing
import mcp4mcp.storage
self.original_db_path = mcp4mcp.storage.DB_PATH
mcp4mcp.storage.DB_PATH = self.db_path
def teardown_method(self):
"""Cleanup test environment"""
# Restore original DB_PATH
import mcp4mcp.storage
mcp4mcp.storage.DB_PATH = self.original_db_path
# Remove test database
if self.db_path.exists():
os.remove(self.db_path)
# Clean up temp directory recursively
import shutil
if os.path.exists(self.temp_dir):
shutil.rmtree(self.temp_dir)
@pytest.mark.asyncio
async def test_get_project_state(self):
"""Test getting project state"""
result = await get_project_state("test_project")
assert result["success"] is True
assert result["project"]["name"] == "test_project"
assert "tools" in result["project"]
@pytest.mark.asyncio
async def test_update_project_state(self):
"""Test updating project state"""
tools = [
{
"name": "test_tool",
"description": "A test tool",
"status": "planned"
}
]
result = await update_project_state(
"test_project",
"Updated test project",
tools
)
assert result["success"] is True
# Check for project name in message, not specific tool name
assert "test_project" in result["message"]
assert result["total_tools"] == 1
@pytest.mark.asyncio
async def test_scan_project_files(self):
"""Test scanning project files"""
# Create a temporary Python file with a tool
test_file = Path(self.temp_dir) / "test_tools.py"
test_file.write_text("""
from fastmcp import FastMCP
mcp = FastMCP("test")
@mcp.tool()
def test_tool():
'''A test tool'''
return "test"
""")
result = await scan_project_files("test_project", self.temp_dir)
assert result["success"] is True
# Use the correct key from the actual return value
assert "discovered_tools" in result
assert result["discovered_tools"] >= 0
class TestIntelligence:
"""Test intelligence tools"""
def setup_method(self):
"""Setup test environment"""
self.temp_dir = tempfile.mkdtemp()
self.db_path = Path(self.temp_dir) / "test.db"
# Override the global DB_PATH for testing
import mcp4mcp.storage
self.original_db_path = mcp4mcp.storage.DB_PATH
mcp4mcp.storage.DB_PATH = self.db_path
def teardown_method(self):
"""Cleanup test environment"""
# Restore original DB_PATH
import mcp4mcp.storage
mcp4mcp.storage.DB_PATH = self.original_db_path
# Remove test database
if self.db_path.exists():
os.remove(self.db_path)
# Clean up temp directory recursively
import shutil
if os.path.exists(self.temp_dir):
shutil.rmtree(self.temp_dir)
@pytest.mark.asyncio
async def test_check_before_build(self):
"""Test checking before build"""
result = await check_before_build(
"new_tool",
"A new tool for testing",
"test_project"
)
assert result["success"] is True
assert "conflicts" in result
# Use the correct key name from the actual return value
assert "recommendation" in result
@pytest.mark.asyncio
async def test_suggest_next_action(self):
"""Test suggesting next action"""
result = await suggest_next_action("test_project", "Working on tools")
assert result["success"] is True
assert "suggestions" in result
assert "analysis" in result
@pytest.mark.asyncio
async def test_analyze_tool_similarity(self):
"""Test analyzing tool similarity"""
result = await analyze_tool_similarity("test_project", 0.7)
assert result["success"] is True
assert "similarity_results" in result
assert "total_comparisons" in result
class TestTracking:
"""Test tracking tools"""
def setup_method(self):
"""Setup test environment"""
self.temp_dir = tempfile.mkdtemp()
self.db_path = Path(self.temp_dir) / "test.db"
# Override the global DB_PATH for testing
import mcp4mcp.storage
self.original_db_path = mcp4mcp.storage.DB_PATH
mcp4mcp.storage.DB_PATH = self.db_path
def teardown_method(self):
"""Cleanup test environment"""
# Restore original DB_PATH
import mcp4mcp.storage
mcp4mcp.storage.DB_PATH = self.original_db_path
# Remove test database
if self.db_path.exists():
os.remove(self.db_path)
# Clean up temp directory recursively
import shutil
if os.path.exists(self.temp_dir):
shutil.rmtree(self.temp_dir)
@pytest.mark.asyncio
async def test_track_development_session(self):
"""Test tracking development session"""
result = await track_development_session(
"Started working on new tool",
"test_project",
"test_tool",
"Initial development"
)
assert result["success"] is True
assert "session_id" in result
assert result["action"] == "Started working on new tool"
@pytest.mark.asyncio
async def test_end_development_session(self):
"""Test ending development session"""
# First start a session
start_result = await track_development_session(
"Started working",
"test_project"
)
session_id = start_result["session_id"]
# Then end it
result = await end_development_session(session_id, "test_project")
assert result["success"] is True
assert "duration" in result
assert result["session_id"] == session_id