"""Unit tests for WebDAV client."""
from unittest.mock import AsyncMock
import pytest
from nextcloud_mcp_server.client.webdav import WebDAVClient
@pytest.mark.unit
async def test_find_by_tag_calls_search_files(mocker):
"""Test that find_by_tag constructs correct search query."""
# Create mock HTTP client
mock_http_client = AsyncMock()
# Create WebDAVClient instance
client = WebDAVClient(mock_http_client, "testuser")
# Mock the search_files method to avoid actual HTTP calls
mock_search_files = mocker.patch.object(client, "search_files", return_value=[])
# Call find_by_tag
await client.find_by_tag("vector-index")
# Verify search_files was called with correct parameters
mock_search_files.assert_called_once()
call_args = mock_search_files.call_args
# Check that the where_conditions contains the tag name
assert "vector-index" in call_args.kwargs["where_conditions"]
assert "" in call_args.kwargs["where_conditions"]
assert "" in call_args.kwargs["where_conditions"]
# Check that tags property is requested
assert "tags" in call_args.kwargs["properties"]
@pytest.mark.unit
async def test_find_by_tag_with_scope_and_limit(mocker):
"""Test find_by_tag passes scope and limit parameters."""
mock_http_client = AsyncMock()
client = WebDAVClient(mock_http_client, "testuser")
mock_search_files = mocker.patch.object(client, "search_files", return_value=[])
# Call with scope and limit
await client.find_by_tag("test-tag", scope="Documents", limit=10)
# Verify parameters were passed through
call_args = mock_search_files.call_args
assert call_args.kwargs["scope"] == "Documents"
assert call_args.kwargs["limit"] == 10
@pytest.mark.unit
def test_parse_search_response_with_tags(mocker):
"""Test that _parse_search_response correctly parses tags."""
mock_http_client = AsyncMock()
client = WebDAVClient(mock_http_client, "testuser")
# Mock XML response with tags (comma-separated format)
xml_content = b"""
/remote.php/dav/files/testuser/Documents/test.pdf
test.pdf
application/pdf
1024
"abc123"
12345
vector-index,important
"""
# Parse the response
results = client._parse_search_response(xml_content, scope="Documents")
# Verify tags were parsed correctly
assert len(results) == 1
assert "tags" in results[0]
assert results[0]["tags"] == ["vector-index", "important"]
assert results[0]["name"] == "test.pdf"
assert results[0]["content_type"] == "application/pdf"
@pytest.mark.unit
def test_parse_search_response_with_empty_tags(mocker):
"""Test that _parse_search_response handles files without tags."""
mock_http_client = AsyncMock()
client = WebDAVClient(mock_http_client, "testuser")
# Mock XML response without tags
xml_content = b"""
/remote.php/dav/files/testuser/Documents/test.txt
test.txt
text/plain
"""
# Parse the response
results = client._parse_search_response(xml_content, scope="Documents")
# Verify tags field is empty list
assert len(results) == 1
assert "tags" in results[0]
assert results[0]["tags"] == []