test: Replace test_*_clients with single nc_client for tests
This commit is contained in:
+1
-1
@@ -13,7 +13,7 @@ from nextcloud_mcp_server.client import NextcloudClient
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="module")
|
||||||
async def nc_client() -> AsyncGenerator[NextcloudClient, Any]:
|
async def nc_client() -> AsyncGenerator[NextcloudClient, Any]:
|
||||||
"""
|
"""
|
||||||
Fixture to create a NextcloudClient instance for integration tests.
|
Fixture to create a NextcloudClient instance for integration tests.
|
||||||
|
|||||||
@@ -15,16 +15,6 @@ logger = logging.getLogger(__name__)
|
|||||||
pytestmark = pytest.mark.integration
|
pytestmark = pytest.mark.integration
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
async def calendar_test_client():
|
|
||||||
"""Create a new, isolated NextcloudClient for calendar tests."""
|
|
||||||
client = NextcloudClient.from_env()
|
|
||||||
try:
|
|
||||||
yield client
|
|
||||||
finally:
|
|
||||||
await client.close()
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def test_calendar_name():
|
def test_calendar_name():
|
||||||
"""Unique calendar name for testing."""
|
"""Unique calendar name for testing."""
|
||||||
@@ -32,16 +22,14 @@ def test_calendar_name():
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
async def temporary_calendar(
|
async def temporary_calendar(nc_client: NextcloudClient, test_calendar_name: str):
|
||||||
calendar_test_client: NextcloudClient, test_calendar_name: str
|
|
||||||
):
|
|
||||||
"""Create a temporary calendar for testing and clean up afterward."""
|
"""Create a temporary calendar for testing and clean up afterward."""
|
||||||
calendar_name = test_calendar_name
|
calendar_name = test_calendar_name
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Create a test calendar
|
# Create a test calendar
|
||||||
logger.info(f"Creating temporary calendar: {calendar_name}")
|
logger.info(f"Creating temporary calendar: {calendar_name}")
|
||||||
result = await calendar_test_client.calendar.create_calendar(
|
result = await nc_client.calendar.create_calendar(
|
||||||
calendar_name=calendar_name,
|
calendar_name=calendar_name,
|
||||||
display_name=f"Test Calendar {calendar_name}",
|
display_name=f"Test Calendar {calendar_name}",
|
||||||
description="Temporary calendar for integration testing",
|
description="Temporary calendar for integration testing",
|
||||||
@@ -62,16 +50,14 @@ async def temporary_calendar(
|
|||||||
# Cleanup: Delete the temporary calendar
|
# Cleanup: Delete the temporary calendar
|
||||||
try:
|
try:
|
||||||
logger.info(f"Cleaning up temporary calendar: {calendar_name}")
|
logger.info(f"Cleaning up temporary calendar: {calendar_name}")
|
||||||
await calendar_test_client.calendar.delete_calendar(calendar_name)
|
await nc_client.calendar.delete_calendar(calendar_name)
|
||||||
logger.info(f"Successfully deleted temporary calendar: {calendar_name}")
|
logger.info(f"Successfully deleted temporary calendar: {calendar_name}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error deleting temporary calendar {calendar_name}: {e}")
|
logger.error(f"Error deleting temporary calendar {calendar_name}: {e}")
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
async def temporary_event(
|
async def temporary_event(nc_client: NextcloudClient, temporary_calendar: str):
|
||||||
calendar_test_client: NextcloudClient, temporary_calendar: str
|
|
||||||
):
|
|
||||||
"""Create a temporary event for testing and clean up afterward."""
|
"""Create a temporary event for testing and clean up afterward."""
|
||||||
event_uid = None
|
event_uid = None
|
||||||
calendar_name = temporary_calendar
|
calendar_name = temporary_calendar
|
||||||
@@ -91,9 +77,7 @@ async def temporary_event(
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
logger.info(f"Creating temporary event in calendar: {calendar_name}")
|
logger.info(f"Creating temporary event in calendar: {calendar_name}")
|
||||||
result = await calendar_test_client.calendar.create_event(
|
result = await nc_client.calendar.create_event(calendar_name, event_data)
|
||||||
calendar_name, event_data
|
|
||||||
)
|
|
||||||
event_uid = result.get("uid")
|
event_uid = result.get("uid")
|
||||||
|
|
||||||
if not event_uid:
|
if not event_uid:
|
||||||
@@ -107,9 +91,7 @@ async def temporary_event(
|
|||||||
if event_uid:
|
if event_uid:
|
||||||
try:
|
try:
|
||||||
logger.info(f"Cleaning up temporary event: {event_uid}")
|
logger.info(f"Cleaning up temporary event: {event_uid}")
|
||||||
await calendar_test_client.calendar.delete_event(
|
await nc_client.calendar.delete_event(calendar_name, event_uid)
|
||||||
calendar_name, event_uid
|
|
||||||
)
|
|
||||||
logger.info(f"Successfully deleted temporary event: {event_uid}")
|
logger.info(f"Successfully deleted temporary event: {event_uid}")
|
||||||
except HTTPStatusError as e:
|
except HTTPStatusError as e:
|
||||||
if e.response.status_code != 404:
|
if e.response.status_code != 404:
|
||||||
@@ -120,9 +102,9 @@ async def temporary_event(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_list_calendars(calendar_test_client: NextcloudClient):
|
async def test_list_calendars(nc_client: NextcloudClient):
|
||||||
"""Test listing available calendars."""
|
"""Test listing available calendars."""
|
||||||
calendars = await calendar_test_client.calendar.list_calendars()
|
calendars = await nc_client.calendar.list_calendars()
|
||||||
|
|
||||||
assert isinstance(calendars, list)
|
assert isinstance(calendars, list)
|
||||||
|
|
||||||
@@ -144,7 +126,7 @@ async def test_list_calendars(calendar_test_client: NextcloudClient):
|
|||||||
|
|
||||||
|
|
||||||
async def test_create_and_delete_event(
|
async def test_create_and_delete_event(
|
||||||
calendar_test_client: NextcloudClient, temporary_calendar: str
|
nc_client: NextcloudClient, temporary_calendar: str
|
||||||
):
|
):
|
||||||
"""Test creating and deleting a basic event."""
|
"""Test creating and deleting a basic event."""
|
||||||
calendar_name = temporary_calendar
|
calendar_name = temporary_calendar
|
||||||
@@ -163,9 +145,7 @@ async def test_create_and_delete_event(
|
|||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = await calendar_test_client.calendar.create_event(
|
result = await nc_client.calendar.create_event(calendar_name, event_data)
|
||||||
calendar_name, event_data
|
|
||||||
)
|
|
||||||
assert "uid" in result
|
assert "uid" in result
|
||||||
assert result["status_code"] in [200, 201, 204]
|
assert result["status_code"] in [200, 201, 204]
|
||||||
|
|
||||||
@@ -173,7 +153,7 @@ async def test_create_and_delete_event(
|
|||||||
logger.info(f"Created event with UID: {event_uid}")
|
logger.info(f"Created event with UID: {event_uid}")
|
||||||
|
|
||||||
# Verify event was created by retrieving it
|
# Verify event was created by retrieving it
|
||||||
retrieved_event, etag = await calendar_test_client.calendar.get_event(
|
retrieved_event, etag = await nc_client.calendar.get_event(
|
||||||
calendar_name, event_uid
|
calendar_name, event_uid
|
||||||
)
|
)
|
||||||
assert retrieved_event["uid"] == event_uid
|
assert retrieved_event["uid"] == event_uid
|
||||||
@@ -181,9 +161,7 @@ async def test_create_and_delete_event(
|
|||||||
assert retrieved_event["location"] == "Test Room"
|
assert retrieved_event["location"] == "Test Room"
|
||||||
|
|
||||||
# Delete event
|
# Delete event
|
||||||
delete_result = await calendar_test_client.calendar.delete_event(
|
delete_result = await nc_client.calendar.delete_event(calendar_name, event_uid)
|
||||||
calendar_name, event_uid
|
|
||||||
)
|
|
||||||
assert delete_result["status_code"] in [200, 204, 404]
|
assert delete_result["status_code"] in [200, 204, 404]
|
||||||
|
|
||||||
logger.info(f"Successfully deleted event: {event_uid}")
|
logger.info(f"Successfully deleted event: {event_uid}")
|
||||||
@@ -194,7 +172,7 @@ async def test_create_and_delete_event(
|
|||||||
|
|
||||||
|
|
||||||
async def test_create_all_day_event(
|
async def test_create_all_day_event(
|
||||||
calendar_test_client: NextcloudClient, temporary_calendar: str
|
nc_client: NextcloudClient, temporary_calendar: str
|
||||||
):
|
):
|
||||||
"""Test creating an all-day event."""
|
"""Test creating an all-day event."""
|
||||||
calendar_name = temporary_calendar
|
calendar_name = temporary_calendar
|
||||||
@@ -209,21 +187,19 @@ async def test_create_all_day_event(
|
|||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = await calendar_test_client.calendar.create_event(
|
result = await nc_client.calendar.create_event(calendar_name, event_data)
|
||||||
calendar_name, event_data
|
|
||||||
)
|
|
||||||
event_uid = result["uid"]
|
event_uid = result["uid"]
|
||||||
logger.info(f"Created all-day event with UID: {event_uid}")
|
logger.info(f"Created all-day event with UID: {event_uid}")
|
||||||
|
|
||||||
# Verify event
|
# Verify event
|
||||||
retrieved_event, _ = await calendar_test_client.calendar.get_event(
|
retrieved_event, _ = await nc_client.calendar.get_event(
|
||||||
calendar_name, event_uid
|
calendar_name, event_uid
|
||||||
)
|
)
|
||||||
assert retrieved_event["title"] == "All Day Test Event"
|
assert retrieved_event["title"] == "All Day Test Event"
|
||||||
assert retrieved_event.get("all_day") is True
|
assert retrieved_event.get("all_day") is True
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
await calendar_test_client.calendar.delete_event(calendar_name, event_uid)
|
await nc_client.calendar.delete_event(calendar_name, event_uid)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"All-day event test failed: {e}")
|
logger.error(f"All-day event test failed: {e}")
|
||||||
@@ -231,7 +207,7 @@ async def test_create_all_day_event(
|
|||||||
|
|
||||||
|
|
||||||
async def test_create_recurring_event(
|
async def test_create_recurring_event(
|
||||||
calendar_test_client: NextcloudClient, temporary_calendar: str
|
nc_client: NextcloudClient, temporary_calendar: str
|
||||||
):
|
):
|
||||||
"""Test creating a recurring event."""
|
"""Test creating a recurring event."""
|
||||||
calendar_name = temporary_calendar
|
calendar_name = temporary_calendar
|
||||||
@@ -248,30 +224,26 @@ async def test_create_recurring_event(
|
|||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = await calendar_test_client.calendar.create_event(
|
result = await nc_client.calendar.create_event(calendar_name, event_data)
|
||||||
calendar_name, event_data
|
|
||||||
)
|
|
||||||
event_uid = result["uid"]
|
event_uid = result["uid"]
|
||||||
logger.info(f"Created recurring event with UID: {event_uid}")
|
logger.info(f"Created recurring event with UID: {event_uid}")
|
||||||
|
|
||||||
# Verify event
|
# Verify event
|
||||||
retrieved_event, _ = await calendar_test_client.calendar.get_event(
|
retrieved_event, _ = await nc_client.calendar.get_event(
|
||||||
calendar_name, event_uid
|
calendar_name, event_uid
|
||||||
)
|
)
|
||||||
assert retrieved_event["title"] == "Weekly Recurring Test"
|
assert retrieved_event["title"] == "Weekly Recurring Test"
|
||||||
assert retrieved_event.get("recurring") is True
|
assert retrieved_event.get("recurring") is True
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
await calendar_test_client.calendar.delete_event(calendar_name, event_uid)
|
await nc_client.calendar.delete_event(calendar_name, event_uid)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Recurring event test failed: {e}")
|
logger.error(f"Recurring event test failed: {e}")
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
async def test_list_events_in_range(
|
async def test_list_events_in_range(nc_client: NextcloudClient, temporary_event: dict):
|
||||||
calendar_test_client: NextcloudClient, temporary_event: dict
|
|
||||||
):
|
|
||||||
"""Test listing events within a date range."""
|
"""Test listing events within a date range."""
|
||||||
calendar_name = temporary_event["calendar_name"]
|
calendar_name = temporary_event["calendar_name"]
|
||||||
|
|
||||||
@@ -279,7 +251,7 @@ async def test_list_events_in_range(
|
|||||||
start_datetime = datetime.now()
|
start_datetime = datetime.now()
|
||||||
end_datetime = datetime.now() + timedelta(days=7)
|
end_datetime = datetime.now() + timedelta(days=7)
|
||||||
|
|
||||||
events = await calendar_test_client.calendar.get_calendar_events(
|
events = await nc_client.calendar.get_calendar_events(
|
||||||
calendar_name=calendar_name,
|
calendar_name=calendar_name,
|
||||||
start_datetime=start_datetime,
|
start_datetime=start_datetime,
|
||||||
end_datetime=end_datetime,
|
end_datetime=end_datetime,
|
||||||
@@ -300,9 +272,7 @@ async def test_list_events_in_range(
|
|||||||
assert "start_datetime" in event
|
assert "start_datetime" in event
|
||||||
|
|
||||||
|
|
||||||
async def test_update_event(
|
async def test_update_event(nc_client: NextcloudClient, temporary_event: dict):
|
||||||
calendar_test_client: NextcloudClient, temporary_event: dict
|
|
||||||
):
|
|
||||||
"""Test updating an existing event."""
|
"""Test updating an existing event."""
|
||||||
calendar_name = temporary_event["calendar_name"]
|
calendar_name = temporary_event["calendar_name"]
|
||||||
event_uid = temporary_event["uid"]
|
event_uid = temporary_event["uid"]
|
||||||
@@ -316,15 +286,13 @@ async def test_update_event(
|
|||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = await calendar_test_client.calendar.update_event(
|
result = await nc_client.calendar.update_event(
|
||||||
calendar_name, event_uid, updated_data
|
calendar_name, event_uid, updated_data
|
||||||
)
|
)
|
||||||
assert result["uid"] == event_uid
|
assert result["uid"] == event_uid
|
||||||
|
|
||||||
# Verify updates
|
# Verify updates
|
||||||
updated_event, _ = await calendar_test_client.calendar.get_event(
|
updated_event, _ = await nc_client.calendar.get_event(calendar_name, event_uid)
|
||||||
calendar_name, event_uid
|
|
||||||
)
|
|
||||||
assert updated_event["title"] == "Updated Test Event Title"
|
assert updated_event["title"] == "Updated Test Event Title"
|
||||||
assert updated_event["description"] == "Updated description for test event"
|
assert updated_event["description"] == "Updated description for test event"
|
||||||
assert updated_event["location"] == "Updated Location"
|
assert updated_event["location"] == "Updated Location"
|
||||||
@@ -338,7 +306,7 @@ async def test_update_event(
|
|||||||
|
|
||||||
|
|
||||||
async def test_create_event_with_attendees(
|
async def test_create_event_with_attendees(
|
||||||
calendar_test_client: NextcloudClient, temporary_calendar: str
|
nc_client: NextcloudClient, temporary_calendar: str
|
||||||
):
|
):
|
||||||
"""Test creating an event with attendees."""
|
"""Test creating an event with attendees."""
|
||||||
calendar_name = temporary_calendar
|
calendar_name = temporary_calendar
|
||||||
@@ -356,14 +324,12 @@ async def test_create_event_with_attendees(
|
|||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = await calendar_test_client.calendar.create_event(
|
result = await nc_client.calendar.create_event(calendar_name, event_data)
|
||||||
calendar_name, event_data
|
|
||||||
)
|
|
||||||
event_uid = result["uid"]
|
event_uid = result["uid"]
|
||||||
logger.info(f"Created event with attendees, UID: {event_uid}")
|
logger.info(f"Created event with attendees, UID: {event_uid}")
|
||||||
|
|
||||||
# Verify event
|
# Verify event
|
||||||
retrieved_event, _ = await calendar_test_client.calendar.get_event(
|
retrieved_event, _ = await nc_client.calendar.get_event(
|
||||||
calendar_name, event_uid
|
calendar_name, event_uid
|
||||||
)
|
)
|
||||||
assert retrieved_event["title"] == "Meeting with Attendees"
|
assert retrieved_event["title"] == "Meeting with Attendees"
|
||||||
@@ -371,7 +337,7 @@ async def test_create_event_with_attendees(
|
|||||||
assert retrieved_event["status"] == "TENTATIVE"
|
assert retrieved_event["status"] == "TENTATIVE"
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
await calendar_test_client.calendar.delete_event(calendar_name, event_uid)
|
await nc_client.calendar.delete_event(calendar_name, event_uid)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Event with attendees test failed: {e}")
|
logger.error(f"Event with attendees test failed: {e}")
|
||||||
@@ -379,33 +345,33 @@ async def test_create_event_with_attendees(
|
|||||||
|
|
||||||
|
|
||||||
async def test_get_nonexistent_event(
|
async def test_get_nonexistent_event(
|
||||||
calendar_test_client: NextcloudClient, temporary_calendar: str
|
nc_client: NextcloudClient, temporary_calendar: str
|
||||||
):
|
):
|
||||||
"""Test retrieving a non-existent event."""
|
"""Test retrieving a non-existent event."""
|
||||||
calendar_name = temporary_calendar
|
calendar_name = temporary_calendar
|
||||||
fake_uid = f"nonexistent-{uuid.uuid4()}"
|
fake_uid = f"nonexistent-{uuid.uuid4()}"
|
||||||
|
|
||||||
with pytest.raises(HTTPStatusError) as exc_info:
|
with pytest.raises(HTTPStatusError) as exc_info:
|
||||||
await calendar_test_client.calendar.get_event(calendar_name, fake_uid)
|
await nc_client.calendar.get_event(calendar_name, fake_uid)
|
||||||
|
|
||||||
assert exc_info.value.response.status_code == 404
|
assert exc_info.value.response.status_code == 404
|
||||||
logger.info(f"Correctly got 404 for nonexistent event: {fake_uid}")
|
logger.info(f"Correctly got 404 for nonexistent event: {fake_uid}")
|
||||||
|
|
||||||
|
|
||||||
async def test_delete_nonexistent_event(
|
async def test_delete_nonexistent_event(
|
||||||
calendar_test_client: NextcloudClient, temporary_calendar: str
|
nc_client: NextcloudClient, temporary_calendar: str
|
||||||
):
|
):
|
||||||
"""Test deleting a non-existent event."""
|
"""Test deleting a non-existent event."""
|
||||||
calendar_name = temporary_calendar
|
calendar_name = temporary_calendar
|
||||||
fake_uid = f"nonexistent-{uuid.uuid4()}"
|
fake_uid = f"nonexistent-{uuid.uuid4()}"
|
||||||
|
|
||||||
result = await calendar_test_client.calendar.delete_event(calendar_name, fake_uid)
|
result = await nc_client.calendar.delete_event(calendar_name, fake_uid)
|
||||||
assert result["status_code"] == 404
|
assert result["status_code"] == 404
|
||||||
logger.info(f"Correctly got 404 for deleting nonexistent event: {fake_uid}")
|
logger.info(f"Correctly got 404 for deleting nonexistent event: {fake_uid}")
|
||||||
|
|
||||||
|
|
||||||
async def test_event_with_url_and_categories(
|
async def test_event_with_url_and_categories(
|
||||||
calendar_test_client: NextcloudClient, temporary_calendar: str
|
nc_client: NextcloudClient, temporary_calendar: str
|
||||||
):
|
):
|
||||||
"""Test creating an event with URL and multiple categories."""
|
"""Test creating an event with URL and multiple categories."""
|
||||||
calendar_name = temporary_calendar
|
calendar_name = temporary_calendar
|
||||||
@@ -423,14 +389,12 @@ async def test_event_with_url_and_categories(
|
|||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = await calendar_test_client.calendar.create_event(
|
result = await nc_client.calendar.create_event(calendar_name, event_data)
|
||||||
calendar_name, event_data
|
|
||||||
)
|
|
||||||
event_uid = result["uid"]
|
event_uid = result["uid"]
|
||||||
logger.info(f"Created event with metadata, UID: {event_uid}")
|
logger.info(f"Created event with metadata, UID: {event_uid}")
|
||||||
|
|
||||||
# Verify event
|
# Verify event
|
||||||
retrieved_event, _ = await calendar_test_client.calendar.get_event(
|
retrieved_event, _ = await nc_client.calendar.get_event(
|
||||||
calendar_name, event_uid
|
calendar_name, event_uid
|
||||||
)
|
)
|
||||||
assert retrieved_event["title"] == "Event with URL and Categories"
|
assert retrieved_event["title"] == "Event with URL and Categories"
|
||||||
@@ -441,7 +405,7 @@ async def test_event_with_url_and_categories(
|
|||||||
assert retrieved_event.get("priority") == 2
|
assert retrieved_event.get("priority") == 2
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
await calendar_test_client.calendar.delete_event(calendar_name, event_uid)
|
await nc_client.calendar.delete_event(calendar_name, event_uid)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Event with metadata test failed: {e}")
|
logger.error(f"Event with metadata test failed: {e}")
|
||||||
@@ -449,7 +413,7 @@ async def test_event_with_url_and_categories(
|
|||||||
|
|
||||||
|
|
||||||
async def test_calendar_operations_error_handling(
|
async def test_calendar_operations_error_handling(
|
||||||
calendar_test_client: NextcloudClient,
|
nc_client: NextcloudClient,
|
||||||
):
|
):
|
||||||
"""Test error handling for calendar operations."""
|
"""Test error handling for calendar operations."""
|
||||||
|
|
||||||
@@ -457,6 +421,6 @@ async def test_calendar_operations_error_handling(
|
|||||||
fake_calendar = f"nonexistent_calendar_{uuid.uuid4().hex}"
|
fake_calendar = f"nonexistent_calendar_{uuid.uuid4().hex}"
|
||||||
|
|
||||||
with pytest.raises(HTTPStatusError):
|
with pytest.raises(HTTPStatusError):
|
||||||
await calendar_test_client.calendar.get_calendar_events(fake_calendar)
|
await nc_client.calendar.get_calendar_events(fake_calendar)
|
||||||
|
|
||||||
logger.info("Error handling tests completed successfully")
|
logger.info("Error handling tests completed successfully")
|
||||||
|
|||||||
Reference in New Issue
Block a user