Mock Calendar connections to test services that work with events, calendars, and scheduling.
Note: If you're new to unit testing with Zato, check the tutorial first.
The service:
from zato.server.service import Service
class GetCalendarEvents(Service):
name = 'calendar.events.get'
def handle(self):
conn = self.cloud.ms365.get('ms365.Calendar').conn
with conn.client() as client:
schedule = client.impl.schedule()
calendar = schedule.get_default_calendar()
events = calendar.get_events()
self.response.payload = {
'events': [{'subject': e['subject'], 'start': e['start']} for e in events]
}
The test:
from zato_testing import ServiceTestCase
from myapp.services import GetCalendarEvents
class TestGetCalendarEvents(ServiceTestCase):
def test_returns_events(self):
self.set_response('ms365.Calendar.schedule', {'id': 'schedule-123'})
self.set_response('ms365.Calendar.schedule.get_default_calendar', {'id': 'cal-456'})
self.set_response('ms365.Calendar.schedule.get_default_calendar.get_events', [
{'subject': 'Team Meeting', 'start': '2024-03-20T10:00:00'},
{'subject': 'Project Review', 'start': '2024-03-20T14:00:00'},
{'subject': 'Weekly Sync', 'start': '2024-03-21T09:00:00'}
])
service = self.invoke(GetCalendarEvents)
events = service.response.payload['events']
self.assertEqual(len(events), 3)
self.assertEqual(events[0]['subject'], 'Team Meeting')
The service:
class CreateCalendarEvent(Service):
name = 'calendar.event.create'
input = 'subject', 'start', 'end', '-attendees'
def handle(self):
conn = self.cloud.ms365.get('ms365.Calendar').conn
with conn.client() as client:
schedule = client.impl.schedule()
calendar = schedule.get_default_calendar()
event = calendar.new_event()
event.subject = self.request.input.subject
event.start = self.request.input.start
event.end = self.request.input.end
for attendee in self.request.input.attendees or []:
event.add_attendee(attendee)
result = event.save()
self.response.payload = {'created': result, 'event_id': event.object_id}
The test:
class TestCreateCalendarEvent(ServiceTestCase):
def test_creates_event(self):
self.set_response('ms365.Calendar.schedule', {'id': 'schedule-123'})
self.set_response('ms365.Calendar.schedule.get_default_calendar', {'id': 'cal-456'})
self.set_response('ms365.Calendar.schedule.get_default_calendar.new_event', {
'object_id': 'event-new-001',
'subject': None,
'start': None,
'end': None
})
self.set_response('ms365.Calendar.schedule.get_default_calendar.new_event.add_attendee', None)
self.set_response('ms365.Calendar.schedule.get_default_calendar.new_event.save', True)
service = self.invoke(CreateCalendarEvent,
subject='New Meeting',
start='2024-03-25T10:00:00',
end='2024-03-25T11:00:00',
attendees=['colleague@example.com']
)
self.assertEqual(service.response.payload['created'], True)
self.assertEqual(service.response.payload['event_id'], 'event-new-001')
class TestGetCalendars(ServiceTestCase):
def test_returns_calendars(self):
self.set_response('ms365.Calendar.schedule', {'id': 'schedule-123'})
self.set_response('ms365.Calendar.schedule.list_calendars', [
{'name': 'Calendar', 'id': 'cal-001'},
{'name': 'Work', 'id': 'cal-002'},
{'name': 'Personal', 'id': 'cal-003'}
])
service = self.invoke(GetCalendars)
self.assertEqual(len(service.response.payload['calendars']), 3)
class TestUpdateCalendarEvent(ServiceTestCase):
def test_updates_event(self):
self.set_response('ms365.Calendar.schedule', {'id': 'schedule-123'})
self.set_response('ms365.Calendar.schedule.get_default_calendar', {'id': 'cal-456'})
self.set_response('ms365.Calendar.schedule.get_default_calendar.get_event', {
'id': 'event-001',
'subject': 'Old Subject',
'start': '2024-03-20T10:00:00',
'end': '2024-03-20T11:00:00'
})
self.set_response('ms365.Calendar.schedule.get_default_calendar.get_event.save', True)
service = self.invoke(UpdateCalendarEvent,
event_id='event-001',
updates={'subject': 'Updated Subject'}
)
self.assertEqual(service.response.payload['updated'], True)
class TestDeleteCalendarEvent(ServiceTestCase):
def test_deletes_event(self):
self.set_response('ms365.Calendar.schedule', {'id': 'schedule-123'})
self.set_response('ms365.Calendar.schedule.get_default_calendar', {'id': 'cal-456'})
self.set_response('ms365.Calendar.schedule.get_default_calendar.get_event', {
'id': 'event-001',
'subject': 'Event to Delete'
})
self.set_response('ms365.Calendar.schedule.get_default_calendar.get_event.delete', True)
service = self.invoke(DeleteCalendarEvent, event_id='event-001')
self.assertEqual(service.response.payload['deleted'], True)
class TestRespondToEvent(ServiceTestCase):
def test_accepts_event(self):
self.set_response('ms365.Calendar.schedule', {'id': 'schedule-123'})
self.set_response('ms365.Calendar.schedule.get_default_calendar', {'id': 'cal-456'})
self.set_response('ms365.Calendar.schedule.get_default_calendar.get_event', {
'id': 'event-001',
'subject': 'Meeting Invite'
})
self.set_response('ms365.Calendar.schedule.get_default_calendar.get_event.accept_event', True)
service = self.invoke(RespondToEvent, event_id='event-001', response='accept')
self.assertEqual(service.response.payload['responded'], True)