"""Integration tests for Calendar VEVENT update MCP tools - extended fields."""
import json
import logging
from datetime import datetime, timedelta
import pytest
from mcp import ClientSession
from nextcloud_mcp_server.client import NextcloudClient
logger = logging.getLogger(__name__)
pytestmark = pytest.mark.integration
async def test_mcp_update_event_extended_fields(
nc_mcp_client: ClientSession, nc_client: NextcloudClient, temporary_calendar: str
):
"""Test updating categories, recurrence_rule, attendees, and reminder_minutes via MCP."""
calendar_name = temporary_calendar
event_uid = None
try:
# 1. Create a base event via MCP
tomorrow = datetime.now() + timedelta(days=1)
create_result = await nc_mcp_client.call_tool(
"nc_calendar_create_event",
{
"calendar_name": calendar_name,
"title": "Extended Fields MCP Test",
"start_datetime": tomorrow.strftime("%Y-%m-%dT14:00:00"),
"end_datetime": tomorrow.strftime("%Y-%m-%dT15:00:00"),
"description": "Base event for MCP extended-field update test",
},
)
assert create_result.isError is False, (
f"MCP event creation failed: {create_result.content}"
)
result_data = json.loads(create_result.content[0].text)
event_uid = result_data["uid"]
logger.info(f"Created base event via MCP: {event_uid}")
# 2. Update with all four extended fields via MCP
update_result = await nc_mcp_client.call_tool(
"nc_calendar_update_event",
{
"calendar_name": calendar_name,
"event_uid": event_uid,
"categories": "work,meeting",
"recurrence_rule": "FREQ=WEEKLY;COUNT=4",
"attendees": "alice@example.com,bob@example.com",
"reminder_minutes": 15,
},
)
assert update_result.isError is False, (
f"MCP event update failed: {update_result.content}"
)
# 3. Verify via direct client
event, _ = await nc_client.calendar.get_event(calendar_name, event_uid)
# Categories
assert "work" in event.get("categories", ""), (
f"Expected 'work' in categories, got: {event.get('categories')}"
)
assert "meeting" in event.get("categories", ""), (
f"Expected 'meeting' in categories, got: {event.get('categories')}"
)
# Recurrence
assert event.get("recurring") is True, "Expected event to be recurring"
assert "WEEKLY" in event.get("recurrence_rule", ""), (
f"Expected WEEKLY in rrule, got: {event.get('recurrence_rule')}"
)
# Attendees
attendees = event.get("attendees", "")
assert "alice@example.com" in attendees, (
f"Expected alice in attendees, got: {attendees}"
)
assert "bob@example.com" in attendees, (
f"Expected bob in attendees, got: {attendees}"
)
logger.info("MCP extended fields update verified successfully")
# 4. Clear all four fields via MCP
clear_result = await nc_mcp_client.call_tool(
"nc_calendar_update_event",
{
"calendar_name": calendar_name,
"event_uid": event_uid,
"categories": "",
"recurrence_rule": "",
"attendees": "",
"reminder_minutes": 0,
},
)
assert clear_result.isError is False, (
f"MCP event clear failed: {clear_result.content}"
)
# 5. Verify fields cleared
cleared, _ = await nc_client.calendar.get_event(calendar_name, event_uid)
assert not cleared.get("categories"), (
f"Expected categories cleared, got: {cleared.get('categories')}"
)
assert cleared.get("recurring") is not True, (
f"Expected recurring cleared, got: {cleared.get('recurring')}"
)
assert not cleared.get("attendees"), (
f"Expected attendees cleared, got: {cleared.get('attendees')}"
)
logger.info("MCP extended fields clear verified successfully")
finally:
if event_uid:
try:
await nc_client.calendar.delete_event(calendar_name, event_uid)
except Exception:
pass