def testNoRecurrenceChange(self):
        """
        If recurrence fields weren't changed, empty list should be returned.
        """

        emptyDiff = sharing.Diff(set(), set())
        aliases = self._getAliases(
            self.uuid, [self.start + n * one_week for n in range(5)])

        # No conflicts when master isn't recurring
        self.assertEqual(self._getConflicts(emptyDiff, aliases), [])

        # create a diff with an EventRecord, but no recurrence changes
        self.kwds['dtstart'] = ';VALUE=DATE-TIME:20070301T090000'
        record = sharing.model.EventRecord(self.uuid, **self.kwds)
        diff = sharing.Diff(set([record]), set())

        # No conflicts
        self.assertEqual(self._getConflicts(diff, aliases), [])

        # try again when master is recurring
        self.master.rruleset = self._makeRecurrenceRuleSet(freq='weekly')

        conflicts = findRecurrenceConflicts(self.view, self.uuid, emptyDiff,
                                            aliases)
        # No conflicts with an empty diff
        self.assertEqual(self._getConflicts(emptyDiff, aliases), [])
        # A start time change should give conflicts
        self.assertNotEqual(self._getConflicts(diff, aliases), [])
    def testExdate(self):
        """If an EXDATE is added, it should conflict."""
        self.master.rruleset = self._makeRecurrenceRuleSet(freq='weekly')
        aliases = self._getAliases(
            self.uuid, [self.start + n * one_week for n in range(5)])

        # create a diff with an EventRecord in exclusions.  The EventRecord
        # can't be empty or it'll be seen as NoChange, so make a small change
        self.kwds['exdate'] = ';VALUE=DATE-TIME:20070417T090000'
        record = sharing.model.EventRecord(self.uuid, **self.kwds)
        diff = sharing.Diff(set([record]), set())

        self.assertEqual(self._getConflicts(diff, aliases), aliases[1:2])

        # choose an exdate that doesn't conflict with anything (changed time)
        self.kwds['exdate'] = ';VALUE=DATE-TIME:20070417T000000'
        record = sharing.model.EventRecord(self.uuid, **self.kwds)
        diff = sharing.Diff(set([record]), set())

        self.assertEqual(self._getConflicts(diff, aliases), [])
    def testAllDay(self):
        self.master.allDay = True

        self.master.rruleset = self._makeRecurrenceRuleSet(freq='weekly')
        self.kwds['rrule'] = 'FREQ=WEEKLY;UNTIL=20070424'
        record = sharing.model.EventRecord(self.uuid, **self.kwds)
        diff = sharing.Diff(set([record]), set())

        aliases = self._getAliases(
            self.uuid,
            [self.master.effectiveStartTime + n * one_week for n in range(5)])

        self.assertEqual(self._getConflicts(diff, aliases), aliases[3:])
    def testUnstamping(self):
        """If EventRecord is removed, it will be in exclusions."""
        self.master.rruleset = self._makeRecurrenceRuleSet(freq='weekly')
        aliases = self._getAliases(
            self.uuid, [self.start + n * one_week for n in range(5)])

        # create a diff with an EventRecord in exclusions.  The EventRecord
        # can't be empty or it'll be seen as NoChange, so make a small change
        self.kwds['exdate'] = None
        record = sharing.model.EventRecord(self.uuid, **self.kwds)
        diff = sharing.Diff(set(), set([record]))

        self.assertEqual(self._getConflicts(diff, aliases), aliases)
    def testRemoveRecurrence(self):
        """All modifications should be returned if recurrence was removed."""
        self.master.rruleset = self._makeRecurrenceRuleSet(freq='weekly')
        aliases = self._getAliases(
            self.uuid, [self.start + n * one_week for n in range(5)])

        # create a diff with all recurrence fields empty
        recurrence_fields = ('exdate', 'rdate', 'rrule', 'exrule')
        self.kwds.update(dict.fromkeys(recurrence_fields))
        record = sharing.model.EventRecord(self.uuid, **self.kwds)
        diff = sharing.Diff(set([record]), set())

        self.assertEqual(self._getConflicts(diff, aliases), aliases)
    def testTimezonedEvent(self):
        self.master.startTime = self.start.replace(tzinfo=self.pacific)

        self.master.rruleset = self._makeRecurrenceRuleSet(freq='weekly')
        self.kwds['rrule'] = 'FREQ=WEEKLY;UNTIL=20070424T160000Z'
        self.kwds[
            'exdate'] = ';VALUE=DATE-TIME;TZID=America/Los_Angeles:20070417T090000'
        record = sharing.model.EventRecord(self.uuid, **self.kwds)
        diff = sharing.Diff(set([record]), set())

        aliases = self._getAliases(
            self.uuid,
            [self.master.startTime + n * one_week for n in range(5)])

        self.assertEqual(self._getConflicts(diff, aliases),
                         aliases[1:2] + aliases[3:])
    def testUntilChange(self):
        """
        Inbound changes to Until should work.
        """
        # set up master to recur
        self.master.rruleset = self._makeRecurrenceRuleSet(freq='weekly')

        # create a diff
        self.kwds['rrule'] = 'FREQ=WEEKLY;UNTIL=20070425T170000Z'
        record = sharing.model.EventRecord(self.uuid, **self.kwds)
        diff = sharing.Diff(set([record]), set())

        # get a sample set of aliases to test
        aliases = self._getAliases(
            self.uuid, [self.start + n * one_week for n in range(5)])

        # the first three come before April 25
        self.assertEqual(self._getConflicts(diff, aliases), aliases[3:])
    def testRemoveRrruleLeaveRdate(self):
        """
        Removing an RRULE shouldn't cause everything to conflict if there are
        still RDATEs.
        
        """
        self.master.rruleset = self._makeRecurrenceRuleSet(freq='weekly')
        self.master.rruleset.rdates = [
            self.start + n * one_day for n in range(1, 3)
        ]

        # create a diff removing the RRULE
        self.kwds['rrule'] = None
        record = sharing.model.EventRecord(self.uuid, **self.kwds)
        diff = sharing.Diff(set([record]), set())

        # get a sample set of aliases to test that don't overlap with seven day
        # intervals
        aliases = self._getAliases(
            self.uuid, [self.start + n * one_day for n in range(5)])

        self.assertEqual(self._getConflicts(diff, aliases), aliases[3:])
    def testFrequencyChange(self):
        """
        Currently, Chandler leaves off-rule modifications after recurrence rule
        changes (there's no pending deletion).  For now, remote rule changes
        that leave the event recurring *do* conflict with local off-rule
        modifications for sharing.
        
        """
        # set up master to recur
        self.master.rruleset = self._makeRecurrenceRuleSet(freq='daily')

        # create a diff changing frequency to weekly
        self.kwds['rrule'] = 'FREQ=WEEKLY'
        record = sharing.model.EventRecord(self.uuid, **self.kwds)
        diff = sharing.Diff(set([record]), set())

        # get a sample set of aliases to test that don't overlap with seven day
        # intervals
        aliases = self._getAliases(
            self.uuid, [self.start + n * one_day for n in range(0, 30, 5)])

        self.assertEqual(self._getConflicts(diff, aliases), aliases[1:])