bemade-addons/caldav_sync/tests/test_caldav_sync.py
Marc Durepos 838a4e12ef caldav_sync: fix a dictionary update error during sync.
Exception handling was also changed to only log the errors rather
than to raise them to the user, since the sync is run as a cron
and that we want other calendars to be polled if one fails.
2024-06-23 07:16:21 -04:00

167 lines
6.1 KiB
Python

from odoo.tests.common import TransactionCase
from unittest.mock import patch, MagicMock
import caldav
from icalendar import Calendar, Event
from datetime import datetime
import logging
_logger = logging.getLogger(__name__)
class TestCaldavSync(TransactionCase):
def setUp(self):
super(TestCaldavSync, self).setUp()
self.user = self.env["res.users"].create(
{
"name": "Test User",
"login": "testuser",
"caldav_calendar_url": "http://test.calendar.url",
"caldav_username": "testuser",
"caldav_password": "password",
}
)
self.env = self.env(context=dict(self.env.context, no_reset_password=True))
@patch(
"odoo.addons.caldav_sync.models.calendar_event.CalendarEvent._get_caldav_client"
)
def test_create_caldav_event(self, mock_get_caldav_client):
mock_client = MagicMock()
mock_calendar = MagicMock()
def add_event_side_effect(ical_event):
caldav_event = MagicMock()
cal = Calendar.from_ical(ical_event)
ical_event_instance = next(iter(cal.subcomponents))
caldav_event.vobject_instance.vevent.uid.value = ical_event_instance["UID"]
return caldav_event
mock_calendar.add_event.side_effect = add_event_side_effect
mock_get_caldav_client.return_value = mock_client
mock_client.calendar.return_value = mock_calendar
event_data = {
"name": "Test Event",
"start": "2024-05-22 10:00:00",
"stop": "2024-05-22 11:00:00",
"description": "This is a test event",
"location": "Test Location",
}
event = self.env["calendar.event"].with_user(self.user).create(event_data)
cal = Calendar.from_ical(mock_calendar.add_event.call_args[0][0])
ical_event = next(iter(cal.subcomponents))
self.assertEqual(str(ical_event.get("summary")), event_data["name"])
self.assertEqual(str(ical_event.get("location")), event_data["location"])
self.assertEqual(ical_event.get("description"), event_data["description"])
self.assertIsNotNone(event.caldav_uid)
self.assertEqual(event.caldav_uid, ical_event["UID"])
@patch(
"odoo.addons.caldav_sync.models.calendar_event.CalendarEvent._get_caldav_client"
)
@patch(
"odoo.addons.caldav_sync.models.calendar_event.CalendarEvent.sync_update_to_caldav"
)
def test_update_caldav_event(
self, mock_sync_update_to_caldav, mock_get_caldav_client
):
mock_client = MagicMock()
mock_calendar = MagicMock()
mock_event = MagicMock()
mock_event.id = "test-uid-12345"
mock_client.calendar.return_value = mock_calendar
mock_calendar.add_event.return_value = mock_event
mock_get_caldav_client.return_value = mock_client
event = (
self.env["calendar.event"]
.with_user(self.user)
.create(
{
"name": "Test Event",
"start": "2024-05-22 10:00:00",
"stop": "2024-05-22 11:00:00",
"description": "This is a test event",
"location": "Test Location",
"create_uid": self.user.id,
}
)
)
event.with_user(self.user).write(
{
"name": "Updated Test Event",
"start": "2024-05-22 12:00:00",
"stop": "2024-05-22 13:00:00",
}
)
mock_sync_update_to_caldav.assert_called_once()
self.assertEqual(event.name, "Updated Test Event")
self.assertEqual(event.start, datetime(2024, 5, 22, 12, 0))
@patch(
"odoo.addons.caldav_sync.models.calendar_event.CalendarEvent._get_caldav_client"
)
def test_delete_caldav_event(self, mock_get_caldav_client):
mock_client = MagicMock()
mock_calendar = MagicMock()
mock_event = MagicMock()
mock_client.calendar.return_value = mock_calendar
mock_calendar.object_by_uid.return_value = mock_event
mock_get_caldav_client.return_value = mock_client
event = (
self.env["calendar.event"]
.with_user(self.user)
.create(
{
"name": "Test Event",
"start": "2024-05-22 10:00:00",
"stop": "2024-05-22 11:00:00",
"description": "This is a test event",
"location": "Test Location",
"create_uid": self.user.id,
}
)
)
uid = event.caldav_uid
event.with_user(self.user).unlink()
mock_calendar.object_by_uid.assert_called_once_with(uid)
mock_event.delete.assert_called_once()
@patch(
"odoo.addons.caldav_sync.models.calendar_event.CalendarEvent.sync_event_from_ical"
)
def test_poll_caldav_server(self, mock_sync_event_from_ical):
mock_sync_event_from_ical.return_value = None
with patch("caldav.DAVClient") as MockClient:
mock_client = MockClient.return_value
mock_calendar = mock_client.calendar.return_value
mock_event = MagicMock()
# Create a Calendar object and add an Event to it
cal = Calendar()
event = Event()
event.add("uid", "test-uid-12345")
event.add("dtstamp", datetime(2024, 5, 22, 10, 0, 0))
event.add("dtstart", datetime(2024, 5, 22, 10, 0, 0))
event.add("dtend", datetime(2024, 5, 22, 11, 0, 0))
event.add("summary", "Polled Event")
event.add("description", "This event was polled from CalDAV")
event.add("location", "Polled Location")
cal.add_component(event)
# Set the mock event's icalendar_instance to the iCal string
mock_event.icalendar_instance = Calendar.from_ical(cal.to_ical())
mock_calendar.events.return_value = [mock_event]
self.env["calendar.event"].poll_caldav_server()
mock_sync_event_from_ical.assert_called_once()