Initial commit: Vultr MCP Server
This commit is contained in:
173
test_server.py
Normal file
173
test_server.py
Normal file
@@ -0,0 +1,173 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Test script for Vultr MCP Server
|
||||
"""
|
||||
import sys
|
||||
import os
|
||||
import json
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from src.vultr_mcp.server import app
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
# Create test client
|
||||
client = TestClient(app)
|
||||
|
||||
def test_root_endpoint():
|
||||
"""Test root endpoint"""
|
||||
print("Testing root endpoint...")
|
||||
response = client.get("/")
|
||||
assert response.status_code == 200, f"Expected 200, got {response.status_code}"
|
||||
data = response.json()
|
||||
assert "name" in data, "Missing 'name' in response"
|
||||
assert "Vultr MCP Server" in data["name"], f"Unexpected name: {data.get('name')}"
|
||||
print(f" ✓ Root endpoint: {data['name']} v{data.get('version', 'N/A')}")
|
||||
return True
|
||||
|
||||
def test_tools_endpoint():
|
||||
"""Test tools endpoint"""
|
||||
print("\nTesting tools endpoint...")
|
||||
response = client.get("/tools")
|
||||
assert response.status_code == 200, f"Expected 200, got {response.status_code}"
|
||||
tools = response.json()
|
||||
assert isinstance(tools, list), f"Expected list, got {type(tools)}"
|
||||
assert len(tools) > 0, "No tools found"
|
||||
|
||||
print(f" ✓ Found {len(tools)} tools:")
|
||||
for i, tool in enumerate(tools[:5], 1): # Show first 5
|
||||
print(f" {i}. {tool['name']}: {tool['description'][:50]}...")
|
||||
if len(tools) > 5:
|
||||
print(f" ... and {len(tools) - 5} more")
|
||||
|
||||
# Verify some expected tools
|
||||
tool_names = [t['name'] for t in tools]
|
||||
expected_tools = ['get_account_info', 'list_instances', 'create_instance']
|
||||
for expected in expected_tools:
|
||||
assert expected in tool_names, f"Missing expected tool: {expected}"
|
||||
|
||||
return True
|
||||
|
||||
def test_resources_endpoint():
|
||||
"""Test resources endpoint"""
|
||||
print("\nTesting resources endpoint...")
|
||||
response = client.get("/resources")
|
||||
assert response.status_code == 200, f"Expected 200, got {response.status_code}"
|
||||
resources = response.json()
|
||||
assert isinstance(resources, list), f"Expected list, got {type(resources)}"
|
||||
|
||||
print(f" ✓ Found {len(resources)} resources:")
|
||||
for resource in resources:
|
||||
print(f" - {resource['name']}: {resource['uri']}")
|
||||
|
||||
return True
|
||||
|
||||
def test_prompts_endpoint():
|
||||
"""Test prompts endpoint"""
|
||||
print("\nTesting prompts endpoint...")
|
||||
response = client.get("/prompts")
|
||||
assert response.status_code == 200, f"Expected 200, got {response.status_code}"
|
||||
prompts = response.json()
|
||||
assert isinstance(prompts, list), f"Expected list, got {type(prompts)}"
|
||||
|
||||
print(f" ✓ Found {len(prompts)} prompts:")
|
||||
for prompt in prompts:
|
||||
print(f" - {prompt['name']}: {prompt['description']}")
|
||||
|
||||
return True
|
||||
|
||||
def test_tool_call_without_api_key():
|
||||
"""Test tool call without API key (should fail gracefully)"""
|
||||
print("\nTesting tool call without API key...")
|
||||
response = client.post("/tools/call", json={
|
||||
"name": "get_account_info",
|
||||
"arguments": {}
|
||||
})
|
||||
assert response.status_code == 200, f"Expected 200, got {response.status_code}"
|
||||
result = response.json()
|
||||
|
||||
# Should either be an error or contain content
|
||||
assert "content" in result, "Missing 'content' in response"
|
||||
assert isinstance(result["content"], list), "Content should be a list"
|
||||
|
||||
if result.get("isError", False):
|
||||
print(" ✓ Tool call correctly returned error (no API key configured)")
|
||||
if result["content"]:
|
||||
error_text = result["content"][0].get("text", "")
|
||||
print(f" Error message: {error_text[:100]}...")
|
||||
else:
|
||||
print(" ✓ Tool call succeeded (API key might be configured)")
|
||||
|
||||
return True
|
||||
|
||||
def test_server_info_endpoints():
|
||||
"""Test that server info endpoints work"""
|
||||
print("\nTesting server info endpoints...")
|
||||
|
||||
# Test that we can get the OpenAPI schema
|
||||
response = client.get("/openapi.json")
|
||||
assert response.status_code == 200, f"OpenAPI schema failed: {response.status_code}"
|
||||
print(" ✓ OpenAPI schema available")
|
||||
|
||||
# Test docs endpoint
|
||||
response = client.get("/docs")
|
||||
assert response.status_code == 200, f"Docs endpoint failed: {response.status_code}"
|
||||
print(" ✓ API documentation available")
|
||||
|
||||
return True
|
||||
|
||||
def main():
|
||||
"""Run all tests"""
|
||||
print("=" * 60)
|
||||
print("Vultr MCP Server - Test Suite")
|
||||
print("=" * 60)
|
||||
print("Note: These tests don't require a Vultr API key")
|
||||
print(" They only test the server structure and endpoints\n")
|
||||
|
||||
tests = [
|
||||
test_root_endpoint,
|
||||
test_tools_endpoint,
|
||||
test_resources_endpoint,
|
||||
test_prompts_endpoint,
|
||||
test_tool_call_without_api_key,
|
||||
test_server_info_endpoints,
|
||||
]
|
||||
|
||||
passed = 0
|
||||
failed = 0
|
||||
failed_tests = []
|
||||
|
||||
for test in tests:
|
||||
try:
|
||||
if test():
|
||||
passed += 1
|
||||
except AssertionError as e:
|
||||
print(f" ✗ Test failed: {e}")
|
||||
failed += 1
|
||||
failed_tests.append(test.__name__)
|
||||
except Exception as e:
|
||||
print(f" ✗ Unexpected error in {test.__name__}: {e}")
|
||||
failed += 1
|
||||
failed_tests.append(test.__name__)
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("TEST RESULTS")
|
||||
print("=" * 60)
|
||||
print(f"Passed: {passed}")
|
||||
print(f"Failed: {failed}")
|
||||
|
||||
if failed == 0:
|
||||
print("\n✅ All tests passed! Server is ready to run.")
|
||||
print("\nNext steps:")
|
||||
print(" 1. Copy .env.example to .env")
|
||||
print(" 2. Add your VULTR_API_KEY to .env")
|
||||
print(" 3. Run the server: python main.py")
|
||||
print(" 4. Test with example: python examples/basic_usage.py")
|
||||
return 0
|
||||
else:
|
||||
print(f"\n❌ {failed} test(s) failed: {', '.join(failed_tests)}")
|
||||
print("\nCheck the implementation and try again.")
|
||||
return 1
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
|
||||
Reference in New Issue
Block a user