"""Unit tests for BaseNextcloudClient. These cover the URL prefix logic that routes ``/apps/...`` calls through the universal ``/index.php`` entry point so the server works on Nextcloud installs without Pretty URLs (issue #732). """ import pytest from nextcloud_mcp_server.client.base import BaseNextcloudClient pytestmark = pytest.mark.unit def test_apps_path_is_prefixed_with_index_php(): """Bare ``/apps//...`` 404s on Nextcloud without Pretty URLs; the universal ``/index.php/apps/...`` form must be used instead. """ assert ( BaseNextcloudClient._resolve_url("/apps/notes/api/v1/notes") == "/index.php/apps/notes/api/v1/notes" ) assert ( BaseNextcloudClient._resolve_url("/apps/deck/api/v1.0/boards/1/stacks/2/cards") == "/index.php/apps/deck/api/v1.0/boards/1/stacks/2/cards" ) def test_remote_php_dav_unchanged(): """WebDAV/CalDAV/CardDAV paths use a dedicated entry point and don't need rewriting — leave them alone so we don't break the working call sites. """ assert ( BaseNextcloudClient._resolve_url("/remote.php/dav/files/alice/foo.txt") == "/remote.php/dav/files/alice/foo.txt" ) def test_ocs_path_unchanged(): """The ``ocs/v2.php`` prefix is also a dedicated entry point — no rewrite.""" assert ( BaseNextcloudClient._resolve_url("/ocs/v2.php/cloud/users") == "/ocs/v2.php/cloud/users" ) def test_already_prefixed_unchanged(): """If a caller already passed ``/index.php/apps/...`` we must not double-prefix.""" assert ( BaseNextcloudClient._resolve_url("/index.php/apps/notes/api/v1/notes") == "/index.php/apps/notes/api/v1/notes" ) def test_absolute_url_unchanged(): """Absolute URLs (full ``https://...``) are pass-through; only path-prefix matching is intentional, and an ``http://...`` URL doesn't start with ``/apps/``. """ assert ( BaseNextcloudClient._resolve_url("https://cloud.example.org/apps/notes") == "https://cloud.example.org/apps/notes" ) def test_empty_or_unrelated_paths_unchanged(): """Defensive cases: empty strings, root, and non-apps paths must pass through.""" assert BaseNextcloudClient._resolve_url("") == "" assert BaseNextcloudClient._resolve_url("/") == "/" assert BaseNextcloudClient._resolve_url("/status.php") == "/status.php"