Ejemplo n.º 1
0
    def test_multiple_groups_with_individual_remove_from_one_group(self):
        """
        Test that a multi-group share each containing the same user still lists the user
        when they are removed from one group.
        """
        @inlineCallbacks
        def expandedMembers(self, records=None, seen=None):

            if self.uid == "group05":
                returnValue(frozenset())
            else:
                returnValue((yield
                             unpatchedExpandedMembers(self, records, seen)))

        unpatchedExpandedMembers = CalendarDirectoryRecordMixin.expandedMembers

        # setup group cacher
        groupCacher = GroupCacher(
            self.transactionUnderTest().directoryService())
        groupsToRefresh = yield groupCacher.groupsToRefresh(
            self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 0)
        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(),
                                             "group05")
        self.assertEqual(len(wps), 0)
        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(),
                                             "group06")
        self.assertEqual(len(wps), 0)

        # Invite
        calendar = yield self.calendarUnderTest(home="user03", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 0)
        self.assertFalse(calendar.isSharedByOwner())

        shareeView = yield calendar.inviteUIDToShare("user01", _BIND_MODE_READ)
        self.assertTrue(shareeView is not None)
        shareeViews = yield calendar.inviteUIDToShare("group05",
                                                      _BIND_MODE_WRITE)
        self.assertEqual(len(shareeViews), 2)
        shareeViews = yield calendar.inviteUIDToShare("group06",
                                                      _BIND_MODE_READ)
        self.assertEqual(len(shareeViews), 1)

        calendar = yield self.calendarUnderTest(home="user03", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 2)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user03")
            self.assertEqual(invite.uid, shareeView.shareName())
            if invite.shareeUID == "user01":
                self.assertEqual(invite.mode, _BIND_MODE_GROUP_READ)
            else:
                self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()),
                             _BIND_MODE_WRITE)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [
                invite.uid,
            ])

        groupsToRefresh = yield groupCacher.groupsToRefresh(
            self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 2)

        # Change group membership
        self.patch(CalendarDirectoryRecordMixin, "expandedMembers",
                   expandedMembers)

        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(),
                                             "group05")
        self.assertEqual(len(wps), 1)
        yield self.commit()
        yield JobItem.waitEmpty(self._sqlCalendarStore.newTransaction, reactor,
                                60)

        calendar = yield self.calendarUnderTest(home="user03", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 2)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user03")
            self.assertEqual(invite.uid, shareeView.shareName())
            if invite.shareeUID == "user01":
                self.assertEqual(invite.mode, _BIND_MODE_READ)
            else:
                self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()),
                             _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [
                invite.uid,
            ])

        # Uninvite
        calendar = yield self.calendarUnderTest(home="user03", name="calendar")
        yield calendar.uninviteUIDFromShare("user01")
        yield calendar.uninviteUIDFromShare("group05")
        yield calendar.uninviteUIDFromShare("group06")
        noinvites = yield calendar.sharingInvites()
        self.assertEqual(len(noinvites), 0)
Ejemplo n.º 2
0
    def test_no_self_invite_on_add(self):
        """
        Test that the sharee is not invited to their own share when they are added as a member
        of a group to whom the calendar is shared.
        """

        record01 = yield self.transactionUnderTest().directoryService(
        ).recordWithUID("user01")
        record02 = yield self.transactionUnderTest().directoryService(
        ).recordWithUID("user02")

        @inlineCallbacks
        def expandedMembers(self, records=None, seen=None):

            if self.uid == "group06":
                returnValue(frozenset((
                    record01,
                    record02,
                )))
            else:
                returnValue((yield
                             unpatchedExpandedMembers(self, records, seen)))

        unpatchedExpandedMembers = CalendarDirectoryRecordMixin.expandedMembers

        # setup group cacher
        groupCacher = GroupCacher(
            self.transactionUnderTest().directoryService())
        groupsToRefresh = yield groupCacher.groupsToRefresh(
            self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 0)
        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(),
                                             "group06")
        self.assertEqual(len(wps), 0)

        yield self._check_notifications("user01", [])

        # Invite
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 0)
        self.assertFalse(calendar.isSharedByOwner())

        yield self._check_notifications("user01", [])
        shareeViews = yield calendar.inviteUIDToShare("group06",
                                                      _BIND_MODE_READ)
        self.assertEqual(len(shareeViews), 1)
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 1)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()),
                             _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [
                invite.uid,
            ])

        # 1 group members
        self.patch(CalendarDirectoryRecordMixin, "expandedMembers",
                   expandedMembers)

        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(),
                                             "group06")
        self.assertEqual(len(wps), 1)
        yield self.commit()
        yield JobItem.waitEmpty(self._sqlCalendarStore.newTransaction, reactor,
                                60)

        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 1)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()),
                             _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [
                invite.uid,
            ])

        yield self._check_notifications("user01", [])

        # Uninvite
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        yield calendar.uninviteUIDFromShare("group06")
        noinvites = yield calendar.sharingInvites()
        self.assertEqual(len(noinvites), 0)
Ejemplo n.º 3
0
    def test_group_change_removed_calendar(self):
        """
        Test that group shares are properly cleaned when a calendar is removed (and not trashed).
        """

        self.patch(config, "EnableTrashCollection", False)

        @inlineCallbacks
        def expandedMembers(self, records=None, seen=None):

            if self.uid == "group02":
                returnValue(frozenset())
            else:
                returnValue((yield
                             unpatchedExpandedMembers(self, records, seen)))

        unpatchedExpandedMembers = CalendarDirectoryRecordMixin.expandedMembers

        # setup group cacher
        groupCacher = GroupCacher(
            self.transactionUnderTest().directoryService())
        groupsToRefresh = yield groupCacher.groupsToRefresh(
            self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 0)
        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(),
                                             "group02")
        self.assertEqual(len(wps), 0)

        yield self._check_notifications("user01", [])

        # New calendar for sharing
        home = yield self.homeUnderTest(name="user01")
        yield home.createCalendarWithName("shared")
        yield self.commit()

        # Invite
        calendar = yield self.calendarUnderTest(home="user01", name="shared")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 0)
        self.assertFalse(calendar.isSharedByOwner())

        yield self._check_notifications("user01", [])
        shareeViews = yield calendar.inviteUIDToShare("group02",
                                                      _BIND_MODE_READ)
        self.assertEqual(len(shareeViews), 3)
        calendar = yield self.calendarUnderTest(home="user01", name="shared")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 3)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()),
                             _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [
                invite.uid,
            ])

        groupsToRefresh = yield groupCacher.groupsToRefresh(
            self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 1)
        yield self.commit()

        # Remove the collection
        calendar = yield self.calendarUnderTest(home="user01", name="shared")
        remove_id = calendar.id()
        yield calendar.remove()
        yield self.commit()

        home = yield self.homeUnderTest(name="user01")
        calendar = yield home.childWithID(remove_id)
        self.assertTrue(calendar is None)
        calendar = yield home.childWithID(remove_id, onlyInTrash=True)
        self.assertTrue(calendar is None)
        yield self.commit()

        # 1 group member
        self.patch(CalendarDirectoryRecordMixin, "expandedMembers",
                   expandedMembers)

        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(),
                                             "group02")
        self.assertEqual(len(wps), 0)
        yield self.commit()
        yield JobItem.waitEmpty(self._sqlCalendarStore.newTransaction, reactor,
                                60)
Ejemplo n.º 4
0
    def test_group_change_invite_larger(self):
        """
        Test that group shares are changed when the group changes.
        """
        @inlineCallbacks
        def expandedMembers(self, records=None, seen=None):

            if self.uid == "group02" or self.uid == "group03":
                returnValue(frozenset())
            else:
                returnValue((yield
                             unpatchedExpandedMembers(self, records, seen)))

        unpatchedExpandedMembers = CalendarDirectoryRecordMixin.expandedMembers

        # 1 group member
        self.patch(CalendarDirectoryRecordMixin, "expandedMembers",
                   expandedMembers)

        # setup group cacher
        groupCacher = GroupCacher(
            self.transactionUnderTest().directoryService())
        groupsToRefresh = yield groupCacher.groupsToRefresh(
            self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 0)
        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(),
                                             "group04")
        self.assertEqual(len(wps), 0)

        yield self._check_notifications("user01", [])

        # Invite
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 0)
        self.assertFalse(calendar.isSharedByOwner())

        yield self._check_notifications("user01", [])
        shareeViews = yield calendar.inviteUIDToShare("group04",
                                                      _BIND_MODE_READ)
        self.assertEqual(len(shareeViews), 1)
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 1)
        for invite in invites:
            self.assertEqual(invite.shareeUID, "user10")
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()),
                             _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [
                invite.uid,
            ])

        groupsToRefresh = yield groupCacher.groupsToRefresh(
            self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 1)

        # group members restored
        self.patch(CalendarDirectoryRecordMixin, "expandedMembers",
                   unpatchedExpandedMembers)

        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(),
                                             "group04")
        self.assertEqual(len(wps), 1)
        yield self.commit()
        yield JobItem.waitEmpty(self._sqlCalendarStore.newTransaction, reactor,
                                60)

        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 5)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()),
                             _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [
                invite.uid,
            ])

        # Uninvite
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        yield calendar.uninviteUIDFromShare("group04")
        noinvites = yield calendar.sharingInvites()
        self.assertEqual(len(noinvites), 0)
Ejemplo n.º 5
0
    def test_group_member_removal_refresh_slow(self):
        """
        Test that the sharee list is still valid when a member is removed from a group, but
        sharee reconciliation has not yet occurred.
        """
        @inlineCallbacks
        def expandedMembers(self, records=None, seen=None):

            if self.uid == "group02":
                returnValue(frozenset())
            else:
                returnValue((yield
                             unpatchedExpandedMembers(self, records, seen)))

        unpatchedExpandedMembers = CalendarDirectoryRecordMixin.expandedMembers

        # Prevent sharee reconciliation
        def _noop(self):
            return succeed(None)

        self.patch(GroupShareeReconciliationWork, "doWork", _noop)

        # setup group cacher
        groupCacher = GroupCacher(
            self.transactionUnderTest().directoryService())
        groupsToRefresh = yield groupCacher.groupsToRefresh(
            self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 0)
        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(),
                                             "group02")
        self.assertEqual(len(wps), 0)

        yield self._check_notifications("user01", [])

        # Invite
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 0)
        self.assertFalse(calendar.isSharedByOwner())

        yield self._check_notifications("user01", [])
        shareeViews = yield calendar.inviteUIDToShare("group02",
                                                      _BIND_MODE_READ)
        self.assertEqual(len(shareeViews), 3)
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 3)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()),
                             _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [
                invite.uid,
            ])

        groupsToRefresh = yield groupCacher.groupsToRefresh(
            self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 1)

        # 0 group members
        self.patch(CalendarDirectoryRecordMixin, "expandedMembers",
                   expandedMembers)

        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(),
                                             "group02")
        self.assertEqual(len(wps), 1)
        yield self.commit()
        yield JobItem.waitEmpty(self._sqlCalendarStore.newTransaction, reactor,
                                60)

        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 3)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()),
                             _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [
                invite.uid,
            ])

        yield self._check_notifications("user01", [])

        # Uninvite
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        yield calendar.uninviteUIDFromShare("group02")
        noinvites = yield calendar.sharingInvites()
        self.assertEqual(len(noinvites), 3)
Ejemplo n.º 6
0
    def test_multiple_groups_with_individual_remove_from_one_group(self):
        """
        Test that a multi-group share each containing the same user still lists the user
        when they are removed from one group.
        """

        @inlineCallbacks
        def expandedMembers(self, records=None, seen=None):

            if self.uid == "group05":
                returnValue(frozenset())
            else:
                returnValue((yield unpatchedExpandedMembers(self, records, seen)))

        unpatchedExpandedMembers = CalendarDirectoryRecordMixin.expandedMembers

        # setup group cacher
        groupCacher = GroupCacher(self.transactionUnderTest().directoryService())
        groupsToRefresh = yield groupCacher.groupsToRefresh(self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 0)
        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(), "group05")
        self.assertEqual(len(wps), 0)
        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(), "group06")
        self.assertEqual(len(wps), 0)

        # Invite
        calendar = yield self.calendarUnderTest(home="user03", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 0)
        self.assertFalse(calendar.isShared())

        shareeView = yield calendar.inviteUIDToShare("user01", _BIND_MODE_READ)
        self.assertTrue(shareeView is not None)
        shareeViews = yield calendar.inviteUIDToShare("group05", _BIND_MODE_WRITE)
        self.assertEqual(len(shareeViews), 2)
        shareeViews = yield calendar.inviteUIDToShare("group06", _BIND_MODE_READ)
        self.assertEqual(len(shareeViews), 1)

        calendar = yield self.calendarUnderTest(home="user03", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 2)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user03")
            self.assertEqual(invite.uid, shareeView.shareName())
            if invite.shareeUID == "user01":
                self.assertEqual(invite.mode, _BIND_MODE_GROUP_READ)
            else:
                self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()), _BIND_MODE_WRITE)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [invite.uid, ])

        groupsToRefresh = yield groupCacher.groupsToRefresh(self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 2)

        # Change group membership
        self.patch(CalendarDirectoryRecordMixin, "expandedMembers", expandedMembers)

        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(), "group05")
        self.assertEqual(len(wps), 1)
        yield self.commit()
        yield JobItem.waitEmpty(self._sqlCalendarStore.newTransaction, reactor, 60)

        calendar = yield self.calendarUnderTest(home="user03", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 2)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user03")
            self.assertEqual(invite.uid, shareeView.shareName())
            if invite.shareeUID == "user01":
                self.assertEqual(invite.mode, _BIND_MODE_READ)
            else:
                self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()), _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [invite.uid, ])

        # Uninvite
        calendar = yield self.calendarUnderTest(home="user03", name="calendar")
        yield calendar.uninviteUIDFromShare("user01")
        yield calendar.uninviteUIDFromShare("group05")
        yield calendar.uninviteUIDFromShare("group06")
        noinvites = yield calendar.sharingInvites()
        self.assertEqual(len(noinvites), 0)
Ejemplo n.º 7
0
    def test_group_change_removed_calendar(self):
        """
        Test that group shares are properly cleaned when a calendar is removed (and not trashed).
        """

        self.patch(config, "EnableTrashCollection", False)

        @inlineCallbacks
        def expandedMembers(self, records=None, seen=None):

            if self.uid == "group02":
                returnValue(frozenset())
            else:
                returnValue((yield unpatchedExpandedMembers(self, records, seen)))

        unpatchedExpandedMembers = CalendarDirectoryRecordMixin.expandedMembers

        # setup group cacher
        groupCacher = GroupCacher(self.transactionUnderTest().directoryService())
        groupsToRefresh = yield groupCacher.groupsToRefresh(self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 0)
        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(), "group02")
        self.assertEqual(len(wps), 0)

        yield self._check_notifications("user01", [])

        # New calendar for sharing
        home = yield self.homeUnderTest(name="user01")
        yield home.createCalendarWithName("shared")
        yield self.commit()

        # Invite
        calendar = yield self.calendarUnderTest(home="user01", name="shared")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 0)
        self.assertFalse(calendar.isShared())

        yield self._check_notifications("user01", [])
        shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ)
        self.assertEqual(len(shareeViews), 3)
        calendar = yield self.calendarUnderTest(home="user01", name="shared")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 3)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()), _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [invite.uid, ])

        groupsToRefresh = yield groupCacher.groupsToRefresh(self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 1)
        yield self.commit()

        # Remove the collection
        calendar = yield self.calendarUnderTest(home="user01", name="shared")
        remove_id = calendar.id()
        yield calendar.remove()
        yield self.commit()

        home = yield self.homeUnderTest(name="user01")
        calendar = yield home.childWithID(remove_id)
        self.assertTrue(calendar is None)
        calendar = yield home.childWithID(remove_id, onlyInTrash=True)
        self.assertTrue(calendar is None)
        yield self.commit()

        # 1 group member
        self.patch(CalendarDirectoryRecordMixin, "expandedMembers", expandedMembers)

        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(), "group02")
        self.assertEqual(len(wps), 0)
        yield self.commit()
        yield JobItem.waitEmpty(self._sqlCalendarStore.newTransaction, reactor, 60)
Ejemplo n.º 8
0
    def test_no_self_invite_on_add(self):
        """
        Test that the sharee is not invited to their own share when they are added as a member
        of a group to whom the calendar is shared.
        """

        record01 = yield self.transactionUnderTest().directoryService().recordWithUID("user01")
        record02 = yield self.transactionUnderTest().directoryService().recordWithUID("user02")

        @inlineCallbacks
        def expandedMembers(self, records=None, seen=None):

            if self.uid == "group06":
                returnValue(frozenset((record01, record02,)))
            else:
                returnValue((yield unpatchedExpandedMembers(self, records, seen)))

        unpatchedExpandedMembers = CalendarDirectoryRecordMixin.expandedMembers

        # setup group cacher
        groupCacher = GroupCacher(self.transactionUnderTest().directoryService())
        groupsToRefresh = yield groupCacher.groupsToRefresh(self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 0)
        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(), "group06")
        self.assertEqual(len(wps), 0)

        yield self._check_notifications("user01", [])

        # Invite
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 0)
        self.assertFalse(calendar.isShared())

        yield self._check_notifications("user01", [])
        shareeViews = yield calendar.inviteUIDToShare("group06", _BIND_MODE_READ)
        self.assertEqual(len(shareeViews), 1)
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 1)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()), _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [invite.uid, ])

        # 1 group members
        self.patch(CalendarDirectoryRecordMixin, "expandedMembers", expandedMembers)

        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(), "group06")
        self.assertEqual(len(wps), 1)
        yield self.commit()
        yield JobItem.waitEmpty(self._sqlCalendarStore.newTransaction, reactor, 60)

        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 1)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()), _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [invite.uid, ])

        yield self._check_notifications("user01", [])

        # Uninvite
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        yield calendar.uninviteUIDFromShare("group06")
        noinvites = yield calendar.sharingInvites()
        self.assertEqual(len(noinvites), 0)
Ejemplo n.º 9
0
    def test_group_member_removal_refresh_slow(self):
        """
        Test that the sharee list is still valid when a member is removed from a group, but
        sharee reconciliation has not yet occurred.
        """

        @inlineCallbacks
        def expandedMembers(self, records=None, seen=None):

            if self.uid == "group02":
                returnValue(frozenset())
            else:
                returnValue((yield unpatchedExpandedMembers(self, records, seen)))

        unpatchedExpandedMembers = CalendarDirectoryRecordMixin.expandedMembers

        # Prevent sharee reconciliation
        def _noop(self):
            return succeed(None)
        self.patch(GroupShareeReconciliationWork, "doWork", _noop)

        # setup group cacher
        groupCacher = GroupCacher(self.transactionUnderTest().directoryService())
        groupsToRefresh = yield groupCacher.groupsToRefresh(self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 0)
        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(), "group02")
        self.assertEqual(len(wps), 0)

        yield self._check_notifications("user01", [])

        # Invite
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 0)
        self.assertFalse(calendar.isShared())

        yield self._check_notifications("user01", [])
        shareeViews = yield calendar.inviteUIDToShare("group02", _BIND_MODE_READ)
        self.assertEqual(len(shareeViews), 3)
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 3)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()), _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [invite.uid, ])

        groupsToRefresh = yield groupCacher.groupsToRefresh(self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 1)

        # 0 group members
        self.patch(CalendarDirectoryRecordMixin, "expandedMembers", expandedMembers)

        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(), "group02")
        self.assertEqual(len(wps), 1)
        yield self.commit()
        yield JobItem.waitEmpty(self._sqlCalendarStore.newTransaction, reactor, 60)

        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 3)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()), _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [invite.uid, ])

        yield self._check_notifications("user01", [])

        # Uninvite
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        yield calendar.uninviteUIDFromShare("group02")
        noinvites = yield calendar.sharingInvites()
        self.assertEqual(len(noinvites), 3)
Ejemplo n.º 10
0
    def test_group_change_invite_larger(self):
        """
        Test that group shares are changed when the group changes.
        """

        @inlineCallbacks
        def expandedMembers(self, records=None, seen=None):

            if self.uid == "group02" or self.uid == "group03":
                returnValue(frozenset())
            else:
                returnValue((yield unpatchedExpandedMembers(self, records, seen)))

        unpatchedExpandedMembers = CalendarDirectoryRecordMixin.expandedMembers

        # 1 group member
        self.patch(CalendarDirectoryRecordMixin, "expandedMembers", expandedMembers)

        # setup group cacher
        groupCacher = GroupCacher(self.transactionUnderTest().directoryService())
        groupsToRefresh = yield groupCacher.groupsToRefresh(self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 0)
        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(), "group04")
        self.assertEqual(len(wps), 0)

        yield self._check_notifications("user01", [])

        # Invite
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 0)
        self.assertFalse(calendar.isShared())

        yield self._check_notifications("user01", [])
        shareeViews = yield calendar.inviteUIDToShare("group04", _BIND_MODE_READ)
        self.assertEqual(len(shareeViews), 1)
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 1)
        for invite in invites:
            self.assertEqual(invite.shareeUID, "user10")
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()), _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [invite.uid, ])

        groupsToRefresh = yield groupCacher.groupsToRefresh(self.transactionUnderTest())
        self.assertEqual(len(groupsToRefresh), 1)

        # group members restored
        self.patch(CalendarDirectoryRecordMixin, "expandedMembers", unpatchedExpandedMembers)

        wps = yield groupCacher.refreshGroup(self.transactionUnderTest(), "group04")
        self.assertEqual(len(wps), 1)
        yield self.commit()
        yield JobItem.waitEmpty(self._sqlCalendarStore.newTransaction, reactor, 60)

        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        invites = yield calendar.sharingInvites()
        self.assertEqual(len(invites), 5)
        for invite in invites:
            shareeView = yield calendar.shareeView(invite.shareeUID)
            self.assertEqual(invite.ownerUID, "user01")
            self.assertEqual(invite.uid, shareeView.shareName())
            self.assertEqual(invite.mode, _BIND_MODE_GROUP)
            self.assertEqual((yield shareeView.effectiveShareMode()), _BIND_MODE_READ)
            self.assertEqual(invite.status, _BIND_STATUS_INVITED)
            self.assertEqual(invite.summary, None)
            yield self._check_notifications(invite.shareeUID, [invite.uid, ])

        # Uninvite
        calendar = yield self.calendarUnderTest(home="user01", name="calendar")
        yield calendar.uninviteUIDFromShare("group04")
        noinvites = yield calendar.sharingInvites()
        self.assertEqual(len(noinvites), 0)