caldav_sync: fix unhashable list error, warning on password field attribute

This commit is contained in:
Marc Durepos 2024-09-05 17:01:32 -04:00
parent 0165e5e0c5
commit 4b297cd54b
5 changed files with 4 additions and 172 deletions

View file

@ -8,7 +8,7 @@
{ {
"name": "CalDAV Synchronization", "name": "CalDAV Synchronization",
"version": "17.0.0.5.6", "version": "17.0.0.5.7",
"license": "LGPL-3", "license": "LGPL-3",
"category": "Productivity", "category": "Productivity",
"summary": "Synchronize Odoo Calendar Events with CalDAV Servers", "summary": "Synchronize Odoo Calendar Events with CalDAV Servers",

View file

@ -1,5 +1,5 @@
import uuid import uuid
from odoo import models, api, fields from odoo import models, api, fields, Command
from odoo.exceptions import UserError from odoo.exceptions import UserError
import caldav import caldav
import logging import logging
@ -391,7 +391,7 @@ class CalendarEvent(models.Model):
changed_vals.update( changed_vals.update(
{ {
"partner_ids", "partner_ids",
values.pop("partner_ids"), [Command.set(values.pop("partner_ids"))],
} }
) )

View file

@ -5,7 +5,7 @@ class ResUsers(models.Model):
caldav_calendar_url = fields.Char(string='CalDAV Calendar URL') caldav_calendar_url = fields.Char(string='CalDAV Calendar URL')
caldav_username = fields.Char(string='CalDAV Username') caldav_username = fields.Char(string='CalDAV Username')
caldav_password = fields.Char(string='CalDAV Password', password=True) caldav_password = fields.Char(string='CalDAV Password')
def is_caldav_enabled(self): def is_caldav_enabled(self):
self.ensure_one() self.ensure_one()

View file

@ -1 +0,0 @@
from . import test_caldav_sync

View file

@ -1,167 +0,0 @@
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()