diff --git a/radicale/tests/test_hook_email.py b/radicale/tests/test_hook_email.py new file mode 100644 index 00000000..74674589 --- /dev/null +++ b/radicale/tests/test_hook_email.py @@ -0,0 +1,110 @@ +# This file is part of Radicale - CalDAV and CardDAV server +# Copyright © 2025-2025 Peter Bieringer +# +# 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 +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Radicale. If not, see . + +""" +Radicale tests related to hook 'email' + +""" + +import logging +import os + +from radicale.tests import BaseTest +from radicale.tests.helpers import get_file_content + + +class TestHooks(BaseTest): + """Tests with hooks.""" + + def setup_method(self) -> None: + BaseTest.setup_method(self) + rights_file_path = os.path.join(self.colpath, "rights") + with open(rights_file_path, "w") as f: + f.write("""\ +[permit delete collection] +user: .* +collection: test-permit-delete +permissions: RrWwD + +[forbid delete collection] +user: .* +collection: test-forbid-delete +permissions: RrWwd + +[permit overwrite collection] +user: .* +collection: test-permit-overwrite +permissions: RrWwO + +[forbid overwrite collection] +user: .* +collection: test-forbid-overwrite +permissions: RrWwo + +[allow all] +user: .* +collection: .* +permissions: RrWw""") + self.configure({"rights": {"file": rights_file_path, + "type": "from_file"}}) + self.configure({"hook": {"type": "email", + "dryrun": "True"}}) + + def test_add_event(self, caplog) -> None: + caplog.set_level(logging.WARNING) + """Add an event.""" + self.mkcalendar("/calendar.ics/") + event = get_file_content("event1.ics") + path = "/calendar.ics/event1.ics" + self.put(path, event) + _, headers, answer = self.request("GET", path, check=200) + assert "ETag" in headers + assert headers["Content-Type"] == "text/calendar; charset=utf-8" + assert "VEVENT" in answer + assert "Event" in answer + assert "UID:event" in answer + found = 0 + for line in caplog.messages: + if line.find("notification_item: {'type': 'upsert'") != -1: + found = found | 1 + if line.find("to_addresses=['janedoe@example.com']") != -1: + found = found | 2 + if line.find("to_addresses=['johndoe@example.com']") != -1: + found = found | 4 + if (found != 7): + raise ValueError("Logging misses expected log lines, found=%d", found) + + def test_delete_event(self, caplog) -> None: + caplog.set_level(logging.WARNING) + """Delete an event.""" + self.mkcalendar("/calendar.ics/") + event = get_file_content("event1.ics") + path = "/calendar.ics/event1.ics" + self.put(path, event) + _, responses = self.delete(path) + assert responses[path] == 200 + _, answer = self.get("/calendar.ics/") + assert "VEVENT" not in answer + found = 0 + for line in caplog.messages: + if line.find("notification_item: {'type': 'delete'") != -1: + found = found | 1 + if line.find("to_addresses=['janedoe@example.com']") != -1: + found = found | 2 + if line.find("to_addresses=['johndoe@example.com']") != -1: + found = found | 4 + if (found != 7): + raise ValueError("Logging misses expected log lines, found=%d", found)