"""
Test Calendar MCP endpoints.
"""
import requests
from datetime import datetime, timedelta
BASE_URL = "http://localhost:8001"
def test_calendar_list_events():
"""Test listing calendar events."""
print("\n=== Testing Calendar List Events ===")
response = requests.get(f"{BASE_URL}/calendar/events?limit=5")
print(f"Status: {response.status_code}")
assert response.status_code == 200, f"Expected 200, got {response.status_code}"
data = response.json()
assert 'events' in data, "Response should contain events"
events = data['events']
print(f"✓ Found {len(events)} events")
if events:
event = events[0]
print(f" First event: {event.get('subject')} at {event.get('start', {}).get('dateTime')}")
return event.get('id')
return None
def test_calendar_tentative_accept(event_id=None):
"""Test tentatively accepting a calendar event."""
print("\n=== Testing Calendar Tentative Accept ===")
# Get an event if not provided
if not event_id:
response = requests.get(f"{BASE_URL}/calendar/events?limit=1")
if response.status_code == 200:
events = response.json().get("events", [])
if events:
event_id = events[0].get("id")
print(f"Using event: {events[0].get('subject')}")
if not event_id:
print("⚠ No event available to test")
return True # Skip test
# Try to tentatively accept
response = requests.post(
f"{BASE_URL}/calendar/events/{event_id}/tentativelyAccept",
json="Testing tentative accept from IRIS MCP"
)
print(f"Status: {response.status_code}")
if response.status_code == 200:
data = response.json()
print(f"✓ Tentatively accepted: {data.get('message')}")
return True
elif "you're the meeting organizer" in response.text.lower():
print("✓ Endpoint works correctly (can't respond to own meetings)")
return True # This is expected behavior
else:
print(f"Response: {response.text}")
return False
def test_calendar_propose_new_time(event_id=None):
"""Test proposing a new time for a calendar event."""
print("\n=== Testing Calendar Propose New Time ===")
# Get an event if not provided
if not event_id:
response = requests.get(f"{BASE_URL}/calendar/events?limit=1")
if response.status_code == 200:
events = response.json().get("events", [])
if events:
event = events[0]
event_id = event.get("id")
print(f"Using event: {event.get('subject')}")
original_start = event.get("start", {}).get("dateTime", "2025-10-15T10:00:00")
else:
print("⚠ No event available to test")
return True
else:
print("⚠ No event available to test")
return True
else:
original_start = "2025-10-15T10:00:00"
# Propose a new time (1 hour later)
start_dt = datetime.fromisoformat(original_start.replace('Z', '+00:00').split('.')[0])
new_start = start_dt + timedelta(hours=1)
new_end = new_start + timedelta(hours=1)
payload = {
"event_id": event_id,
"start_datetime": new_start.strftime("%Y-%m-%dT%H:%M:%S"),
"end_datetime": new_end.strftime("%Y-%m-%dT%H:%M:%S"),
"comment": "Proposing a better time slot from IRIS MCP"
}
response = requests.post(f"{BASE_URL}/calendar/events/proposeNewTime", json=payload)
print(f"Status: {response.status_code}")
if response.status_code == 200:
data = response.json()
print(f"✓ Proposed new time: {data.get('message')}")
if data.get('proposed_time'):
print(f" Start: {data['proposed_time']['start']}")
print(f" End: {data['proposed_time']['end']}")
return True
elif "you're the meeting organizer" in response.text.lower():
print("✓ Endpoint works correctly (can't propose time for own meetings)")
return True # This is expected behavior
else:
print(f"Response: {response.text}")
return False
def test_find_meeting_times():
"""Test finding available meeting times."""
print("\n=== Testing Find Meeting Times ===")
# Test data
payload = {
"attendees": ["filippo.savarese@infocert.it"],
"duration_minutes": 60,
"start_date": datetime.now().strftime("%Y-%m-%d"),
"end_date": (datetime.now() + timedelta(days=7)).strftime("%Y-%m-%d"),
"max_candidates": 3
}
response = requests.post(f"{BASE_URL}/calendar/findMeetingTimes", json=payload)
print(f"Status: {response.status_code}")
assert response.status_code == 200, f"Expected 200, got {response.status_code}"
data = response.json()
assert 'suggestions' in data, "Response should contain suggestions"
suggestions = data['suggestions']
print(f"✓ Found {len(suggestions)} meeting time suggestions")
if suggestions:
first = suggestions[0]
print(f" First suggestion: {first.get('start', {}).get('dateTime')} - {first.get('end', {}).get('dateTime')}")
return True
def test_get_schedule():
"""Test getting schedule for attendees."""
print("\n=== Testing Get Schedule ===")
# Test data
payload = {
"schedules": ["filippo.savarese@infocert.it"],
"start_time": datetime.now().strftime("%Y-%m-%dT09:00:00"),
"end_time": (datetime.now() + timedelta(days=1)).strftime("%Y-%m-%dT17:00:00"),
"availability_view_interval": 30
}
response = requests.post(f"{BASE_URL}/calendar/getSchedule", json=payload)
print(f"Status: {response.status_code}")
assert response.status_code == 200, f"Expected 200, got {response.status_code}"
data = response.json()
assert 'schedules' in data, "Response should contain schedules"
schedules = data['schedules']
print(f"✓ Retrieved schedule for {len(schedules)} attendees")
if schedules:
first = schedules[0]
print(f" Attendee: {first.get('scheduleId')}")
print(f" Availability: {first.get('availabilityView', '')[:20]}...")
return True
if __name__ == "__main__":
print("=" * 60)
print("IRIS MCP Server - Calendar Tests")
print("=" * 60)
results = {}
try:
event_id = test_calendar_list_events()
results['list_events'] = True
except AssertionError as e:
print(f"✗ List events failed: {e}")
results['list_events'] = False
event_id = None
try:
results['tentative_accept'] = test_calendar_tentative_accept(event_id)
except AssertionError as e:
print(f"✗ Tentative accept failed: {e}")
results['tentative_accept'] = False
try:
results['propose_new_time'] = test_calendar_propose_new_time(event_id)
except AssertionError as e:
print(f"✗ Propose new time failed: {e}")
results['propose_new_time'] = False
try:
results['find_meeting_times'] = test_find_meeting_times()
except AssertionError as e:
print(f"✗ Find meeting times failed: {e}")
results['find_meeting_times'] = False
try:
results['get_schedule'] = test_get_schedule()
except AssertionError as e:
print(f"✗ Get schedule failed: {e}")
results['get_schedule'] = False
# Summary
print("\n" + "=" * 60)
print("TEST SUMMARY")
print("=" * 60)
passed = sum(1 for v in results.values() if v)
total = len(results)
for test, result in results.items():
status = "✓ PASS" if result else "✗ FAIL"
print(f"{status} - {test}")
print(f"\nPassed: {passed}/{total} ({passed/total*100:.0f}%)")
print("=" * 60)
exit(0 if passed == total else 1)