From d749d5c2fb9a41697732eaef3f17e27e807fff55 Mon Sep 17 00:00:00 2001 From: Luc Charland Date: Wed, 27 Aug 2014 13:31:49 -0400 Subject: [PATCH] Added tests for prevent invitation and whitelist --- Tests/Integration/preferences.py | 54 +++-- Tests/Integration/test-preferences.py | 19 +- Tests/Integration/test-prevent-invitations.py | 209 ++++++++++++++++++ 3 files changed, 266 insertions(+), 16 deletions(-) create mode 100755 Tests/Integration/test-prevent-invitations.py diff --git a/Tests/Integration/preferences.py b/Tests/Integration/preferences.py index f66ac0dea..ab12f7894 100644 --- a/Tests/Integration/preferences.py +++ b/Tests/Integration/preferences.py @@ -46,7 +46,7 @@ class preferences: self.client = webdavlib.WebDAVClient(hostname, port) - authCookie = sogoLogin.getAuthCookie(hostname, port, username, password) + authCookie = sogoLogin.getAuthCookie(hostname, port, self.login, self.passw) self.cookie = authCookie # map between preferences/jsonDefaults and the webUI names @@ -56,17 +56,22 @@ class preferences: "SOGoTimeZone": "timezone", "SOGoSieveFilters": "sieveFilters", - # Vacation stuff - "Vacation": "enableVacation", # to disable, don't specify it - "autoReplyText": "autoReplyText", # string - "autoReplyEmailAddresses": "autoReplyEmailAddresses", # LIST - "daysBetweenResponse": "daysBetweenResponsesList", - "ignoreLists": "ignoreLists", #bool + # Vacation stuff + "Vacation": "enableVacation", # to disable, don't specify it + "autoReplyText": "autoReplyText", # string + "autoReplyEmailAddresses": "autoReplyEmailAddresses", # LIST + "daysBetweenResponse": "daysBetweenResponsesList", + "ignoreLists": "ignoreLists", #bool - # forward stuff - "Forward": "enableForward", # to disable, don't specify it - "forwardAddress": "forwardAddress", - "keepCopy": "forwardKeepCopy", + # forward stuff + "Forward": "enableForward", # to disable, don't specify it + "forwardAddress": "forwardAddress", + "keepCopy": "forwardKeepCopy", + + # Calendar stuff + "enablePreventInvitations": "preventInvitations", + "PreventInvitations": "PreventInvitations", + "whiteList": "whiteList", } def set(self, preference, value=None): @@ -74,11 +79,11 @@ class preferences: content="" if isinstance(preference, dict): for k,v in preference.items(): - content+="%s=%s&" % (self.preferencesMap[k], v) + content+="%s=%s&" % (self.preferencesMap[k], urllib.quote(v)) else: # assume it is a str formKey = self.preferencesMap[preference] - content = "%s=%s&hasChanged=1" % (formKey, value) + content = "%s=%s&hasChanged=1" % (formKey, urllib.quote(value)) url = "/SOGo/so/%s/preferences" % self.login @@ -94,7 +99,7 @@ class preferences: raise Exception ("failure setting prefs, (code = %d)" \ % post.response["status"]) - def get(self, preference): + def get(self, preference=None): url = "/SOGo/so/%s/preferences/jsonDefaults" % self.login get = HTTPPreferencesGET (url) get.cookie = self.cookie @@ -102,7 +107,26 @@ class preferences: content = simplejson.loads(get.response['body']) result = None try: - result = content[preference] + if preference: + result = content[preference] + else: + result = content + except: + pass + return result + + def get_settings(self, preference=None): + url = "/SOGo/so/%s/preferences/jsonSettings" % self.login + get = HTTPPreferencesGET (url) + get.cookie = self.cookie + self.client.execute (get) + content = simplejson.loads(get.response['body']) + result = None + try: + if preference: + result = content[preference] + else: + result = content except: pass return result diff --git a/Tests/Integration/test-preferences.py b/Tests/Integration/test-preferences.py index cd1866d39..8bf3fe998 100644 --- a/Tests/Integration/test-preferences.py +++ b/Tests/Integration/test-preferences.py @@ -1,5 +1,5 @@ #!/usr/bin/python -from config import hostname, port, username, password +from config import hostname, port, username, password, white_listed_attendee import preferences import simplejson @@ -35,5 +35,22 @@ class preferencesTest(unittest.TestCase): prefText = "weird data \ ' \"; ^" self._setTextPref(prefText) + def testSetPreventInvitation(self): + """ Set/get the PreventInvitation pref""" + self.prefs.set('PreventInvitations', 0) + notset = self.prefs.get_settings('')['Calendar']['PreventInvitations'] + self.assertEqual(notset, 0) + self.prefs.set('enablePreventInvitations', 0) + isset = self.prefs.get_settings('')['Calendar']['PreventInvitations'] + self.assertEqual(isset, 1) + + def testPreventInvitationsWhiteList(self): + """Add to the PreventInvitations Whitelist""" + self.prefs.set("whiteList", white_listed_attendee) + whitelist = self.prefs.get_settings('Calendar')['PreventInvitationsWhitelist'] + self.assertEqual(whitelist, white_listed_attendee) + + + if __name__ == "__main__": sogotests.runTests() diff --git a/Tests/Integration/test-prevent-invitations.py b/Tests/Integration/test-prevent-invitations.py new file mode 100755 index 000000000..d1c19ed10 --- /dev/null +++ b/Tests/Integration/test-prevent-invitations.py @@ -0,0 +1,209 @@ +#!/usr/bin/python +from config import hostname, port, username, password, \ + superuser, superuser_password, \ + attendee1, attendee1_username, \ + attendee1_password, \ + attendee1_delegate, attendee1_delegate_username, \ + attendee1_delegate_password, \ + resource_no_overbook, resource_can_overbook, \ + white_listed_attendee + +import preferences +import simplejson +import sogotests +import unittest +import utilities +import datetime +import dateutil.tz +import vobject +import vobject.base +import vobject.icalendar +import webdavlib +import StringIO + + +class preventInvitationsTest(unittest.TestCase): + def setUp(self): + self.prefs = preferences.preferences(attendee1, attendee1_password) + self.caldav = CalDAVSchedulingTest(self) + + def tearDown(self): + self.prefs.set("autoReplyText", "") + self.prefs.set('PreventInvitations', 0) + self.prefs.set("whiteList", "") + #- Manual Cleanup, not called because classs is not derived from unittest + self.caldav.tearDown() + + def testDontPreventInvitation(self): + """ Set/get the PreventInvitation pref""" + #- First accept the invitation + self.prefs.set('PreventInvitations', 0) + notset = self.prefs.get_settings('')['Calendar']['PreventInvitations'] + self.assertEqual(notset, 0) + self.caldav.AddAttendee() + self.caldav.VerifyEvent() + + def testPreventInvitation(self): + """ Set PreventInvitation and don't accept the Invitation""" + #- Second, enable PreventInviation and refuse it + self.prefs.set('enablePreventInvitations', 0) + isset = self.prefs.get_settings('')['Calendar']['PreventInvitations'] + self.assertEqual(isset, 1) + self.caldav.AddAttendee(409) + self.caldav.VerifyEvent(404) + + def testPreventInvitationWhiteList(self): + """ Set PreventInvitation add to WhiteList and accept the Invitation""" + #- First, add the Organiser to the Attendee's whitelist + self.prefs.set('enablePreventInvitations', 0) + self.prefs.set("whiteList", white_listed_attendee) + whitelist = self.prefs.get_settings('Calendar')['PreventInvitationsWhitelist'] + self.assertEqual(whitelist, white_listed_attendee) + + #- Second, try again to invite, it should work + self.prefs.set('enablePreventInvitations', 0) + isset = self.prefs.get_settings('')['Calendar']['PreventInvitations'] + self.assertEqual(isset, 1) + self.caldav.AddAttendee() + self.caldav.VerifyEvent() + + +class CalDAVSchedulingTest(object): + def __init__(self, parent_self): + self.test = parent_self # used for utilities + self.setUp() + + def setUp(self): + self.superuser_client = webdavlib.WebDAVClient(hostname, port, + superuser, superuser_password) + self.client = webdavlib.WebDAVClient(hostname, port, + username, password) + self.attendee1_client = webdavlib.WebDAVClient(hostname, port, + attendee1_username, attendee1_password) + self.attendee1_delegate_client = webdavlib.WebDAVClient(hostname, port, + attendee1_delegate_username, attendee1_delegate_password) + + utility = utilities.TestUtility(self.test, self.client) + (self.user_name, self.user_email) = utility.fetchUserInfo(username) + (self.attendee1_name, self.attendee1_email) = utility.fetchUserInfo(attendee1) + (self.attendee1_delegate_name, self.attendee1_delegate_email) = utility.fetchUserInfo(attendee1_delegate) + + self.user_calendar = "/SOGo/dav/%s/Calendar/personal/" % username + self.attendee1_calendar = "/SOGo/dav/%s/Calendar/personal/" % attendee1 + self.attendee1_delegate_calendar = "/SOGo/dav/%s/Calendar/personal/" % attendee1_delegate + + # fetch non existing event to let sogo create the calendars in the db + self._getEvent(self.client, "%snonexistent" % self.user_calendar, exp_status=404) + self._getEvent(self.attendee1_client, "%snonexistent" % self.attendee1_calendar, exp_status=404) + self._getEvent(self.attendee1_delegate_client, "%snonexistent" % + self.attendee1_delegate_calendar, exp_status=404) + + # list of ics used by the test. + # tearDown will loop over this and wipe them in all users' calendar + self.ics_list = [] + + + def tearDown(self): + # delete all created events from all users' calendar + for ics in self.ics_list: + self._deleteEvent(self.superuser_client, + "%s%s" % (self.user_calendar, ics), None) + self._deleteEvent(self.superuser_client, + "%s%s" % (self.attendee1_calendar, ics), None) + self._deleteEvent(self.superuser_client, + "%s%s" % (self.attendee1_delegate_calendar, ics), None) + + def _newEvent(self, summary="test event", uid="test", transp=0): + transparency = ("OPAQUE", "TRANSPARENT") + + newCal = vobject.iCalendar() + vevent = newCal.add('vevent') + vevent.add('summary').value = summary + vevent.add('transp').value = transparency[transp] + + now = datetime.datetime.now(dateutil.tz.gettz("America/Montreal")) + startdate = vevent.add('dtstart') + startdate.value = now + enddate = vevent.add('dtend') + enddate.value = now + datetime.timedelta(0, 3600) + vevent.add('uid').value = uid + vevent.add('dtstamp').value = now + vevent.add('last-modified').value = now + vevent.add('created').value = now + vevent.add('class').value = "PUBLIC" + vevent.add('sequence').value = "0" + + return newCal + + def _putEvent(self, client, filename, event, exp_status = 201): + put = webdavlib.HTTPPUT(filename, event.serialize()) + put.content_type = "text/calendar; charset=utf-8" + client.execute(put) + if exp_status is not None: + self.test.assertEquals(put.response["status"], exp_status) + + def _getEvent(self, client, filename, exp_status = 200): + get = webdavlib.HTTPGET(filename) + client.execute(get) + + if exp_status is not None: + self.test.assertEquals(get.response["status"], exp_status) + + if get.response["headers"]["content-type"].startswith("text/calendar"): + stream = StringIO.StringIO(get.response["body"]) + event = vobject.base.readComponents(stream).next() + else: + event = None + + return event + + def _deleteEvent(self, client, filename, exp_status = 204): + delete = webdavlib.WebDAVDELETE(filename) + client.execute(delete) + if exp_status is not None: + self.test.assertEquals(delete.response["status"], exp_status) + + def AddAttendee(self, exp_status=204): + """ add attendee after event creation """ + + # make sure the event doesn't exist + ics_name = "test-add-attendee.ics" + self.ics_list += [ics_name] + + self._deleteEvent(self.client, + "%s%s" % (self.user_calendar,ics_name), None) + self._deleteEvent(self.attendee1_client, + "%s%s" % (self.attendee1_calendar,ics_name), None) + + # 1. create an event in the organiser's calendar + event = self._newEvent(summary="Test add attendee", uid="Test add attendee") + organizer = event.vevent.add('organizer') + organizer.cn_param = self.user_name + organizer.value = self.user_email + self._putEvent(self.client, "%s%s" % (self.user_calendar, ics_name), event) + + # 2. add an attendee + event.add("method").value = "REQUEST" + attendee = event.vevent.add('attendee') + attendee.cn_param = self.attendee1_name + attendee.rsvp_param = "TRUE" + attendee.partstat_param = "NEEDS-ACTION" + attendee.value = self.attendee1_email + self._putEvent(self.client, "%s%s" % (self.user_calendar, ics_name), event, + exp_status=exp_status) + + #- save event for VerifyEvent + self.event = event + self.ics_name = ics_name + + def VerifyEvent(self, exp_status=200): + # 1. verify that the attendee has the event + attendee_event = self._getEvent(self.attendee1_client, "%s%s" % (self.attendee1_calendar, self.ics_name), exp_status) + + # 2. make sure the received event match the original one + if attendee_event: + self.test.assertEquals(self.event.vevent.uid, attendee_event.vevent.uid) + + +if __name__ == "__main__": + sogotests.runTests()