Delete analyze_test_issues.py
This commit is contained in:
parent
cf38305950
commit
2622516989
@ -1,695 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Script to analyze and identify potential test issues in the vultr-dns-mcp repository.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import subprocess
|
|
||||||
import os
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
def analyze_test_structure():
|
|
||||||
"""Analyze the test structure and identify potential issues."""
|
|
||||||
|
|
||||||
print("=== Vultr DNS MCP Test Analysis ===\n")
|
|
||||||
|
|
||||||
issues_found = []
|
|
||||||
fixes_needed = []
|
|
||||||
|
|
||||||
# Common issues in MCP test suites
|
|
||||||
print("🔍 Analyzing potential test issues...\n")
|
|
||||||
|
|
||||||
# Issue 1: Import path problems
|
|
||||||
print("1. Import Path Issues:")
|
|
||||||
print(" - Tests may have incorrect import paths for the vultr_dns_mcp module")
|
|
||||||
print(" - Solution: Fix import statements to use correct package structure")
|
|
||||||
issues_found.append("Import path issues")
|
|
||||||
fixes_needed.append("Fix import statements in test files")
|
|
||||||
|
|
||||||
# Issue 2: Async/await patterns
|
|
||||||
print("\n2. Async/Await Pattern Issues:")
|
|
||||||
print(" - Tests use @pytest.mark.asyncio but may have incorrect async patterns")
|
|
||||||
print(" - FastMCP Client context manager usage might be incorrect")
|
|
||||||
print(" - Solution: Ensure proper async/await patterns and context management")
|
|
||||||
issues_found.append("Async/await pattern issues")
|
|
||||||
fixes_needed.append("Fix async patterns and FastMCP Client usage")
|
|
||||||
|
|
||||||
# Issue 3: Mock configuration
|
|
||||||
print("\n3. Mock Configuration Issues:")
|
|
||||||
print(" - Mock setup in conftest.py may not match actual API structure")
|
|
||||||
print(" - Patch decorators might target wrong import paths")
|
|
||||||
print(" - Solution: Update mock configurations to match current API")
|
|
||||||
issues_found.append("Mock configuration issues")
|
|
||||||
fixes_needed.append("Update mock configurations")
|
|
||||||
|
|
||||||
# Issue 4: Dependency versions
|
|
||||||
print("\n4. Dependency Version Issues:")
|
|
||||||
print(" - FastMCP version compatibility issues")
|
|
||||||
print(" - Pytest-asyncio version compatibility")
|
|
||||||
print(" - Solution: Update dependency versions in pyproject.toml")
|
|
||||||
issues_found.append("Dependency version issues")
|
|
||||||
fixes_needed.append("Update dependency versions")
|
|
||||||
|
|
||||||
# Issue 5: Test data structure
|
|
||||||
print("\n5. Test Data Structure Issues:")
|
|
||||||
print(" - Sample data in fixtures may not match current API response format")
|
|
||||||
print(" - Solution: Update test data to match current Vultr API structure")
|
|
||||||
issues_found.append("Test data structure issues")
|
|
||||||
fixes_needed.append("Update test data structures")
|
|
||||||
|
|
||||||
return issues_found, fixes_needed
|
|
||||||
|
|
||||||
def create_fix_script():
|
|
||||||
"""Create a comprehensive fix script for the test issues."""
|
|
||||||
|
|
||||||
fix_script = '''#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Comprehensive test fix script for vultr-dns-mcp repository.
|
|
||||||
This script addresses common test failures and updates the test suite.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
def fix_import_statements():
|
|
||||||
"""Fix import statements in test files."""
|
|
||||||
print("🔧 Fixing import statements...")
|
|
||||||
|
|
||||||
# Common import fixes needed
|
|
||||||
import_fixes = {
|
|
||||||
# Fix relative imports
|
|
||||||
r"from vultr_dns_mcp\.server import": "from vultr_dns_mcp.server import",
|
|
||||||
r"from vultr_dns_mcp\.client import": "from vultr_dns_mcp.client import",
|
|
||||||
# Fix FastMCP imports
|
|
||||||
r"from fastmcp import Client": "from fastmcp import Client",
|
|
||||||
# Add missing imports
|
|
||||||
r"import pytest": "import pytest\\nimport asyncio",
|
|
||||||
}
|
|
||||||
|
|
||||||
return import_fixes
|
|
||||||
|
|
||||||
def fix_async_patterns():
|
|
||||||
"""Fix async/await patterns in tests."""
|
|
||||||
print("🔧 Fixing async patterns...")
|
|
||||||
|
|
||||||
async_fixes = {
|
|
||||||
# Fix FastMCP client usage
|
|
||||||
r"async with Client\(([^)]+)\) as client:": r"async with Client(\\1) as client:",
|
|
||||||
# Fix pytest.mark.asyncio usage
|
|
||||||
r"@pytest\.mark\.asyncio": "@pytest.mark.asyncio\\nasync def",
|
|
||||||
}
|
|
||||||
|
|
||||||
return async_fixes
|
|
||||||
|
|
||||||
def create_updated_conftest():
|
|
||||||
"""Create an updated conftest.py file."""
|
|
||||||
|
|
||||||
conftest_content = '''"""Configuration for pytest tests."""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import pytest
|
|
||||||
from unittest.mock import AsyncMock, MagicMock, patch
|
|
||||||
from vultr_dns_mcp.server import create_mcp_server
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def mock_api_key():
|
|
||||||
"""Provide a mock API key for testing."""
|
|
||||||
return "test-api-key-123456789"
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def mcp_server(mock_api_key):
|
|
||||||
"""Create a FastMCP server instance for testing."""
|
|
||||||
return create_mcp_server(mock_api_key)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def mock_vultr_client():
|
|
||||||
"""Create a mock VultrDNSServer for testing API interactions."""
|
|
||||||
from vultr_dns_mcp.server import VultrDNSServer
|
|
||||||
|
|
||||||
mock_client = AsyncMock(spec=VultrDNSServer)
|
|
||||||
|
|
||||||
# Configure common mock responses
|
|
||||||
mock_client.list_domains.return_value = [
|
|
||||||
{
|
|
||||||
"domain": "example.com",
|
|
||||||
"date_created": "2024-01-01T00:00:00Z",
|
|
||||||
"dns_sec": "disabled"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"domain": "test.com",
|
|
||||||
"date_created": "2024-01-02T00:00:00Z",
|
|
||||||
"dns_sec": "enabled"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
mock_client.get_domain.return_value = {
|
|
||||||
"domain": "example.com",
|
|
||||||
"date_created": "2024-01-01T00:00:00Z",
|
|
||||||
"dns_sec": "disabled"
|
|
||||||
}
|
|
||||||
|
|
||||||
mock_client.list_records.return_value = [
|
|
||||||
{
|
|
||||||
"id": "record-123",
|
|
||||||
"type": "A",
|
|
||||||
"name": "@",
|
|
||||||
"data": "192.168.1.100",
|
|
||||||
"ttl": 300,
|
|
||||||
"priority": None
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "record-456",
|
|
||||||
"type": "MX",
|
|
||||||
"name": "@",
|
|
||||||
"data": "mail.example.com",
|
|
||||||
"ttl": 300,
|
|
||||||
"priority": 10
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
mock_client.create_record.return_value = {
|
|
||||||
"id": "new-record-789",
|
|
||||||
"type": "A",
|
|
||||||
"name": "www",
|
|
||||||
"data": "192.168.1.100",
|
|
||||||
"ttl": 300
|
|
||||||
}
|
|
||||||
|
|
||||||
mock_client.create_domain.return_value = {
|
|
||||||
"domain": "newdomain.com",
|
|
||||||
"date_created": "2024-12-20T00:00:00Z"
|
|
||||||
}
|
|
||||||
|
|
||||||
return mock_client
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
|
||||||
def mock_env_api_key(monkeypatch, mock_api_key):
|
|
||||||
"""Automatically set the API key environment variable for all tests."""
|
|
||||||
monkeypatch.setenv("VULTR_API_KEY", mock_api_key)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def sample_domain_data():
|
|
||||||
"""Sample domain data for testing."""
|
|
||||||
return {
|
|
||||||
"domain": "example.com",
|
|
||||||
"date_created": "2024-01-01T00:00:00Z",
|
|
||||||
"dns_sec": "disabled"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def sample_record_data():
|
|
||||||
"""Sample DNS record data for testing."""
|
|
||||||
return {
|
|
||||||
"id": "record-123",
|
|
||||||
"type": "A",
|
|
||||||
"name": "www",
|
|
||||||
"data": "192.168.1.100",
|
|
||||||
"ttl": 300,
|
|
||||||
"priority": None
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def sample_records():
|
|
||||||
"""Sample list of DNS records for testing."""
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
"id": "record-123",
|
|
||||||
"type": "A",
|
|
||||||
"name": "@",
|
|
||||||
"data": "192.168.1.100",
|
|
||||||
"ttl": 300
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "record-456",
|
|
||||||
"type": "A",
|
|
||||||
"name": "www",
|
|
||||||
"data": "192.168.1.100",
|
|
||||||
"ttl": 300
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "record-789",
|
|
||||||
"type": "MX",
|
|
||||||
"name": "@",
|
|
||||||
"data": "mail.example.com",
|
|
||||||
"ttl": 300,
|
|
||||||
"priority": 10
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "record-999",
|
|
||||||
"type": "TXT",
|
|
||||||
"name": "@",
|
|
||||||
"data": "v=spf1 include:_spf.google.com ~all",
|
|
||||||
"ttl": 300
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
# Configure pytest markers
|
|
||||||
def pytest_configure(config):
|
|
||||||
"""Configure custom pytest markers."""
|
|
||||||
config.addinivalue_line(
|
|
||||||
"markers", "unit: mark test as a unit test"
|
|
||||||
)
|
|
||||||
config.addinivalue_line(
|
|
||||||
"markers", "integration: mark test as an integration test"
|
|
||||||
)
|
|
||||||
config.addinivalue_line(
|
|
||||||
"markers", "slow: mark test as slow running"
|
|
||||||
)
|
|
||||||
config.addinivalue_line(
|
|
||||||
"markers", "mcp: mark test as MCP-specific"
|
|
||||||
)
|
|
||||||
'''
|
|
||||||
|
|
||||||
return conftest_content
|
|
||||||
|
|
||||||
def create_updated_test_mcp_server():
|
|
||||||
"""Create an updated test_mcp_server.py file."""
|
|
||||||
|
|
||||||
test_content = '''"""Tests for MCP server functionality using FastMCP testing patterns."""
|
|
||||||
|
|
||||||
import pytest
|
|
||||||
from unittest.mock import patch, AsyncMock
|
|
||||||
from fastmcp import Client
|
|
||||||
from vultr_dns_mcp.server import VultrDNSServer, create_mcp_server
|
|
||||||
|
|
||||||
|
|
||||||
class TestMCPServerBasics:
|
|
||||||
"""Test basic MCP server functionality."""
|
|
||||||
|
|
||||||
def test_server_creation(self, mock_api_key):
|
|
||||||
"""Test that MCP server can be created successfully."""
|
|
||||||
server = create_mcp_server(mock_api_key)
|
|
||||||
assert server is not None
|
|
||||||
assert hasattr(server, '_tools')
|
|
||||||
assert hasattr(server, '_resources')
|
|
||||||
|
|
||||||
def test_server_creation_without_api_key(self):
|
|
||||||
"""Test that server creation fails without API key."""
|
|
||||||
with pytest.raises(ValueError, match="VULTR_API_KEY must be provided"):
|
|
||||||
create_mcp_server(None)
|
|
||||||
|
|
||||||
@patch.dict('os.environ', {'VULTR_API_KEY': 'env-test-key'})
|
|
||||||
def test_server_creation_from_env(self):
|
|
||||||
"""Test server creation using environment variable."""
|
|
||||||
server = create_mcp_server()
|
|
||||||
assert server is not None
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.mcp
|
|
||||||
class TestMCPTools:
|
|
||||||
"""Test MCP tools through in-memory client connection."""
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_list_dns_domains_tool(self, mcp_server, mock_vultr_client):
|
|
||||||
"""Test the list_dns_domains MCP tool."""
|
|
||||||
with patch('vultr_dns_mcp.server.VultrDNSServer', return_value=mock_vultr_client):
|
|
||||||
server = create_mcp_server("test-api-key")
|
|
||||||
|
|
||||||
async with Client(server) as client:
|
|
||||||
result = await client.call_tool("list_dns_domains", {})
|
|
||||||
|
|
||||||
assert result is not None
|
|
||||||
assert isinstance(result, list)
|
|
||||||
# The result should contain the mock data
|
|
||||||
if len(result) > 0:
|
|
||||||
# Check if we got the mock data
|
|
||||||
mock_vultr_client.list_domains.assert_called_once()
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_get_dns_domain_tool(self, mcp_server, mock_vultr_client):
|
|
||||||
"""Test the get_dns_domain MCP tool."""
|
|
||||||
with patch('vultr_dns_mcp.server.VultrDNSServer', return_value=mock_vultr_client):
|
|
||||||
server = create_mcp_server("test-api-key")
|
|
||||||
|
|
||||||
async with Client(server) as client:
|
|
||||||
result = await client.call_tool("get_dns_domain", {"domain": "example.com"})
|
|
||||||
|
|
||||||
assert result is not None
|
|
||||||
mock_vultr_client.get_domain.assert_called_once_with("example.com")
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_create_dns_domain_tool(self, mcp_server, mock_vultr_client):
|
|
||||||
"""Test the create_dns_domain MCP tool."""
|
|
||||||
with patch('vultr_dns_mcp.server.VultrDNSServer', return_value=mock_vultr_client):
|
|
||||||
server = create_mcp_server("test-api-key")
|
|
||||||
|
|
||||||
async with Client(server) as client:
|
|
||||||
result = await client.call_tool("create_dns_domain", {
|
|
||||||
"domain": "newdomain.com",
|
|
||||||
"ip": "192.168.1.100"
|
|
||||||
})
|
|
||||||
|
|
||||||
assert result is not None
|
|
||||||
mock_vultr_client.create_domain.assert_called_once_with("newdomain.com", "192.168.1.100")
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_delete_dns_domain_tool(self, mcp_server, mock_vultr_client):
|
|
||||||
"""Test the delete_dns_domain MCP tool."""
|
|
||||||
with patch('vultr_dns_mcp.server.VultrDNSServer', return_value=mock_vultr_client):
|
|
||||||
server = create_mcp_server("test-api-key")
|
|
||||||
|
|
||||||
async with Client(server) as client:
|
|
||||||
result = await client.call_tool("delete_dns_domain", {"domain": "example.com"})
|
|
||||||
|
|
||||||
assert result is not None
|
|
||||||
mock_vultr_client.delete_domain.assert_called_once_with("example.com")
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_list_dns_records_tool(self, mcp_server, mock_vultr_client):
|
|
||||||
"""Test the list_dns_records MCP tool."""
|
|
||||||
with patch('vultr_dns_mcp.server.VultrDNSServer', return_value=mock_vultr_client):
|
|
||||||
server = create_mcp_server("test-api-key")
|
|
||||||
|
|
||||||
async with Client(server) as client:
|
|
||||||
result = await client.call_tool("list_dns_records", {"domain": "example.com"})
|
|
||||||
|
|
||||||
assert result is not None
|
|
||||||
mock_vultr_client.list_records.assert_called_once_with("example.com")
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_create_dns_record_tool(self, mcp_server, mock_vultr_client):
|
|
||||||
"""Test the create_dns_record MCP tool."""
|
|
||||||
with patch('vultr_dns_mcp.server.VultrDNSServer', return_value=mock_vultr_client):
|
|
||||||
server = create_mcp_server("test-api-key")
|
|
||||||
|
|
||||||
async with Client(server) as client:
|
|
||||||
result = await client.call_tool("create_dns_record", {
|
|
||||||
"domain": "example.com",
|
|
||||||
"record_type": "A",
|
|
||||||
"name": "www",
|
|
||||||
"data": "192.168.1.100",
|
|
||||||
"ttl": 300
|
|
||||||
})
|
|
||||||
|
|
||||||
assert result is not None
|
|
||||||
mock_vultr_client.create_record.assert_called_once_with(
|
|
||||||
"example.com", "A", "www", "192.168.1.100", 300, None
|
|
||||||
)
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_validate_dns_record_tool(self, mcp_server):
|
|
||||||
"""Test the validate_dns_record MCP tool."""
|
|
||||||
async with Client(mcp_server) as client:
|
|
||||||
# Test valid A record
|
|
||||||
result = await client.call_tool("validate_dns_record", {
|
|
||||||
"record_type": "A",
|
|
||||||
"name": "www",
|
|
||||||
"data": "192.168.1.100",
|
|
||||||
"ttl": 300
|
|
||||||
})
|
|
||||||
|
|
||||||
assert result is not None
|
|
||||||
# The validation should pass for a valid A record
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_validate_dns_record_invalid(self, mcp_server):
|
|
||||||
"""Test the validate_dns_record tool with invalid data."""
|
|
||||||
async with Client(mcp_server) as client:
|
|
||||||
# Test invalid A record (bad IP)
|
|
||||||
result = await client.call_tool("validate_dns_record", {
|
|
||||||
"record_type": "A",
|
|
||||||
"name": "www",
|
|
||||||
"data": "invalid-ip-address"
|
|
||||||
})
|
|
||||||
|
|
||||||
assert result is not None
|
|
||||||
# Should detect the invalid IP address
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_analyze_dns_records_tool(self, mcp_server, mock_vultr_client):
|
|
||||||
"""Test the analyze_dns_records MCP tool."""
|
|
||||||
with patch('vultr_dns_mcp.server.VultrDNSServer', return_value=mock_vultr_client):
|
|
||||||
server = create_mcp_server("test-api-key")
|
|
||||||
|
|
||||||
async with Client(server) as client:
|
|
||||||
result = await client.call_tool("analyze_dns_records", {"domain": "example.com"})
|
|
||||||
|
|
||||||
assert result is not None
|
|
||||||
mock_vultr_client.list_records.assert_called_once_with("example.com")
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.mcp
|
|
||||||
class TestMCPResources:
|
|
||||||
"""Test MCP resources through in-memory client connection."""
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_domains_resource(self, mcp_server, mock_vultr_client):
|
|
||||||
"""Test the vultr://domains resource."""
|
|
||||||
with patch('vultr_dns_mcp.server.VultrDNSServer', return_value=mock_vultr_client):
|
|
||||||
server = create_mcp_server("test-api-key")
|
|
||||||
|
|
||||||
async with Client(server) as client:
|
|
||||||
# Get available resources
|
|
||||||
resources = await client.list_resources()
|
|
||||||
|
|
||||||
# Check that domains resource is available
|
|
||||||
resource_uris = [r.uri for r in resources]
|
|
||||||
assert "vultr://domains" in resource_uris
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_capabilities_resource(self, mcp_server):
|
|
||||||
"""Test the vultr://capabilities resource."""
|
|
||||||
async with Client(mcp_server) as client:
|
|
||||||
resources = await client.list_resources()
|
|
||||||
resource_uris = [r.uri for r in resources]
|
|
||||||
assert "vultr://capabilities" in resource_uris
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_read_domains_resource(self, mcp_server, mock_vultr_client):
|
|
||||||
"""Test reading the domains resource content."""
|
|
||||||
with patch('vultr_dns_mcp.server.VultrDNSServer', return_value=mock_vultr_client):
|
|
||||||
server = create_mcp_server("test-api-key")
|
|
||||||
|
|
||||||
async with Client(server) as client:
|
|
||||||
try:
|
|
||||||
result = await client.read_resource("vultr://domains")
|
|
||||||
assert result is not None
|
|
||||||
mock_vultr_client.list_domains.assert_called_once()
|
|
||||||
except Exception:
|
|
||||||
# Resource reading might not be available in all FastMCP versions
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.mcp
|
|
||||||
class TestMCPToolErrors:
|
|
||||||
"""Test MCP tool error handling."""
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_tool_with_api_error(self, mcp_server):
|
|
||||||
"""Test tool behavior when API returns an error."""
|
|
||||||
mock_client = AsyncMock()
|
|
||||||
mock_client.list_domains.side_effect = Exception("API Error")
|
|
||||||
|
|
||||||
with patch('vultr_dns_mcp.server.VultrDNSServer', return_value=mock_client):
|
|
||||||
server = create_mcp_server("test-api-key")
|
|
||||||
|
|
||||||
async with Client(server) as client:
|
|
||||||
result = await client.call_tool("list_dns_domains", {})
|
|
||||||
|
|
||||||
# Should handle the error gracefully
|
|
||||||
assert result is not None
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_missing_required_parameters(self, mcp_server):
|
|
||||||
"""Test tool behavior with missing required parameters."""
|
|
||||||
async with Client(mcp_server) as client:
|
|
||||||
with pytest.raises(Exception):
|
|
||||||
# This should fail due to missing required 'domain' parameter
|
|
||||||
await client.call_tool("get_dns_domain", {})
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.integration
|
|
||||||
class TestMCPIntegration:
|
|
||||||
"""Integration tests for the complete MCP workflow."""
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_complete_domain_workflow(self, mcp_server, mock_vultr_client):
|
|
||||||
"""Test a complete domain management workflow."""
|
|
||||||
with patch('vultr_dns_mcp.server.VultrDNSServer', return_value=mock_vultr_client):
|
|
||||||
server = create_mcp_server("test-api-key")
|
|
||||||
|
|
||||||
async with Client(server) as client:
|
|
||||||
# 1. List domains
|
|
||||||
domains = await client.call_tool("list_dns_domains", {})
|
|
||||||
assert domains is not None
|
|
||||||
|
|
||||||
# 2. Get domain details
|
|
||||||
domain_info = await client.call_tool("get_dns_domain", {"domain": "example.com"})
|
|
||||||
assert domain_info is not None
|
|
||||||
|
|
||||||
# 3. List records
|
|
||||||
records = await client.call_tool("list_dns_records", {"domain": "example.com"})
|
|
||||||
assert records is not None
|
|
||||||
|
|
||||||
# 4. Analyze configuration
|
|
||||||
analysis = await client.call_tool("analyze_dns_records", {"domain": "example.com"})
|
|
||||||
assert analysis is not None
|
|
||||||
|
|
||||||
# Verify all expected API calls were made
|
|
||||||
mock_vultr_client.list_domains.assert_called()
|
|
||||||
mock_vultr_client.get_domain.assert_called_with("example.com")
|
|
||||||
mock_vultr_client.list_records.assert_called_with("example.com")
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_record_management_workflow(self, mcp_server, mock_vultr_client):
|
|
||||||
"""Test record creation and management workflow."""
|
|
||||||
with patch('vultr_dns_mcp.server.VultrDNSServer', return_value=mock_vultr_client):
|
|
||||||
server = create_mcp_server("test-api-key")
|
|
||||||
|
|
||||||
async with Client(server) as client:
|
|
||||||
# 1. Validate record before creation
|
|
||||||
validation = await client.call_tool("validate_dns_record", {
|
|
||||||
"record_type": "A",
|
|
||||||
"name": "www",
|
|
||||||
"data": "192.168.1.100"
|
|
||||||
})
|
|
||||||
assert validation is not None
|
|
||||||
|
|
||||||
# 2. Create the record
|
|
||||||
create_result = await client.call_tool("create_dns_record", {
|
|
||||||
"domain": "example.com",
|
|
||||||
"record_type": "A",
|
|
||||||
"name": "www",
|
|
||||||
"data": "192.168.1.100",
|
|
||||||
"ttl": 300
|
|
||||||
})
|
|
||||||
assert create_result is not None
|
|
||||||
|
|
||||||
# 3. Verify the record was created
|
|
||||||
mock_vultr_client.create_record.assert_called_with(
|
|
||||||
"example.com", "A", "www", "192.168.1.100", 300, None
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.unit
|
|
||||||
class TestValidationLogic:
|
|
||||||
"""Test DNS record validation logic in isolation."""
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_a_record_validation(self, mcp_server):
|
|
||||||
"""Test A record validation logic."""
|
|
||||||
async with Client(mcp_server) as client:
|
|
||||||
# Valid IPv4
|
|
||||||
result = await client.call_tool("validate_dns_record", {
|
|
||||||
"record_type": "A",
|
|
||||||
"name": "www",
|
|
||||||
"data": "192.168.1.1"
|
|
||||||
})
|
|
||||||
assert result is not None
|
|
||||||
|
|
||||||
# Invalid IPv4
|
|
||||||
result = await client.call_tool("validate_dns_record", {
|
|
||||||
"record_type": "A",
|
|
||||||
"name": "www",
|
|
||||||
"data": "999.999.999.999"
|
|
||||||
})
|
|
||||||
assert result is not None
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_cname_validation(self, mcp_server):
|
|
||||||
"""Test CNAME record validation logic."""
|
|
||||||
async with Client(mcp_server) as client:
|
|
||||||
# Invalid: CNAME on root domain
|
|
||||||
result = await client.call_tool("validate_dns_record", {
|
|
||||||
"record_type": "CNAME",
|
|
||||||
"name": "@",
|
|
||||||
"data": "example.com"
|
|
||||||
})
|
|
||||||
assert result is not None
|
|
||||||
|
|
||||||
# Valid: CNAME on subdomain
|
|
||||||
result = await client.call_tool("validate_dns_record", {
|
|
||||||
"record_type": "CNAME",
|
|
||||||
"name": "www",
|
|
||||||
"data": "example.com"
|
|
||||||
})
|
|
||||||
assert result is not None
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_mx_validation(self, mcp_server):
|
|
||||||
"""Test MX record validation logic."""
|
|
||||||
async with Client(mcp_server) as client:
|
|
||||||
# Invalid: Missing priority
|
|
||||||
result = await client.call_tool("validate_dns_record", {
|
|
||||||
"record_type": "MX",
|
|
||||||
"name": "@",
|
|
||||||
"data": "mail.example.com"
|
|
||||||
})
|
|
||||||
assert result is not None
|
|
||||||
|
|
||||||
# Valid: With priority
|
|
||||||
result = await client.call_tool("validate_dns_record", {
|
|
||||||
"record_type": "MX",
|
|
||||||
"name": "@",
|
|
||||||
"data": "mail.example.com",
|
|
||||||
"priority": 10
|
|
||||||
})
|
|
||||||
assert result is not None
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
pytest.main([__file__])
|
|
||||||
'''
|
|
||||||
|
|
||||||
return test_content
|
|
||||||
|
|
||||||
def apply_all_fixes():
|
|
||||||
"""Apply all the fixes to the test suite."""
|
|
||||||
print("🚀 Starting comprehensive test fix process...")
|
|
||||||
|
|
||||||
# Create updated conftest.py
|
|
||||||
print("📝 Creating updated conftest.py...")
|
|
||||||
conftest_content = create_updated_conftest()
|
|
||||||
with open("tests/conftest.py", "w") as f:
|
|
||||||
f.write(conftest_content)
|
|
||||||
|
|
||||||
# Create updated test_mcp_server.py
|
|
||||||
print("📝 Creating updated test_mcp_server.py...")
|
|
||||||
test_content = create_updated_test_mcp_server()
|
|
||||||
with open("tests/test_mcp_server.py", "w") as f:
|
|
||||||
f.write(test_content)
|
|
||||||
|
|
||||||
print("✅ Test fixes applied successfully!")
|
|
||||||
print("\\n🧪 To run the tests:")
|
|
||||||
print(" pytest tests/ -v")
|
|
||||||
print(" pytest tests/ -m mcp")
|
|
||||||
print(" python run_tests.py --type mcp")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
apply_all_fixes()
|
|
||||||
'''
|
|
||||||
|
|
||||||
return fix_script
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
issues, fixes = analyze_test_structure()
|
|
||||||
|
|
||||||
print(f"\n📊 Summary:")
|
|
||||||
print(f" Issues found: {len(issues)}")
|
|
||||||
print(f" Fixes needed: {len(fixes)}")
|
|
||||||
|
|
||||||
print(f"\n🛠️ Creating comprehensive fix script...")
|
|
||||||
fix_script = create_fix_script()
|
|
||||||
|
|
||||||
# Write the fix script
|
|
||||||
with open("/home/rpm/claude/vultr-dns-mcp-fix/comprehensive_test_fix.py", "w") as f:
|
|
||||||
f.write(fix_script)
|
|
||||||
|
|
||||||
print(f"✅ Fix script created: comprehensive_test_fix.py")
|
|
||||||
print(f"\n🎯 Key fixes to apply:")
|
|
||||||
for i, fix in enumerate(fixes, 1):
|
|
||||||
print(f" {i}. {fix}")
|
|
||||||
|
|
||||||
print(f"\n🚀 Next steps:")
|
|
||||||
print(f" 1. Clone the repository")
|
|
||||||
print(f" 2. Run the comprehensive fix script")
|
|
||||||
print(f" 3. Test the fixes with pytest")
|
|
Loading…
x
Reference in New Issue
Block a user