summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorCurtis Vogt <curtis.vogt@invenia.ca>2014-03-06 15:37:05 -0600
committerCurtis Vogt <curtis.vogt@invenia.ca>2014-04-08 14:23:26 -0500
commitba9b2a4a1fbfe74bf810237b750c9a7ff8ce13be (patch)
tree385b06fd9faa82eba5248cad842a7069ed391e01 /tests
parent9be8dc06e453c3a3a89f4c9c14c44a4fcb42b526 (diff)
downloadapscheduler-ba9b2a4a1fbfe74bf810237b750c9a7ff8ce13be.tar.gz
Improved timezone support especially for the pytz module.
Overview: - Datetime localization now supports pytz timezones. - Trigger get_next_fire_time now expect a timezone aware datetime. - Normalized datetimes from get_next_fire_time. - CronTrigger uses the timezone of the start_date rather than the trigger. - Added trigger testcases for DST fallback.
Diffstat (limited to 'tests')
-rw-r--r--tests/test_triggers.py74
1 files changed, 73 insertions, 1 deletions
diff --git a/tests/test_triggers.py b/tests/test_triggers.py
index ddd3818..c739e07 100644
--- a/tests/test_triggers.py
+++ b/tests/test_triggers.py
@@ -1,6 +1,7 @@
-from datetime import datetime
+from datetime import datetime, timedelta
from dateutil.tz import tzoffset
+import pytz
import pytest
from apscheduler.triggers.cron import CronTrigger
@@ -132,6 +133,37 @@ class TestCronTrigger(object):
correct_next_date = datetime(2009, 4, 8, tzinfo=timezone)
assert trigger.get_next_fire_time(start_date) == correct_next_date
+ def test_dst_change(self):
+ """
+ Making sure that CronTrigger works during the ambiguous
+ "fall-back" DST period. Note that you should explicitly
+ compare datetimes as strings to avoid the internal datetime
+ comparison which would test for equality in the UTC timezone.
+ """
+ eastern = pytz.timezone('US/Eastern')
+ trigger = CronTrigger(hour='*/1', timezone=eastern)
+
+ datetime_edt = eastern.localize(datetime(2013, 11, 3, 1, 5), is_dst=True)
+ correct_next_date = eastern.normalize(datetime_edt + timedelta(minutes=55))
+ assert str(trigger.get_next_fire_time(datetime_edt)) == str(correct_next_date)
+
+ datetime_est = eastern.localize(datetime(2013, 11, 3, 1, 5), is_dst=False)
+ correct_next_date = eastern.normalize(datetime_est + timedelta(minutes=55))
+ assert str(trigger.get_next_fire_time(datetime_est)) == str(correct_next_date)
+
+ def test_timezone_change(self):
+ """
+ Ensuring that get_next_fire_time method returns datetimes in the
+ timezone of the trigger and not in the timezone of the passed in
+ start_date.
+ """
+ est = tzoffset('EST', -18000)
+ cst = tzoffset('CST', -21600)
+ trigger = CronTrigger(hour=11, minute='*/5', timezone=est)
+ start_date = datetime(2009, 9, 26, 10, 16, tzinfo=cst)
+ correct_next_date = datetime(2009, 9, 26, 11, 20, tzinfo=est)
+ assert str(trigger.get_next_fire_time(start_date)) == str(correct_next_date)
+
class TestDateTrigger(object):
def test_date_trigger_earlier(self, timezone):
@@ -166,6 +198,27 @@ class TestDateTrigger(object):
start_date = datetime(2009, 7, 6, tzinfo=timezone)
assert trigger.get_next_fire_time(start_date) == fire_date
+ def test_dst_change(self):
+ """
+ Making sure that DateTrigger works during the ambiguous
+ "fall-back" DST period. Note that you should explicitly
+ compare datetimes as strings to avoid the internal datetime
+ comparison which would test for equality in the UTC timezone.
+ """
+ eastern = pytz.timezone('US/Eastern')
+ datetime_edt = eastern.localize(datetime(2013, 11, 3, 1, 5), is_dst=True)
+ datetime_est = eastern.localize(datetime(2013, 11, 3, 1, 5), is_dst=False)
+
+ fire_date = datetime_edt + timedelta(minutes=55)
+ trigger = DateTrigger(run_date=fire_date, timezone=eastern)
+ correct_next_date = eastern.normalize(fire_date)
+ assert str(trigger.get_next_fire_time(datetime_edt)) == str(correct_next_date)
+
+ fire_date = datetime_est + timedelta(minutes=55)
+ trigger = DateTrigger(run_date=fire_date, timezone=eastern)
+ correct_next_date = eastern.normalize(fire_date)
+ assert str(trigger.get_next_fire_time(datetime_est)) == str(correct_next_date)
+
class TestIntervalTrigger(object):
@pytest.fixture()
@@ -195,3 +248,22 @@ class TestIntervalTrigger(object):
start_date = datetime(2009, 8, 3, 22, second=2, microsecond=1000, tzinfo=alter_tz)
correct_next_date = datetime(2009, 8, 4, second=3, tzinfo=timezone)
assert trigger.get_next_fire_time(start_date) == correct_next_date
+
+ def test_dst_change(self):
+ """
+ Making sure that IntervalTrigger works during the ambiguous
+ "fall-back" DST period. Note that you should explicitly
+ compare datetimes as strings to avoid the internal datetime
+ comparison which would test for equality in the UTC timezone.
+ """
+ eastern = pytz.timezone('US/Eastern')
+ start_date = datetime(2013, 6, 1) # Start within EDT
+ trigger = IntervalTrigger(hours=1, start_date=start_date, timezone=eastern)
+
+ datetime_edt = eastern.localize(datetime(2013, 11, 3, 1, 5), is_dst=True)
+ correct_next_date = eastern.normalize(datetime_edt + timedelta(minutes=55))
+ assert str(trigger.get_next_fire_time(datetime_edt)) == str(correct_next_date)
+
+ datetime_est = eastern.localize(datetime(2013, 11, 3, 1, 5), is_dst=False)
+ correct_next_date = eastern.normalize(datetime_est + timedelta(minutes=55))
+ assert str(trigger.get_next_fire_time(datetime_est)) == str(correct_next_date)