da104c59ac
_merge_ical_properties() only handled a subset of event fields, silently dropping categories, recurrence_rule, attendees, and reminder_minutes during updates. These fields were fully supported by _create_ical_event() and accepted by the MCP tool, but never applied. Closes #544 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
125 lines
4.4 KiB
Python
125 lines
4.4 KiB
Python
"""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
|