lepanto1571's picture
Upload 17 files
a1e520f verified
"""Tests for MCP context and response validation."""
import json
import pytest
from pathlib import Path
from jsonschema import validate, ValidationError
from schema import MCP_CONTEXT_SCHEMA, MCP_PREDICT_RESPONSE_SCHEMA
from utils import format_results_to_mcp, get_mcp_context
def test_mcp_context_schema():
"""Test that the MCP context follows the schema."""
context = get_mcp_context()
validate(instance=context, schema=MCP_CONTEXT_SCHEMA)
# Test required fields
assert "app" in context
assert "id" in context["app"]
assert "name" in context["app"]
assert "version" in context["app"]
# Test windows configuration
assert "windows" in context
assert len(context["windows"]) > 0
assert "objects" in context["windows"][0]["view"]
# Test objects configuration
assert "objects" in context
file_objects = [obj for obj in context["objects"] if obj["type"] == "file"]
assert len(file_objects) >= 2 # At least ligand and protein
# Test actions configuration
assert "actions" in context
assert len(context["actions"]) >= 1
for action in context["actions"]:
assert "parameters" in action
assert "output" in action
def test_mcp_response_format():
"""Test that the MCP response formatter produces valid output."""
# Test successful case
csv_text = "molecule,test1,test2\nmol1,True,False\n"
response = format_results_to_mcp(csv_text, "", "mol1")
validate(instance=response, schema=MCP_PREDICT_RESPONSE_SCHEMA)
assert response["object_id"] == "validation_results"
assert "columns" in response["data"]
assert "rows" in response["data"]
assert len(response["data"]["rows"]) == 1
# Test error case
response = format_results_to_mcp("", "Error occurred", "mol1")
validate(instance=response, schema=MCP_PREDICT_RESPONSE_SCHEMA)
assert response["data"]["rows"][0][1] == "❌" # Status should be fail
def test_mcp_response_content():
"""Test the content of MCP responses for different scenarios."""
# Test all tests passing
csv_text = "molecule,test1,test2\nmol1,True,True\n"
response = format_results_to_mcp(csv_text, "", "mol1")
row = response["data"]["rows"][0]
assert row[1] == "✅" # Status
assert row[2] == "2/2" # Passed/Total
assert row[3] == "All tests passed" # Details
# Test some tests failing
csv_text = "molecule,test1,test2,test3\nmol1,True,False,False\n"
response = format_results_to_mcp(csv_text, "", "mol1")
row = response["data"]["rows"][0]
assert row[1] == "❌" # Status
assert row[2] == "1/3" # Passed/Total
assert "test2" in row[3] and "test3" in row[3] # Failed tests in details
def test_invalid_mcp_context():
"""Test that invalid MCP context raises ValidationError."""
invalid_context = {
"app": {"name": "Test"} # Missing required fields
}
with pytest.raises(ValidationError):
validate(instance=invalid_context, schema=MCP_CONTEXT_SCHEMA)
def test_invalid_mcp_response():
"""Test that invalid MCP response raises ValidationError."""
invalid_response = {
"object_id": "validation_results",
"data": {
"columns": ["col1"],
"rows": [["too", "many", "columns"]] # Inconsistent columns
}
}
with pytest.raises(ValidationError) as exc_info:
# First validate that rows match column count
columns_count = len(invalid_response["data"]["columns"])
for row in invalid_response["data"]["rows"]:
if len(row) != columns_count:
raise ValidationError(f"Row length {len(row)} does not match columns length {columns_count}")
# Then validate schema
validate(instance=invalid_response, schema=MCP_PREDICT_RESPONSE_SCHEMA)
assert "Row length" in str(exc_info.value)