storage/test: add share-by-softlink case

This commit is contained in:
Peter Bieringer
2026-04-11 17:03:59 +02:00
parent 86fd325784
commit c9ac5f8a9e

View File

@@ -1,7 +1,7 @@
# This file is part of Radicale - CalDAV and CardDAV server # This file is part of Radicale - CalDAV and CardDAV server
# Copyright © 2012-2017 Guillaume Ayoub # Copyright © 2012-2017 Guillaume Ayoub
# Copyright © 2017-2022 Unrud <unrud@outlook.com> # Copyright © 2017-2022 Unrud <unrud@outlook.com>
# Copyright © 2024-2025 Peter Bieringer <pb@bieringer.de> # Copyright © 2024-2026 Peter Bieringer <pb@bieringer.de>
# #
# This library is free software: you can redistribute it and/or modify # This library is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@@ -26,11 +26,13 @@ import logging
import os import os
import re import re
import shutil import shutil
import sys
from typing import ClassVar, cast from typing import ClassVar, cast
import pytest import pytest
import radicale.tests.custom.storage_simple_sync import radicale.tests.custom.storage_simple_sync
from radicale import logger
from radicale.tests import BaseTest from radicale.tests import BaseTest
from radicale.tests.helpers import get_file_content from radicale.tests.helpers import get_file_content
from radicale.tests.test_base import TestBaseRequests as _TestBaseRequests from radicale.tests.test_base import TestBaseRequests as _TestBaseRequests
@@ -188,6 +190,34 @@ class TestMultiFileSystem(BaseTest):
assert answer is not None assert answer is not None
assert "\r\nUID:%s\r\n" % uid in answer assert "\r\nUID:%s\r\n" % uid in answer
@pytest.mark.skipif(sys.platform == 'win32', reason="Not supported on Windows")
def test_collection_sharing_by_softlink(self) -> None:
"""Test collection sharing by softlink."""
self.configure({"auth": {"type": "none"}})
path_group_col = "/group/calendar-shared.ics/"
file_item = "event1.ics"
self.mkcalendar(path_group_col, login="group:grouppw")
event = get_file_content(file_item)
self.put(os.path.join(path_group_col, file_item), event)
fs_path_group_col = self.colpath + "/collection-root" + path_group_col
fs_path_group_col_rel = ".." + path_group_col
fs_path_user = self.colpath + "/collection-root/user"
fs_path_user_col = self.colpath + "/collection-root/user/calendar-group.ics"
logger.debug("colpath=%r fs_path_group_col=%r", self.colpath, fs_path_group_col)
assert os.path.isdir(fs_path_group_col)
# create user directory and check
logger.debug("create dir fs_path_user=%r", fs_path_user)
os.mkdir(fs_path_user)
assert os.path.isdir(fs_path_user)
# create relative symlink and check
logger.debug("create symlink src=%r dst=%r", fs_path_group_col_rel, fs_path_user_col)
os.symlink(fs_path_group_col_rel, fs_path_user_col)
logger.debug("test exists: fs_path_user_col=%r", fs_path_user_col)
assert os.path.exists(fs_path_user_col)
logger.debug("test is softlink: fs_path_user_col=%r", fs_path_user_col)
assert os.path.islink(fs_path_user_col)
self.propfind("/user/", login="user:userpw", HTTP_DEPTH="1")
@pytest.mark.skipif(not shutil.which("flock"), reason="flock command not found") @pytest.mark.skipif(not shutil.which("flock"), reason="flock command not found")
@pytest.mark.skipif(radicale.log.logger.getEffectiveLevel() == logging.INFO, reason="requires loglevel DEBUG") @pytest.mark.skipif(radicale.log.logger.getEffectiveLevel() == logging.INFO, reason="requires loglevel DEBUG")
def test_hook_placeholders_PUT(self, caplog) -> None: def test_hook_placeholders_PUT(self, caplog) -> None: