Source code for radioco.apps.schedules.tests.test_recurrences

# Radioco - Broadcasting Radio Recording Scheduling system.
# Copyright (C) 2014  Iago Veloso Abalo
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
import datetime

import recurrence
from django.test import TestCase

from radioco.apps.radioco.test_utils import TestDataMixin
from radioco.apps.radioco.tz_utils import recurrence_after, recurrence_before


[docs]class RecurrenceTests(TestDataMixin, TestCase): """ Tests to check django-recurrence behaviour """
[docs] def setUp(self): self.monthly_recurrence = recurrence.Recurrence( rrules=[recurrence.Rule(recurrence.MONTHLY)])
[docs] def test_when_date_doesnt_exist_on_february(self): after_dt = datetime.datetime(2014, 1, 29, 14, 0, 0) before_dt = datetime.datetime(2014, 12, 29, 13, 59, 59) start_dt = after_dt dts = self.monthly_recurrence.between(after_dt, before_dt, inc=True, dtstart=start_dt) self.assertEquals(10, len(dts), dts) # assert datetime.datetime(2014, 2, 29, 14, 0, 0) not in dts, day is out of range for month assert datetime.datetime(2014, 12, 29, 14, 0, 0) not in dts
[docs] def test_last_date_is_equals_before_limit(self): after_dt = datetime.datetime(2014, 1, 20, 14, 0, 0) before_dt = datetime.datetime(2014, 2, 20, 14, 0, 0) start_dt = after_dt dts = self.monthly_recurrence.between(after_dt, before_dt, inc=True, dtstart=start_dt) self.assertEquals(2, len(dts), dts) assert datetime.datetime(2014, 2, 20, 14, 0, 0) in dts
[docs] def test_start_date_is_before_start_limit(self): after_dt = datetime.datetime(2014, 1, 20, 14, 0, 0) before_dt = datetime.datetime(2014, 2, 20, 14, 0, 0) start_dt = datetime.datetime(2014, 1, 19, 14, 0, 0) dts = self.monthly_recurrence.between(after_dt, before_dt, inc=True, dtstart=start_dt) self.assertEquals(1, len(dts), dts) assert datetime.datetime(2014, 2, 19, 14, 0, 0) in dts
[docs] def test_after(self): start_dt = datetime.datetime(2014, 1, 20, 14, 0, 0) after = datetime.datetime(2014, 1, 1, 13, 59, 59) dt = self.monthly_recurrence.after(after, dtstart=start_dt) self.assertEquals(datetime.datetime(2014, 1, 20, 14, 0, 0), dt) after = start_dt dt = self.monthly_recurrence.after(after, dtstart=start_dt) self.assertEquals(datetime.datetime(2014, 2, 20, 14, 0, 0), dt)
[docs] def test_after_inclusive(self): start_dt = datetime.datetime(2014, 1, 20, 14, 0, 0) after = start_dt dt = self.monthly_recurrence.after(after, True, dtstart=start_dt) self.assertEquals(datetime.datetime(2014, 1, 20, 14, 0, 0), dt)
[docs] def test_before_dt(self): start_dt = datetime.datetime(2014, 1, 20, 14, 0, 0) before = datetime.datetime(2014, 1, 20, 14, 0, 1) dt = self.monthly_recurrence.before(before, dtstart=start_dt) self.assertEquals(datetime.datetime(2014, 1, 20, 14, 0, 0), dt) before = start_dt assert self.monthly_recurrence.before(before, dtstart=start_dt) is None
[docs] def test_before_inclusive(self): start_dt = datetime.datetime(2014, 1, 20, 14, 0, 0) before = start_dt dt = self.monthly_recurrence.before(before, True, dtstart=start_dt) self.assertEquals(datetime.datetime(2014, 1, 20, 14, 0, 0), dt)
[docs] def test_impossible_recurrence_after(self): """ Testing error calling after and function wrapper to solve it (recurrence_after) """ start_dt = datetime.datetime(2014, 1, 20, 14, 0, 0) until_dt = datetime.datetime(2014, 1, 19, 14, 0, 0) daily_recurrence = recurrence.Recurrence( rrules=[recurrence.Rule(recurrence.DAILY, until=until_dt)]) dt = daily_recurrence.after(start_dt, True, dtstart=start_dt) self.assertEquals(start_dt, dt) # wrong! self.assertIsNone(recurrence_after(daily_recurrence, start_dt, start_dt))
[docs] def test_impossible_recurrence_before(self): """ Testing error calling before and function wrapper to solve it (recurrence_before) """ start_dt = datetime.datetime(2014, 1, 20, 14, 0, 0) until_dt = datetime.datetime(2014, 1, 19, 14, 0, 0) daily_recurrence = recurrence.Recurrence( rrules=[recurrence.Rule(recurrence.MONTHLY, until=until_dt)]) dt = daily_recurrence.before(start_dt + datetime.timedelta(seconds=1), dtstart=start_dt) self.assertEquals(start_dt, dt) # wrong! self.assertIsNone(recurrence_before(daily_recurrence, start_dt + datetime.timedelta(seconds=1), start_dt))
[docs]class EmptyRecurrenceTests(TestDataMixin, TestCase): """ Tests to check django-recurrence behaviour when there are no recurrences """
[docs] def setUp(self): self.empty_recurrence = recurrence.Recurrence()
[docs] def test_no_values(self): self.assertFalse(bool(self.empty_recurrence))
[docs] def test_after(self): start_dt = datetime.datetime(2014, 1, 1, 14, 0, 0) after = datetime.datetime(2014, 1, 1, 13, 59, 59) dt = self.empty_recurrence.after(after, dtstart=start_dt) self.assertEquals(datetime.datetime(2014, 1, 1, 14, 0, 0), dt) after = start_dt self.assertIsNone(self.empty_recurrence.after(after, dtstart=start_dt)) after = datetime.datetime(2014, 1, 1, 14, 0, 1) self.assertIsNone(self.empty_recurrence.after(after, dtstart=start_dt))
[docs] def test_after_inclusive(self): start_dt = datetime.datetime(2014, 1, 1, 14, 0, 0) after = datetime.datetime(2014, 1, 1, 13, 59, 59) dt = self.empty_recurrence.after(after, True, dtstart=start_dt) self.assertEquals(datetime.datetime(2014, 1, 1, 14, 0, 0), dt) after = start_dt dt = self.empty_recurrence.after(after, True, dtstart=start_dt) self.assertEquals(datetime.datetime(2014, 1, 1, 14, 0, 0), dt) after = datetime.datetime(2014, 1, 1, 14, 0, 1) self.assertIsNone(self.empty_recurrence.after(after, True, dtstart=start_dt))
[docs] def test_before(self): start_dt = datetime.datetime(2014, 1, 1, 14, 0, 0) before = datetime.datetime(2014, 1, 1, 14, 0, 1) dt = self.empty_recurrence.before(before, dtstart=start_dt) self.assertEquals(datetime.datetime(2014, 1, 1, 14, 0, 0), dt) before = start_dt self.assertIsNone(self.empty_recurrence.before(before, dtstart=start_dt)) before = datetime.datetime(2014, 1, 1, 13, 59, 59) self.assertIsNone(self.empty_recurrence.before(before, dtstart=start_dt))
[docs] def test_before_inclusive(self): start_dt = datetime.datetime(2014, 1, 1, 14, 0, 0) before = datetime.datetime(2014, 1, 1, 14, 0, 1) dt = self.empty_recurrence.before(before, True, dtstart=start_dt) self.assertEquals(datetime.datetime(2014, 1, 1, 14, 0, 0), dt) before = start_dt dt = self.empty_recurrence.before(before, True, dtstart=start_dt) self.assertEquals(datetime.datetime(2014, 1, 1, 14, 0, 0), dt) before = datetime.datetime(2014, 1, 1, 13, 59, 59) self.assertIsNone(self.empty_recurrence.before(before, True, dtstart=start_dt))