def test_calendar_order(self, browser): self.maxDiff = None self.propfind(browser, 'urn:ietf:params:xml:ns:caldav', 'default-alarm-vevent-datetime') self.assertEquals( 'HTTP/1.1 404 Not Found', propfind.status_for_property('default-alarm-vevent-datetime')) self.proppatch(browser, 'urn:ietf:params:xml:ns:caldav', 'default-alarm-vevent-datetime', 'BEGIN:VALARM END:VALARM') self.assertEquals( {'.../caldav-calendars/test_user_1_': {'HTTP/1.1 200 OK': {'default-alarm-vevent-datetime': ''}}}, propfind.propfind_data()) self.propfind(browser, 'urn:ietf:params:xml:ns:caldav', 'default-alarm-vevent-datetime') self.assertEquals( 'HTTP/1.1 200 OK', propfind.status_for_property('default-alarm-vevent-datetime')) self.assertEquals('BEGIN:VALARM END:VALARM', propfind.property_value('default-alarm-vevent-datetime'))
def test_getetag_returns_uuid_as_quoted_string(self, browser): event = create(Builder('event')) self.propfind(browser, event, 'DAV:', 'getetag') self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('getetag')) self.assertEquals('"%s"' % IUUID(event), propfind.property_value('getetag'))
def test_getcontenttype(self, browser): event = create(Builder('event')) self.propfind(browser, event, 'DAV:', 'getcontenttype') self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('getcontenttype')) self.assertEquals('text/calendar; component=vevent', propfind.property_value('getcontenttype'))
def test_resource_id_is_uid(self, browser): event = create(Builder('event')) self.propfind(browser, event, 'DAV:', 'resource-id') self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('resource-id')) self.assertEquals('uuid:%s' % IUUID(event), propfind.property_value('resource-id'))
def test_displayname_is_title(self, browser): event = create(Builder('event').titled(u'A meeting')) self.propfind(browser, event, 'DAV:', 'displayname') self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('displayname')) self.assertEquals('A meeting', propfind.property_value('displayname'))
def test_resourcetype_is_collection(self, browser): req_body = propfind.make_propfind_request_body({ 'DAV:': ['resourcetype']}) browser.login().webdav('PROPFIND', data=req_body) self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('resourcetype')) self.assertEquals(['collection'], propfind.property_type('resourcetype'))
def test_notification_URL(self, browser): # http://calendarserver.org # This is a MacOS extension and is not (yet) supported. req_body = propfind.make_propfind_request_body({ 'http://calendarserver.org/ns/': ['notification-URL']}) browser.login().webdav('PROPFIND', data=req_body) self.assertEquals('HTTP/1.1 404 Not Found', propfind.status_for_property('notification-URL'))
def test_calendar_color(self, browser): self.maxDiff = None self.propfind(browser, 'http://apple.com/ns/ical/', 'calendar-color') self.assertEquals('HTTP/1.1 404 Not Found', propfind.status_for_property('calendar-color')) self.proppatch(browser, 'http://apple.com/ns/ical/', 'calendar-color', '#882F00FF') self.assertEquals( {'.../calendar/caldav': {'HTTP/1.1 200 OK': {'calendar-color': ''}}}, propfind.propfind_data()) self.propfind(browser, 'http://apple.com/ns/ical/', 'calendar-color') self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('calendar-color')) self.assertEquals('#882F00FF', propfind.property_value('calendar-color'))
def test_displayname(self, browser): # http://tools.ietf.org/html/rfc2518#section-13.2 req_body = propfind.make_propfind_request_body({ 'DAV:': ['displayname']}) browser.login().webdav('PROPFIND', data=req_body) self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('displayname')) self.assertEquals('Plone site', propfind.property_value('displayname'))
def test_supported_report_set_unsupported(self, browser): # http://tools.ietf.org/html/rfc3253#section-3.1.5 # "supported-report-set" (versioning extensions to WebDAV) is currently # not supported. req_body = propfind.make_propfind_request_body({ 'DAV:': ['supported-report-set']}) browser.login().webdav('PROPFIND', data=req_body) self.assertEquals('HTTP/1.1 404 Not Found', propfind.status_for_property('supported-report-set'))
def test_schedule_outbox_URL_unsupported(self, browser): # http://tools.ietf.org/html/rfc6638#section-2.1.1 # Identify the URL of the scheduling Outbox collection owned # by the associated principal resource. # Not (yet) implemented. req_body = propfind.make_propfind_request_body({ 'urn:ietf:params:xml:ns:caldav': ['schedule-outbox-URL']}) browser.login().webdav('PROPFIND', data=req_body) self.assertEquals('HTTP/1.1 404 Not Found', propfind.status_for_property('schedule-outbox-URL'))
def test_owner(self, browser): event = create(Builder('event')) self.propfind(browser, event, 'DAV:', 'owner') self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('owner')) url = '%s/caldav-principal/test_user_1_' % self.layer['portal'].portal_url() self.assertEquals( ''.join(('<owner>', '<href>%s</href>' % url, '</owner>')), propfind.property_xml('owner'))
def test_displayname(self, browser): # http://tools.ietf.org/html/rfc3744#section-4 # The principal should have a non-empty "displayname" property. req_body = propfind.make_propfind_request_body({ 'DAV:': ['displayname']}) browser.login().webdav('PROPFIND', view='caldav-principal/test_user_1_', data=req_body) self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('displayname')) self.assertEquals(TEST_USER_ID, # test user has no fullname by default. propfind.property_value('displayname'))
def test_resourcetype(self, browser): # http://tools.ietf.org/html/rfc3744#section-4 # "PROPFIND" on the principal view must return a DAV:resourcetype # of "DAV:principal". req_body = propfind.make_propfind_request_body({ 'DAV:': ['resourcetype']}) browser.login().webdav('PROPFIND', view='caldav-principal/test_user_1_', data=req_body) self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('resourcetype')) self.assertEquals(['principal'], propfind.property_type('resourcetype'))
def test_calendar_home_set(self, browser): # http://tools.ietf.org/html/rfc3744#section-4 # The principal should have a non-empty "displayname" property. req_body = propfind.make_propfind_request_body({ 'urn:ietf:params:xml:ns:caldav': ['calendar-home-set']}) browser.login().webdav('PROPFIND', view='caldav-principal/test_user_1_', data=req_body) self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('calendar-home-set')) self.assertEquals( '/plone/caldav-calendars/test_user_1_', propfind.property_value('calendar-home-set'))
def test_current_user_principal(self, browser): # http://tools.ietf.org/html/rfc5397#section-3 req_body = propfind.make_propfind_request_body({ 'DAV:': ['current-user-principal']}) browser.login().webdav('PROPFIND', data=req_body) self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('current-user-principal')) url = '%s/caldav-principal/test_user_1_' % self.layer['portal'].portal_url() self.assertEquals( ''.join(('<current-user-principal xmlns:n="DAV:">', '<href xmlns:n="DAV:">%s</href>' % url, '</current-user-principal>')), propfind.property_xml('current-user-principal'))
def test_propfind_calendar_home_set_unsupported(self, browser): # http://tools.ietf.org/html/rfc4791#section-6.2.1 # "calendar-home-set" is recommended but optional. # We do not have a per-user container for events (yet). req_body = propfind.make_propfind_request_body({ 'urn:ietf:params:xml:ns:caldav': ['calendar-home-set']}) browser.login().webdav('PROPFIND', data=req_body) self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('calendar-home-set')) self.assertEquals( ''.join(('<calendar-home-set xmlns:n="urn:ietf:params:xml:ns:caldav">', '<href xmlns:n="DAV:">/plone/caldav-calendars/test_user_1_</href>', '</calendar-home-set>')), propfind.property_xml('calendar-home-set'))
def test_principal_URL(self, browser): # http://tools.ietf.org/html/rfc3744#section-4.2 # This protected property contains the URL that MUST be used to identify # this principal in an ACL request. req_body = propfind.make_propfind_request_body({ 'DAV:': ['principal-URL']}) browser.login().webdav('PROPFIND', data=req_body) self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('principal-URL')) url = '%s/caldav-principal/test_user_1_' % self.layer['portal'].portal_url() self.assertEquals( ''.join(('<principal-url xmlns:n="DAV:">', '<href xmlns:n="DAV:">%s</href>' % url, '</principal-url>')), propfind.property_xml('principal-URL'))
def test_calendar_data(self, browser): event = create(Builder('event') .titled(u'Carnival in Bern') .having(location=u'Bern') .starting(datetime(2014, 4, 6, 05, 00)) .ending(datetime(2014, 4, 8, 12, 00))) self.propfind(browser, event, 'urn:ietf:params:xml:ns:caldav', 'calendar-data') self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('calendar-data')) expected = ''.join(( 'BEGIN:VCALENDAR VERSION:2.0' ' PRODID:-//Plone.org//NONSGML plone.app.event//EN' ' X-WR-CALNAME:Carnival in Bern' ' X-WR-RELCALID:%(uuid)s' ' X-WR-TIMEZONE:Europe/Vienna ' 'BEGIN:VEVENT' ' SUMMARY:Carnival in Bern' ' DTSTART;TZID=Etc/Greenwich;VALUE=DATE-TIME:20140406T050000' ' DTEND;TZID=Etc/Greenwich;VALUE=DATE-TIME:20140408T120000' # ' DTSTAMP;VALUE=DATE-TIME:20131206T093327Z' ' UID:%(uuid)s' # ' CREATED;VALUE=DATE-TIME:%(created)s' # ' LAST-MODIFIED;VALUE=DATE-TIME:%(last-modified)s' ' LOCATION:Bern' ' URL:%(url)s ' 'END:VEVENT ' 'END:VCALENDAR')) % { 'uuid': IUUID(event), 'url': event.absolute_url()} got = propfind.property_value('calendar-data') # Remove all times / dates which are changing and are not precisely predictable got = re.sub(r' DTSTAMP;[^ ]*? ', ' ', got) got = re.sub(r' CREATED;[^ ]*? ', ' ', got) got = re.sub(r' LAST-MODIFIED;[^ ]*? ', ' ', got) self.assertEquals(expected, got)
def test_calendar_user_address_set(self, browser): # http://tools.ietf.org/html/rfc6638#section-2.4.1 mtool = getToolByName(self.layer['portal'], 'portal_membership') member = mtool.getMemberById(TEST_USER_ID) member.setMemberProperties({'email': '*****@*****.**'}) transaction.commit() req_body = propfind.make_propfind_request_body({ 'urn:ietf:params:xml:ns:caldav': ['calendar-user-address-set']}) browser.login().webdav('PROPFIND', view='caldav-principal/test_user_1_', data=req_body) self.assertEquals('HTTP/1.1 200 OK', propfind.status_for_property('calendar-user-address-set')) self.assertEquals( ''.join(('<calendar-user-address-set>', '<href>mailto:[email protected]</href>', '<href>userid:test_user_1_</href>', '<href>/plone/caldav-principal/test_user_1_</href>', '<href>%s/caldav-principal/test_user_1_</href>' % ( self.layer['portal'].portal_url()), '</calendar-user-address-set>')), propfind.property_xml('calendar-user-address-set'))