122 lines
4.3 KiB
Python
122 lines
4.3 KiB
Python
"""Tests for the Vultr DNS server module."""
|
|
|
|
import pytest
|
|
from unittest.mock import AsyncMock, patch
|
|
from vultr_dns_mcp.server import VultrDNSServer, create_mcp_server
|
|
|
|
|
|
class TestVultrDNSServer:
|
|
"""Test cases for VultrDNSServer class."""
|
|
|
|
def test_init(self):
|
|
"""Test server initialization."""
|
|
server = VultrDNSServer("test-api-key")
|
|
assert server.api_key == "test-api-key"
|
|
assert server.headers["Authorization"] == "Bearer test-api-key"
|
|
assert server.headers["Content-Type"] == "application/json"
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_make_request_success(self):
|
|
"""Test successful API request."""
|
|
server = VultrDNSServer("test-api-key")
|
|
|
|
with patch('httpx.AsyncClient') as mock_client:
|
|
mock_response = AsyncMock()
|
|
mock_response.status_code = 200
|
|
mock_response.json.return_value = {"test": "data"}
|
|
|
|
mock_client.return_value.__aenter__.return_value.request.return_value = mock_response
|
|
|
|
result = await server._make_request("GET", "/test")
|
|
assert result == {"test": "data"}
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_make_request_error(self):
|
|
"""Test API request error handling."""
|
|
server = VultrDNSServer("test-api-key")
|
|
|
|
with patch('httpx.AsyncClient') as mock_client:
|
|
mock_response = AsyncMock()
|
|
mock_response.status_code = 400
|
|
mock_response.text = "Bad Request"
|
|
|
|
mock_client.return_value.__aenter__.return_value.request.return_value = mock_response
|
|
|
|
with pytest.raises(Exception) as exc_info:
|
|
await server._make_request("GET", "/test")
|
|
|
|
assert "Vultr API error 400" in str(exc_info.value)
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_list_domains(self):
|
|
"""Test listing domains."""
|
|
server = VultrDNSServer("test-api-key")
|
|
|
|
with patch.object(server, '_make_request') as mock_request:
|
|
mock_request.return_value = {"domains": [{"domain": "example.com"}]}
|
|
|
|
result = await server.list_domains()
|
|
assert result == [{"domain": "example.com"}]
|
|
mock_request.assert_called_once_with("GET", "/domains")
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_create_domain(self):
|
|
"""Test creating a domain."""
|
|
server = VultrDNSServer("test-api-key")
|
|
|
|
with patch.object(server, '_make_request') as mock_request:
|
|
mock_request.return_value = {"domain": "example.com"}
|
|
|
|
result = await server.create_domain("example.com", "192.168.1.1")
|
|
assert result == {"domain": "example.com"}
|
|
mock_request.assert_called_once_with(
|
|
"POST",
|
|
"/domains",
|
|
{"domain": "example.com", "ip": "192.168.1.1"}
|
|
)
|
|
|
|
|
|
class TestMCPServer:
|
|
"""Test cases for MCP server creation."""
|
|
|
|
def test_create_mcp_server_with_api_key(self):
|
|
"""Test creating MCP server with API key."""
|
|
server = create_mcp_server("test-api-key")
|
|
assert server is not None
|
|
assert server.name == "Vultr DNS Manager"
|
|
|
|
def test_create_mcp_server_without_api_key(self):
|
|
"""Test creating MCP server without API key raises error."""
|
|
with pytest.raises(ValueError) as exc_info:
|
|
create_mcp_server()
|
|
|
|
assert "VULTR_API_KEY must be provided" in str(exc_info.value)
|
|
|
|
@patch.dict('os.environ', {'VULTR_API_KEY': 'env-api-key'})
|
|
def test_create_mcp_server_from_env(self):
|
|
"""Test creating MCP server with API key from environment."""
|
|
server = create_mcp_server()
|
|
assert server is not None
|
|
assert server.name == "Vultr DNS Manager"
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_vultr_server():
|
|
"""Fixture for mocked VultrDNSServer."""
|
|
with patch('vultr_dns_mcp.server.VultrDNSServer') as mock:
|
|
yield mock
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_validation_tool():
|
|
"""Test DNS record validation functionality."""
|
|
from vultr_dns_mcp.server import create_mcp_server
|
|
|
|
# Create server (this will fail without API key, but we can test the structure)
|
|
with pytest.raises(ValueError):
|
|
create_mcp_server()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pytest.main([__file__])
|