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'))
예제 #2
0
 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'))
예제 #3
0
 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'))
예제 #4
0
 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'))
예제 #5
0
 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'))
예제 #6
0
 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'))
예제 #7
0
    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'))
예제 #9
0
    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'))
예제 #10
0
    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'))
예제 #11
0
    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'))
예제 #12
0
    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'))
예제 #16
0
    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'))
예제 #17
0
    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'))
예제 #18
0
    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'))
예제 #19
0
    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'))