def test_fix_shared_default(self): """ Make calendar """ request = SimpleRequest(self.site, "GET", "/addressbooks/users/wsanchez/") home = yield request.locateResource("/addressbooks/users/wsanchez") # Create a new default adbk newadbk = yield request.locateResource("/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/") yield newadbk.createAddressBookCollection() home.writeDeadProperty(carddavxml.DefaultAddressBookURL( HRef("/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/") )) try: default = yield home.readProperty(carddavxml.DefaultAddressBookURL, request) except HTTPError: self.fail("carddavxml.DefaultAddressBookURL is not present") else: self.assertEqual(str(default.children[0]), "/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/") # Force the new calendar to think it is a sharee collection newadbk._isShareeCollection = True try: default = yield home.readProperty(carddavxml.DefaultAddressBookURL, request) except HTTPError: self.fail("carddavxml.DefaultAddressBookURL is not present") else: self.assertEqual(str(default.children[0]), "/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/addressbook/") request._newStoreTransaction.abort()
def test_free_busy_set_same(self): """ Test that calendar-free-busy-set has the correct value and can be reset to the same. """ request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(prop.children[0], davxml.HRef("/calendars/__uids__/user01/calendar/")) newfbset = set() newfbset.add("/calendars/users/user01/calendar/") newset = caldavxml.CalendarFreeBusySet(*[davxml.HRef(url) for url in newfbset]) yield inbox.writeProperty(newset, request) yield request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(prop.children[0], davxml.HRef("/calendars/__uids__/user01/calendar/")) yield request._newStoreTransaction.commit() calendar = yield request.locateResource("/calendars/__uids__/user01/calendar/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy())
def test_missing_default_vtodo_calendar(self): """ Test that pickNewDefaultCalendar will create a missing default tasks calendar. """ request = SimpleRequest(self.site, "GET", "/calendars/users/wsanchez/") home = yield request.locateResource("/calendars/users/wsanchez/") inbox = yield request.locateResource("/calendars/users/wsanchez/inbox") # default property initially not present try: inbox.readDeadProperty(customxml.ScheduleDefaultTasksURL) except HTTPError: pass else: self.fail("caldavxml.ScheduleDefaultTasksURL is not empty") # Forcibly remove the one we need yield home._newStoreHome.removeChildWithName("tasks") names = [calendarName for calendarName in (yield home._newStoreHome.listCalendars())] self.assertTrue("tasks" not in names) yield inbox.pickNewDefaultCalendar(request, tasks=True) try: default = inbox.readDeadProperty(customxml.ScheduleDefaultTasksURL) except HTTPError: self.fail("caldavxml.ScheduleDefaultTasksURL is not present") else: self.assertEqual(str(default.children[0]), "/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/tasks") request._newStoreTransaction.abort()
def test_fix_shared_default(self): """ Make calendar """ request = SimpleRequest(self.site, "GET", "/calendars/users/wsanchez/") inbox = yield request.locateResource("/calendars/users/wsanchez/inbox") # Create a new default calendar newcalendar = yield request.locateResource("/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newcalendar") yield newcalendar.createCalendarCollection() inbox.writeDeadProperty(caldavxml.ScheduleDefaultCalendarURL( davxml.HRef("/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newcalendar") )) try: default = yield inbox.readProperty(caldavxml.ScheduleDefaultCalendarURL, request) except HTTPError: self.fail("caldavxml.ScheduleDefaultCalendarURL is not present") else: self.assertEqual(str(default.children[0]), "/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newcalendar") # Force the new calendar to think it is a virtual share newcalendar._isShareeCollection = True try: default = yield inbox.readProperty(caldavxml.ScheduleDefaultCalendarURL, request) except HTTPError: self.fail("caldavxml.ScheduleDefaultCalendarURL is not present") else: self.assertEqual(str(default.children[0]), "/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/calendar") request._newStoreTransaction.abort()
def test_set_default_vevent_other(self): """ Test that the default URL can be set to another VEVENT calendar """ request = SimpleRequest(self.site, "GET", "/calendars/users/wsanchez/") inbox = yield request.locateResource("/calendars/users/wsanchez/inbox") # default property not present try: inbox.readDeadProperty(caldavxml.ScheduleDefaultCalendarURL) except HTTPError: pass else: self.fail("caldavxml.ScheduleDefaultCalendarURL is not empty") # Create a new default calendar newcalendar = yield request.locateResource("/calendars/users/wsanchez/newcalendar") yield newcalendar.createCalendarCollection() yield newcalendar.setSupportedComponents(("VEVENT",)) request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/wsanchez/") inbox = yield request.locateResource("/calendars/users/wsanchez/inbox") yield inbox.writeProperty(caldavxml.ScheduleDefaultCalendarURL(davxml.HRef("/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newcalendar")), request) try: default = inbox.readDeadProperty(caldavxml.ScheduleDefaultCalendarURL) except HTTPError: self.fail("caldavxml.ScheduleDefaultCalendarURL is not present") else: self.assertEqual(str(default.children[0]), "/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newcalendar") request._newStoreTransaction.commit()
def test_CalendarTranspProperty(self): request = SimpleRequest(self.site, "GET", "/calendars/users/wsanchez/calendar/") # Get calendar first calendar = (yield request.locateResource("/calendars/users/wsanchez/calendar/")) if calendar is None: self.fail("Incorrect response to GET on existent calendar.") inbox = (yield request.locateResource("/calendars/users/wsanchez/inbox/")) if inbox is None: self.fail("Incorrect response to GET on existent inbox.") # Provisioned calendar has default opaque property transp = (yield calendar.hasProperty(caldavxml.ScheduleCalendarTransp, request)) self.assertTrue(transp) transp = (yield calendar.readProperty(caldavxml.ScheduleCalendarTransp, request)) self.assertEqual(transp, caldavxml.ScheduleCalendarTransp(caldavxml.Opaque())) # Inbox property lists the default calendar fbset = (yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request)) self.assertTrue(fbset) fbset = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(fbset, caldavxml.CalendarFreeBusySet( davxml.HRef.fromString("/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/calendar"), )) # Now remove the dead property to simulate the old calendar server state with # a calendar listed in the fbset yield calendar.removeDeadProperty(caldavxml.ScheduleCalendarTransp) fbset = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(fbset, caldavxml.CalendarFreeBusySet( davxml.HRef.fromString("/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/calendar"), )) # Calendar has opaque property derived from inbox transp = (yield calendar.hasProperty(caldavxml.ScheduleCalendarTransp, request)) self.assertTrue(transp) transp = (yield calendar.readProperty(caldavxml.ScheduleCalendarTransp, request)) self.assertEqual(transp, caldavxml.ScheduleCalendarTransp(caldavxml.Opaque())) # Now remove the dead property and the inbox fbset item to simulate the old calendar server state yield calendar.removeDeadProperty(caldavxml.ScheduleCalendarTransp) yield inbox.removeDeadProperty(caldavxml.CalendarFreeBusySet) # Calendar has transp property derived from inbox transp = (yield calendar.hasProperty(caldavxml.ScheduleCalendarTransp, request)) self.assertTrue(transp) transp = (yield calendar.readProperty(caldavxml.ScheduleCalendarTransp, request)) self.assertEqual(transp, caldavxml.ScheduleCalendarTransp(caldavxml.Transparent()))
def test_pick_default_other(self): """ Make adbk """ request = SimpleRequest(self.site, "GET", "/addressbooks/users/wsanchez/") home = yield request.locateResource("/addressbooks/users/wsanchez") # default property not present try: home.readDeadProperty(carddavxml.DefaultAddressBookURL) except HTTPError: pass else: self.fail("carddavxml.DefaultAddressBookURL is not empty") # Create a new default adbk newadbk = yield request.locateResource("/addressbooks/users/wsanchez/newadbk") yield newadbk.createAddressBookCollection() home.writeDeadProperty(carddavxml.DefaultAddressBookURL( HRef("/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/") )) request._newStoreTransaction.commit() # Delete the normal adbk request = SimpleRequest(self.site, "GET", "/addressbooks/users/wsanchez/") home = yield request.locateResource("/addressbooks/users/wsanchez") adbk = yield request.locateResource("/addressbooks/users/wsanchez/addressbook") yield adbk.storeRemove(request, False, "/addressbooks/users/wsanchez/addressbook") home.removeDeadProperty(carddavxml.DefaultAddressBookURL) # default property not present try: home.readDeadProperty(carddavxml.DefaultAddressBookURL) except HTTPError: pass else: self.fail("carddavxml.DefaultAddressBookURL is not empty") request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/addressbooks/users/wsanchez/") home = yield request.locateResource("/addressbooks/users/wsanchez") yield home.pickNewDefaultAddressBook(request) try: default = home.readDeadProperty(carddavxml.DefaultAddressBookURL) except HTTPError: self.fail("carddavxml.DefaultAddressBookURL is not present") else: self.assertEqual(str(default.children[0]), "/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/") request._newStoreTransaction.abort()
def test_pick_default_other(self): """ Make calendar """ request = SimpleRequest(self.site, "GET", "/calendars/users/wsanchez/") inbox = yield request.locateResource("/calendars/users/wsanchez/inbox") # default property not present try: inbox.readDeadProperty(caldavxml.ScheduleDefaultCalendarURL) except HTTPError: pass else: self.fail("caldavxml.ScheduleDefaultCalendarURL is not empty") # Create a new default calendar newcalendar = yield request.locateResource("/calendars/users/wsanchez/newcalendar") yield newcalendar.createCalendarCollection() inbox.writeDeadProperty(caldavxml.ScheduleDefaultCalendarURL( davxml.HRef("/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newcalendar") )) # Delete the normal calendar calendar = yield request.locateResource("/calendars/users/wsanchez/calendar") yield calendar.storeRemove(request, False, "/calendars/users/wsanchez/calendar") inbox.removeDeadProperty(caldavxml.ScheduleDefaultCalendarURL) # default property not present try: inbox.readDeadProperty(caldavxml.ScheduleDefaultCalendarURL) except HTTPError: pass else: self.fail("caldavxml.ScheduleDefaultCalendarURL is not empty") request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/wsanchez/") inbox = yield request.locateResource("/calendars/users/wsanchez/inbox") yield inbox.pickNewDefaultCalendar(request) try: default = inbox.readDeadProperty(caldavxml.ScheduleDefaultCalendarURL) except HTTPError: self.fail("caldavxml.ScheduleDefaultCalendarURL is not present") else: self.assertEqual(str(default.children[0]), "/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newcalendar") request._newStoreTransaction.abort()
def test_renderPrivileges(self): """ Verify that a directory listing includes children which you don't have access to. """ request = SimpleRequest(self.site, "GET", "/") def setEmptyACL(resource): resource.setAccessControlList(davxml.ACL()) # Empty ACL = no access return resource def renderRoot(_): d = request.locateResource("/") d.addCallback(lambda r: r.render(request)) return d def assertListing(response): data = [] d = readStream(response.stream, lambda s: data.append(str(s))) d.addCallback(lambda _: self.failIf( 'dir2/' not in "".join(data), "'dir2' expected in listing: %r" % (data,) )) return d d = request.locateResource("/dir2") d.addCallback(setEmptyACL) d.addCallback(renderRoot) d.addCallback(assertListing) return d
def test_pick_default_addressbook(self): """ Make calendar """ request = SimpleRequest(self.site, "GET", "/addressbooks/users/wsanchez/") home = yield request.locateResource("/addressbooks/users/wsanchez") # default property initially not present try: home.readDeadProperty(carddavxml.DefaultAddressBookURL) except HTTPError: pass else: self.fail("carddavxml.DefaultAddressBookURL is not empty") yield home.pickNewDefaultAddressBook(request) try: default = home.readDeadProperty(carddavxml.DefaultAddressBookURL) except HTTPError: self.fail("carddavxml.DefaultAddressBookURL is not present") else: self.assertEqual(str(default.children[0]), "/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/addressbook/") request._newStoreTransaction.abort()
def test_pick_default_vtodo_calendar(self): """ Test that pickNewDefaultCalendar will choose the correct tasks calendar. """ request = SimpleRequest(self.site, "GET", "/calendars/users/wsanchez/") inbox = yield request.locateResource("/calendars/users/wsanchez/inbox") # default property initially not present try: inbox.readDeadProperty(customxml.ScheduleDefaultTasksURL) except HTTPError: pass else: self.fail("customxml.ScheduleDefaultTasksURL is not empty") yield inbox.pickNewDefaultCalendar(request, tasks=True) try: default = inbox.readDeadProperty(customxml.ScheduleDefaultTasksURL) except HTTPError: self.fail("customxml.ScheduleDefaultTasksURL is not present") else: self.assertEqual(str(default.children[0]), "/calendars/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/tasks") request._newStoreTransaction.abort()
def _checkPrivileges(self, resource, url, principal, privilege, allowed): request = SimpleRequest(self.site, "GET", "/") def gotResource(resource): d = resource.checkPrivileges(request, (privilege,), principal=davxml.Principal(principal)) if allowed: def onError(f): f.trap(AccessDeniedError) #print(resource.readDeadProperty(davxml.ACL).toxml()) self.fail("%s should have %s privilege on %r" % (principal, privilege.sname(), resource)) d.addErrback(onError) else: def onError(f): f.trap(AccessDeniedError) def onSuccess(_): #print(resource.readDeadProperty(davxml.ACL).toxml()) self.fail("%s should not have %s privilege on %r" % (principal, privilege.sname(), resource)) d.addCallback(onSuccess) d.addErrback(onError) def _commit(ignore): maybeCommit(request) d.addBoth(_commit) return d d = request.locateResource(url) d.addCallback(gotResource) return d
def test_checkPrivileges(self): """ DAVResource.checkPrivileges() """ ds = [] authAllResource = AuthAllResource() requested_access = (davxml.All(),) site = Site(authAllResource) def expectError(failure): failure.trap(AccessDeniedError) errors = failure.value.errors self.failUnless(len(errors) == 1) subpath, denials = errors[0] self.failUnless(subpath is None) self.failUnless( tuple(denials) == requested_access, "%r != %r" % (tuple(denials), requested_access) ) def expectOK(result): self.failUnlessEquals(result, None) def _checkPrivileges(resource): d = resource.checkPrivileges(request, requested_access) return d # No auth; should deny request = SimpleRequest(site, "GET", "/") d = request.locateResource("/").addCallback(_checkPrivileges).addErrback(expectError) ds.append(d) # Has auth; should allow request = SimpleRequest(site, "GET", "/") request.authnUser = davxml.Principal(davxml.HRef("/users/d00d")) request.authzUser = davxml.Principal(davxml.HRef("/users/d00d")) d = request.locateResource("/") d.addCallback(_checkPrivileges) d.addCallback(expectOK) ds.append(d) return DeferredList(ds)
def test_NonExistentCalendarHome(self): def _response(resource): if resource is not None: self.fail("Incorrect response to GET on non-existent calendar home.") request = SimpleRequest(self.site, "GET", "/calendars/users/12345/") d = request.locateResource(request.uri) d.addCallback(_response)
def test_ExistentInbox(self): def _response(resource): if resource is None: self.fail("Incorrect response to GET on existent inbox.") request = SimpleRequest(self.site, "GET", "/calendars/users/wsanchez/inbox/") d = request.locateResource(request.uri) d.addCallback(_response)
def test_is_default_calendar(self): """ Test .isDefaultCalendar() returns the proper class or None. """ # Create a new non-default calendar request = SimpleRequest(self.site, "GET", "/calendars/users/wsanchez/") newcalendar = yield request.locateResource("/calendars/users/wsanchez/newcalendar") yield newcalendar.createCalendarCollection() yield newcalendar.setSupportedComponents(("VEVENT",)) inbox = yield request.locateResource("/calendars/users/wsanchez/inbox") yield inbox.pickNewDefaultCalendar(request) request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/wsanchez/") inbox = yield request.locateResource("/calendars/users/wsanchez/inbox") calendar = yield request.locateResource("/calendars/users/wsanchez/calendar") newcalendar = yield request.locateResource("/calendars/users/wsanchez/newcalendar") tasks = yield request.locateResource("/calendars/users/wsanchez/tasks") result = yield inbox.isDefaultCalendar(request, calendar) self.assertEqual(result, caldavxml.ScheduleDefaultCalendarURL) result = yield inbox.isDefaultCalendar(request, newcalendar) self.assertEqual(result, None) result = yield inbox.isDefaultCalendar(request, tasks) self.assertEqual(result, customxml.ScheduleDefaultTasksURL) request._newStoreTransaction.commit()
def test_testImplicitSchedulingPUT_NoChangeScheduleState(self): """ Test that testImplicitSchedulingPUT will prevent attendees from changing the schedule object state. """ request = SimpleRequest(self.site, "PUT", "/calendar/1.ics") calresource = yield request.locateResource("/calendar/1.ics") self.assertEqual(calresource.isScheduleObject, None) calresource.isScheduleObject = False calendarOld = Component.fromString("""BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VEVENT UID:12345-67890 DTSTART:20080601T120000Z DTEND:20080601T130000Z END:VEVENT END:VCALENDAR """) calendarNew = Component.fromString("""BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VEVENT UID:12345-67890 DTSTART:20080601T120000Z DTEND:20080601T130000Z ORGANIZER;CN="User 02":mailto:[email protected] ATTENDEE:mailto:[email protected] ATTENDEE:mailto:[email protected] END:VEVENT END:VCALENDAR """) calresource.exists = lambda : True calresource.iCalendarForUser = lambda request: succeed(calendarOld) scheduler = ImplicitScheduler() try: yield scheduler.testImplicitSchedulingPUT(request, calresource, "/calendars/users/user01/calendar/1.ics", calendarNew, False) except HTTPError: pass except: self.fail("HTTPError exception must be raised") else: self.fail("Exception must be raised") request._newStoreTransaction.abort()
def test_testImplicitSchedulingPUT_FixScheduleState(self): """ Test that testImplicitSchedulingPUT will fix an old cached schedule object state by re-evaluating the calendar data. """ request = SimpleRequest(self.site, "PUT", "/calendar/1.ics") calresource = yield request.locateResource("/calendar/1.ics") self.assertEqual(calresource.isScheduleObject, None) calresource.isScheduleObject = False calendarOld = Component.fromString("""BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VEVENT UID:12345-67890 DTSTART:20080601T120000Z DTEND:20080601T130000Z ORGANIZER;CN="User 02":mailto:[email protected] ATTENDEE:mailto:[email protected] ATTENDEE:mailto:[email protected] END:VEVENT END:VCALENDAR """) calendarNew = Component.fromString("""BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VEVENT UID:12345-67890 DTSTART:20080601T120000Z DTEND:20080601T130000Z ORGANIZER;CN="User 02":mailto:[email protected] ATTENDEE:mailto:[email protected] ATTENDEE:mailto:[email protected] END:VEVENT END:VCALENDAR """) calresource.exists = lambda : True calresource.iCalendarForUser = lambda request: succeed(calendarOld) scheduler = ImplicitScheduler() try: doAction, isScheduleObject = (yield scheduler.testImplicitSchedulingPUT(request, calresource, "/calendars/users/user01/calendar/1.ics", calendarNew, False)) except: self.fail("Exception must not be raised") self.assertTrue(doAction) self.assertTrue(isScheduleObject)
def test_free_busy_set_invalid_url(self): """ Test that calendar-free-busy-set will generate an error if an invalid value is used. """ request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) oldfbset = set(("/calendar",)) newfbset = set() newfbset.update(oldfbset) newfbset.add("/calendar-broken") newset = caldavxml.CalendarFreeBusySet(*[davxml.HRef(url) for url in newfbset]) self.failUnlessFailure(inbox.writeProperty(newset, request), HTTPError)
def test_findChildrenWithPrivileges(self): """ This test revokes read privileges for the C{"/file2"} and C{"/dir2/"} resource to verify that we can not find them giving our unauthenticated privileges. """ expected_children = [ "/file1", "/dir1/", ] request = SimpleRequest(self.site, "GET", "/") resource = waitForDeferred(request.locateResource("/")) yield resource resource = resource.getResult() def checkChildren(resource, uri): self.assertEquals(uri, resource.uri) if uri not in expected_children: unexpected_children.append(uri) else: found_children.append(uri) found_children = [] unexpected_children = [] privileges = waitForDeferred(resource.currentPrivileges(request)) yield privileges privileges = privileges.getResult() fc = resource.findChildren("1", request, checkChildren, privileges) completed = waitForDeferred(fc) yield completed completed.getResult() self.assertEquals( unexpected_children, [], "Found unexpected children: %r" % (unexpected_children,) ) expected_children.sort() found_children.sort() self.assertEquals(expected_children, found_children)
def test_findChildrenCallbackRaises(self): """ Verify that when the user callback raises an exception the completion deferred returned by findChildren errbacks TODO: Verify that the user callback doesn't get called subsequently """ def raiseOnChild(resource, uri): raise Exception("Oh no!") def findChildren(resource): return self.assertFailure( resource.findChildren("infinity", request, raiseOnChild), Exception ) request = SimpleRequest(self.site, "GET", "/") d = request.locateResource("/").addCallback(findChildren) return d
def test_free_busy_set_strip_slash_remove(self): """ ??? """ request = SimpleRequest(self.site, "GET", "/inbox/") inbox = yield request.locateResource("/inbox/") self.assertTrue(inbox.hasDeadProperty(caldavxml.CalendarFreeBusySet)) oldfbset = set(("/calendar/", "/broken/")) oldset = caldavxml.CalendarFreeBusySet(*[davxml.HRef(url) for url in oldfbset]) inbox.writeDeadProperty(oldset) writefbset = set(("/calendar/", "/broken/")) writeset = caldavxml.CalendarFreeBusySet(*[davxml.HRef(url) for url in writefbset]) yield inbox.writeProperty(writeset, request) correctfbset = set(("/calendar",)) correctset = caldavxml.CalendarFreeBusySet(*[davxml.HRef(url) for url in correctfbset]) changedset = inbox.readDeadProperty(caldavxml.CalendarFreeBusySet) self.assertEqual(tuple(changedset.children), tuple(correctset.children))
def test_free_busy_set_remove_broken(self): """ ??? """ request = SimpleRequest(self.site, "GET", "/inbox/") inbox = yield request.locateResource("/inbox/") self.assertTrue(inbox.hasDeadProperty(caldavxml.CalendarFreeBusySet)) oldfbset = set(("/calendar",)) oldset = caldavxml.CalendarFreeBusySet(*[davxml.HRef(url) for url in oldfbset]) newfbset = set() newfbset.update(oldfbset) newfbset.add("/calendar-broken") newset = caldavxml.CalendarFreeBusySet(*[davxml.HRef(url) for url in newfbset]) inbox.writeDeadProperty(newset) changedset = inbox.readDeadProperty(caldavxml.CalendarFreeBusySet) self.assertEqual(tuple(changedset.children), tuple(newset.children)) yield inbox.writeProperty(newset, request) changedset = inbox.readDeadProperty(caldavxml.CalendarFreeBusySet) self.assertEqual(tuple(changedset.children), tuple(oldset.children))
def test_wikiACL(self): """ Ensure shareeAccessControlList( ) honors the access granted by the wiki to the sharee, so that delegates of the sharee get the same level of access. """ access = "read" def stubWikiAccessMethod(userID, wikiID): return access self.patch(sharing, "getWikiAccess", stubWikiAccessMethod) sharedName = yield self.wikiSetup() request = SimpleRequest(self.site, "GET", "/404") collection = yield request.locateResource("/" + sharedName) # Simulate the wiki server granting Read access acl = (yield collection.shareeAccessControlList(request)) self.assertFalse("<write/>" in acl.toxml()) # Simulate the wiki server granting Read-Write access access = "write" acl = (yield collection.shareeAccessControlList(request)) self.assertTrue("<write/>" in acl.toxml())
def test_free_busy_set_different(self): """ Test that calendar-free-busy-set has the correct value and can be reset to the same. """ txn = self.transactionUnderTest() home = (yield txn.calendarHomeWithUID("user01", create=True)) yield home.createCalendarWithName("calendar_new") yield self.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") self.assertTrue((yield inbox.hasProperty(caldavxml.CalendarFreeBusySet, request))) prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual( set([str(child) for child in prop.children]), set(( "/calendars/__uids__/user01/calendar/", "/calendars/__uids__/user01/calendar_new/", )) ) calendar = yield request.locateResource("/calendars/__uids__/user01/calendar_new/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy()) calendar = yield request.locateResource("/calendars/__uids__/user01/calendar/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy()) newfbset = set() newfbset.add("/calendars/users/user01/calendar_new/") newset = caldavxml.CalendarFreeBusySet(*[davxml.HRef(url) for url in newfbset]) yield inbox.writeProperty(newset, request) yield request._newStoreTransaction.commit() request = SimpleRequest(self.site, "GET", "/calendars/users/user01/inbox/") inbox = yield request.locateResource("/calendars/users/user01/inbox/") prop = (yield inbox.readProperty(caldavxml.CalendarFreeBusySet, request)) self.assertEqual(prop.children[0], davxml.HRef("/calendars/__uids__/user01/calendar_new/")) yield request._newStoreTransaction.commit() calendar = yield request.locateResource("/calendars/__uids__/user01/calendar_new/") self.assertTrue(calendar._newStoreObject.isUsedForFreeBusy()) calendar = yield request.locateResource("/calendars/__uids__/user01/calendar/") self.assertFalse(calendar._newStoreObject.isUsedForFreeBusy())
def test_findChildren(self): """ This test asserts that we have: 1) not found any unexpected children 2) found all expected children It does this for all depths C{"0"}, C{"1"}, and C{"infintiy"} """ expected_children = { "0": [], "1": [ "/file1", "/file2", "/dir1/", "/dir2/", ], "infinity": [ "/file1", "/file2", "/dir1/", "/dir1/subdir1/", "/dir2/", "/dir2/file1", "/dir2/file2", "/dir2/subdir1/", "/dir2/subdir1/file1", "/dir2/subdir1/file2", ], } request = SimpleRequest(self.site, "GET", "/") resource = waitForDeferred(request.locateResource("/")) yield resource resource = resource.getResult() def checkChildren(resource, uri): self.assertEquals(uri, resource.uri) if uri not in expected_children[depth]: unexpected_children.append(uri) else: found_children.append(uri) for depth in ["0", "1", "infinity"]: found_children = [] unexpected_children = [] fc = resource.findChildren(depth, request, checkChildren) completed = waitForDeferred(fc) yield completed completed.getResult() self.assertEquals( unexpected_children, [], "Found unexpected children: %r" % (unexpected_children,) ) expected_children[depth].sort() found_children.sort() self.assertEquals(expected_children[depth], found_children)
def test_testImplicitSchedulingPUT_ScheduleState(self): """ Test that checkImplicitState() always returns True for any organizer, valid or not. """ data = ( ( """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VEVENT UID:12345-67890 DTSTART:20080601T120000Z DTEND:20080601T130000Z END:VEVENT END:VCALENDAR """, False, ), ( """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VEVENT UID:12345-67890 DTSTART:20080601T120000Z DTEND:20080601T130000Z ORGANIZER;CN="User 01":mailto:[email protected] ATTENDEE:mailto:[email protected] ATTENDEE:mailto:[email protected] END:VEVENT END:VCALENDAR """, True, ), ( """BEGIN:VCALENDAR VERSION:2.0 PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN BEGIN:VEVENT UID:12345-67890 DTSTART:20080601T120000Z DTEND:20080601T130000Z ORGANIZER;CN="User 01":mailto:[email protected] ATTENDEE:mailto:[email protected] ATTENDEE:mailto:[email protected] END:VEVENT END:VCALENDAR """, True, ), ) for calendar, result in data: calendar = Component.fromString(calendar) request = SimpleRequest(self.site, "PUT", "/calendar/1.ics") calresource = yield request.locateResource("/calendar/1.ics") self.assertEqual(calresource.isScheduleObject, None) scheduler = ImplicitScheduler() doAction, isScheduleObject = (yield scheduler.testImplicitSchedulingPUT(request, calresource, "/calendar/1.ics", calendar, False)) self.assertEqual(doAction, result) self.assertEqual(isScheduleObject, result) request._newStoreTransaction.abort()