#!/usr/bin/env python3
"""
Test script to validate the pip package structure and functionality
"""
import sys
import subprocess
import tempfile
from pathlib import Path
def test_package_structure():
"""Test that package structure is correct"""
print("š Testing package structure...")
package_dir = Path("mcp_visualization")
if not package_dir.exists():
print("ā mcp_visualization package directory not found")
return False
required_files = [
"mcp_visualization/__init__.py",
"mcp_visualization/cli.py",
"mcp_visualization/claude_config.py",
"mcp_visualization/server.py",
"mcp_visualization/database.py",
"pyproject.toml",
"LICENSE",
"README.md",
"MANIFEST.in"
]
for file_path in required_files:
if not Path(file_path).exists():
print(f"ā Required file missing: {file_path}")
return False
print("ā
Package structure is valid")
return True
def test_imports():
"""Test that core imports work"""
print("š Testing imports...")
try:
# Test basic package import
import mcp_visualization
print(f"ā
Package version: {mcp_visualization.__version__}")
# Test CLI import
from mcp_visualization.cli import main
print("ā
CLI import successful")
# Test config manager import
from mcp_visualization.claude_config import ClaudeDesktopConfigManager
print("ā
Config manager import successful")
return True
except ImportError as e:
print(f"ā Import failed: {e}")
return False
def test_claude_config_manager():
"""Test Claude Desktop config manager"""
print("š Testing Claude Desktop config manager...")
try:
from mcp_visualization.claude_config import ClaudeDesktopConfigManager
manager = ClaudeDesktopConfigManager()
status = manager.get_status()
print(f"ā
Platform detected: {status['platform']}")
print(f"ā
Config path: {status['config_path']}")
# Test configuration creation (dry run)
config = manager.create_server_config()
print("ā
Server config creation successful")
return True
except Exception as e:
print(f"ā Config manager test failed: {e}")
return False
def test_cli_commands():
"""Test CLI commands (dry run)"""
print("š Testing CLI commands...")
try:
# Test CLI help
result = subprocess.run([
sys.executable, "-m", "mcp_visualization.cli", "--help"
], capture_output=True, text=True, timeout=10)
if result.returncode != 0:
print(f"ā CLI help failed: {result.stderr}")
return False
if "MCP Data Visualization Server CLI" not in result.stdout:
print("ā CLI help output invalid")
return False
print("ā
CLI help command works")
# Test status command
result = subprocess.run([
sys.executable, "-m", "mcp_visualization.cli", "status"
], capture_output=True, text=True, timeout=15)
if result.returncode == 0:
print("ā
CLI status command works")
else:
print(f"ā ļø CLI status command failed (expected if dependencies missing): {result.stderr}")
return True
except Exception as e:
print(f"ā CLI test failed: {e}")
return False
def test_build_package():
"""Test package building"""
print("š Testing package build...")
try:
# Test build command
result = subprocess.run([
sys.executable, "-m", "build", "--outdir", "dist_test"
], capture_output=True, text=True, timeout=60)
if result.returncode != 0:
print(f"ā Package build failed: {result.stderr}")
return False
# Check if wheel and source distribution were created
dist_dir = Path("dist_test")
if not dist_dir.exists():
print("ā Distribution directory not created")
return False
wheel_files = list(dist_dir.glob("*.whl"))
tar_files = list(dist_dir.glob("*.tar.gz"))
if not wheel_files:
print("ā Wheel file not created")
return False
if not tar_files:
print("ā Source distribution not created")
return False
print(f"ā
Package built successfully: {wheel_files[0].name}")
return True
except FileNotFoundError:
print("ā ļø Build tool not available (install with: pip install build)")
return True # Not a failure, just missing tool
except Exception as e:
print(f"ā Build test failed: {e}")
return False
def test_package_installation():
"""Test package installation in temporary environment"""
print("š Testing package installation...")
try:
with tempfile.TemporaryDirectory() as temp_dir:
# Build first
result = subprocess.run([
sys.executable, "-m", "build", "--outdir", temp_dir
], capture_output=True, text=True, timeout=60)
if result.returncode != 0:
print("ā ļø Skipping installation test (build failed)")
return True
# Find wheel file
wheel_files = list(Path(temp_dir).glob("*.whl"))
if not wheel_files:
print("ā ļø No wheel file found for installation test")
return True
wheel_file = wheel_files[0]
print(f"ā
Installation test would use: {wheel_file.name}")
return True
except Exception as e:
print(f"ā Installation test failed: {e}")
return False
def main():
"""Run all tests"""
print("šÆ MCP Data Visualization Package Testing")
print("=" * 50)
tests = [
("Package Structure", test_package_structure),
("Imports", test_imports),
("Claude Config Manager", test_claude_config_manager),
("CLI Commands", test_cli_commands),
("Package Build", test_build_package),
("Installation Simulation", test_package_installation),
]
passed = 0
total = len(tests)
for test_name, test_func in tests:
print(f"\nš {test_name}")
print("-" * 30)
try:
if test_func():
passed += 1
else:
print(f"ā {test_name} FAILED")
except Exception as e:
print(f"ā {test_name} FAILED with exception: {e}")
print("\n" + "=" * 50)
print(f"š Test Results: {passed}/{total} tests passed")
if passed == total:
print("š All tests passed! Package is ready for distribution.")
return 0
else:
print(f"ā ļø {total - passed} test(s) failed. Please fix issues before distribution.")
return 1
if __name__ == "__main__":
sys.exit(main())