summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAlex Grönholm <alex.gronholm@nextday.fi>2020-09-28 09:19:21 +0300
committerAlex Grönholm <alex.gronholm@nextday.fi>2020-09-28 09:35:20 +0300
commitefe16602580d47ef5cb9787f977a65a5791ea024 (patch)
tree3f88e9e778eace056141a86c97365aeaa119071b /tests
parent3205a400a5f0ee4677cef082f6c50570c7004edf (diff)
downloadapscheduler-efe16602580d47ef5cb9787f977a65a5791ea024.tar.gz
Converted triggers to use zoneinfo instead of pytz timezones
Diffstat (limited to 'tests')
-rw-r--r--tests/conftest.py9
-rw-r--r--tests/test_marshalling.py88
-rw-r--r--tests/test_util.py194
-rw-r--r--tests/triggers/test_calendarinterval.py8
-rw-r--r--tests/triggers/test_combining.py26
-rw-r--r--tests/triggers/test_cron.py124
-rw-r--r--tests/triggers/test_date.py4
-rw-r--r--tests/triggers/test_interval.py16
8 files changed, 189 insertions, 280 deletions
diff --git a/tests/conftest.py b/tests/conftest.py
index 05f3f4b..62e552f 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,16 +1,21 @@
+import sys
from datetime import datetime
from unittest.mock import Mock
import pytest
-import pytz
from apscheduler.serializers.cbor import CBORSerializer
from apscheduler.serializers.json import JSONSerializer
from apscheduler.serializers.pickle import PickleSerializer
+if sys.version_info >= (3, 9):
+ from zoneinfo import ZoneInfo
+else:
+ from backports.zoneinfo import ZoneInfo
+
@pytest.fixture(scope='session')
def timezone():
- return pytz.timezone('Europe/Berlin')
+ return ZoneInfo('Europe/Berlin')
@pytest.fixture
diff --git a/tests/test_marshalling.py b/tests/test_marshalling.py
new file mode 100644
index 0000000..541ea3e
--- /dev/null
+++ b/tests/test_marshalling.py
@@ -0,0 +1,88 @@
+import sys
+from datetime import timedelta
+from functools import partial
+from types import ModuleType
+
+import pytest
+from apscheduler.exceptions import SerializationError
+from apscheduler.marshalling import callable_from_ref, callable_to_ref
+
+
+class DummyClass:
+ def meth(self):
+ pass
+
+ @staticmethod
+ def staticmeth():
+ pass
+
+ @classmethod
+ def classmeth(cls):
+ pass
+
+ def __call__(self):
+ pass
+
+ class InnerDummyClass:
+ @classmethod
+ def innerclassmeth(cls):
+ pass
+
+
+class InheritedDummyClass(DummyClass):
+ @classmethod
+ def classmeth(cls):
+ pass
+
+
+class TestCallableToRef(object):
+ @pytest.mark.parametrize('obj, error', [
+ (partial(DummyClass.meth), 'Cannot create a reference to a partial()'),
+ (lambda: None, 'Cannot create a reference to a lambda')
+ ], ids=['partial', 'lambda'])
+ def test_errors(self, obj, error):
+ exc = pytest.raises(SerializationError, callable_to_ref, obj)
+ assert str(exc.value) == error
+
+ def test_nested_function_error(self):
+ def nested():
+ pass
+
+ exc = pytest.raises(SerializationError, callable_to_ref, nested)
+ assert str(exc.value) == 'Cannot create a reference to a nested function'
+
+ @pytest.mark.parametrize('input,expected', [
+ (DummyClass.meth, 'test_marshalling:DummyClass.meth'),
+ (DummyClass.classmeth, 'test_marshalling:DummyClass.classmeth'),
+ (DummyClass.InnerDummyClass.innerclassmeth,
+ 'test_marshalling:DummyClass.InnerDummyClass.innerclassmeth'),
+ (DummyClass.staticmeth, 'test_marshalling:DummyClass.staticmeth'),
+ (InheritedDummyClass.classmeth, 'test_marshalling:InheritedDummyClass.classmeth'),
+ (timedelta, 'datetime:timedelta'),
+ ], ids=['unbound method', 'class method', 'inner class method', 'static method',
+ 'inherited class method', 'timedelta'])
+ def test_valid_refs(self, input, expected):
+ assert callable_to_ref(input) == expected
+
+
+class TestCallableFromRef(object):
+ def test_valid_ref(self):
+ from logging.handlers import RotatingFileHandler
+ assert callable_from_ref('logging.handlers:RotatingFileHandler') is RotatingFileHandler
+
+ def test_complex_path(self):
+ pkg1 = ModuleType('pkg1')
+ pkg1.pkg2 = 'blah'
+ pkg2 = ModuleType('pkg1.pkg2')
+ pkg2.varname = lambda: None
+ sys.modules['pkg1'] = pkg1
+ sys.modules['pkg1.pkg2'] = pkg2
+ assert callable_from_ref('pkg1.pkg2:varname') == pkg2.varname
+
+ @pytest.mark.parametrize('input,error', [
+ (object(), TypeError),
+ ('module', ValueError),
+ ('module:blah', LookupError)
+ ], ids=['raw object', 'module', 'module attribute'])
+ def test_lookup_error(self, input, error):
+ pytest.raises(error, callable_from_ref, input)
diff --git a/tests/test_util.py b/tests/test_util.py
deleted file mode 100644
index 19ed988..0000000
--- a/tests/test_util.py
+++ /dev/null
@@ -1,194 +0,0 @@
-import platform
-import sys
-from datetime import datetime, timedelta
-from functools import partial
-from types import ModuleType
-
-import pytest
-from apscheduler.util import (
- check_callable_args, datetime_ceil, get_callable_name, maybe_ref, obj_to_ref, ref_to_obj)
-
-
-class DummyClass(object):
- def meth(self):
- pass
-
- @staticmethod
- def staticmeth():
- pass
-
- @classmethod
- def classmeth(cls):
- pass
-
- def __call__(self):
- pass
-
- class InnerDummyClass(object):
- @classmethod
- def innerclassmeth(cls):
- pass
-
-
-class InheritedDummyClass(DummyClass):
- @classmethod
- def classmeth(cls):
- pass
-
-
-@pytest.mark.parametrize('input,expected', [
- (datetime(2009, 4, 7, 2, 10, 16, 4000), datetime(2009, 4, 7, 2, 10, 17)),
- (datetime(2009, 4, 7, 2, 10, 16), datetime(2009, 4, 7, 2, 10, 16))
-], ids=['milliseconds', 'exact'])
-def test_datetime_ceil(input, expected):
- assert datetime_ceil(input) == expected
-
-
-class TestGetCallableName(object):
- @pytest.mark.parametrize('input,expected', [
- (open, 'open'),
- (DummyClass.staticmeth, 'DummyClass.staticmeth' if
- hasattr(DummyClass, '__qualname__') else 'staticmeth'),
- (DummyClass.classmeth, 'DummyClass.classmeth'),
- (DummyClass.meth, 'DummyClass.meth'),
- (DummyClass().meth, 'DummyClass.meth'),
- (DummyClass, 'DummyClass'),
- (DummyClass(), 'DummyClass')
- ], ids=['function', 'static method', 'class method', 'unbounded method', 'bounded method',
- 'class', 'instance'])
- def test_inputs(self, input, expected):
- assert get_callable_name(input) == expected
-
- def test_bad_input(self):
- pytest.raises(TypeError, get_callable_name, object())
-
-
-class TestObjToRef(object):
- @pytest.mark.parametrize('obj, error', [
- (partial(DummyClass.meth), 'Cannot create a reference to a partial()'),
- (lambda: None, 'Cannot create a reference to a lambda')
- ], ids=['partial', 'lambda'])
- def test_errors(self, obj, error):
- exc = pytest.raises(ValueError, obj_to_ref, obj)
- assert str(exc.value) == error
-
- def test_nested_function_error(self):
- def nested():
- pass
-
- exc = pytest.raises(ValueError, obj_to_ref, nested)
- assert str(exc.value) == 'Cannot create a reference to a nested function'
-
- @pytest.mark.parametrize('input,expected', [
- (DummyClass.meth, 'test_util:DummyClass.meth'),
- (DummyClass.classmeth, 'test_util:DummyClass.classmeth'),
- (DummyClass.InnerDummyClass.innerclassmeth,
- 'test_util:DummyClass.InnerDummyClass.innerclassmeth'),
- (DummyClass.staticmeth, 'test_util:DummyClass.staticmeth'),
- (InheritedDummyClass.classmeth, 'test_util:InheritedDummyClass.classmeth'),
- (timedelta, 'datetime:timedelta'),
- ], ids=['unbound method', 'class method', 'inner class method', 'static method',
- 'inherited class method', 'timedelta'])
- def test_valid_refs(self, input, expected):
- assert obj_to_ref(input) == expected
-
-
-class TestRefToObj(object):
- def test_valid_ref(self):
- from logging.handlers import RotatingFileHandler
- assert ref_to_obj('logging.handlers:RotatingFileHandler') is RotatingFileHandler
-
- def test_complex_path(self):
- pkg1 = ModuleType('pkg1')
- pkg1.pkg2 = 'blah'
- pkg2 = ModuleType('pkg1.pkg2')
- pkg2.varname = 'test'
- sys.modules['pkg1'] = pkg1
- sys.modules['pkg1.pkg2'] = pkg2
- assert ref_to_obj('pkg1.pkg2:varname') == 'test'
-
- @pytest.mark.parametrize('input,error', [
- (object(), TypeError),
- ('module', ValueError),
- ('module:blah', LookupError)
- ], ids=['raw object', 'module', 'module attribute'])
- def test_lookup_error(self, input, error):
- pytest.raises(error, ref_to_obj, input)
-
-
-@pytest.mark.parametrize('input,expected', [
- ('datetime:timedelta', timedelta),
- (timedelta, timedelta)
-], ids=['textref', 'direct'])
-def test_maybe_ref(input, expected):
- assert maybe_ref(input) == expected
-
-
-class TestCheckCallableArgs(object):
- def test_invalid_callable_args(self):
- """
- Tests that attempting to create a job with an invalid number of arguments raises an
- exception.
-
- """
- exc = pytest.raises(ValueError, check_callable_args, lambda x: None, [1, 2], {})
- assert str(exc.value) == (
- 'The list of positional arguments is longer than the target callable can handle '
- '(allowed: 1, given in args: 2)')
-
- def test_invalid_callable_kwargs(self):
- """
- Tests that attempting to schedule a job with unmatched keyword arguments raises an
- exception.
-
- """
- exc = pytest.raises(ValueError, check_callable_args, lambda x: None, [], {'x': 0, 'y': 1})
- assert str(exc.value) == ('The target callable does not accept the following keyword '
- 'arguments: y')
-
- def test_missing_callable_args(self):
- """Tests that attempting to schedule a job with missing arguments raises an exception."""
- exc = pytest.raises(ValueError, check_callable_args, lambda x, y, z: None, [1], {'y': 0})
- assert str(exc.value) == 'The following arguments have not been supplied: z'
-
- def test_default_args(self):
- """Tests that default values for arguments are properly taken into account."""
- exc = pytest.raises(ValueError, check_callable_args, lambda x, y, z=1: None, [1], {})
- assert str(exc.value) == 'The following arguments have not been supplied: y'
-
- def test_conflicting_callable_args(self):
- """
- Tests that attempting to schedule a job where the combination of args and kwargs are in
- conflict raises an exception.
-
- """
- exc = pytest.raises(ValueError, check_callable_args, lambda x, y: None, [1, 2], {'y': 1})
- assert str(exc.value) == 'The following arguments are supplied in both args and kwargs: y'
-
- def test_signature_positional_only(self):
- """Tests that a function where signature() fails is accepted."""
- check_callable_args(object().__setattr__, ('blah', 1), {})
-
- @pytest.mark.skipif(platform.python_implementation() == 'PyPy',
- reason='PyPy does not expose signatures of builtins')
- def test_positional_only_args(self):
- """
- Tests that an attempt to use keyword arguments for positional-only arguments raises an
- exception.
-
- """
- exc = pytest.raises(ValueError, check_callable_args, object.__setattr__, ['blah'],
- {'value': 1})
- assert str(exc.value) == ('The following arguments cannot be given as keyword arguments: '
- 'value')
-
- def test_unfulfilled_kwargs(self):
- """
- Tests that attempting to schedule a job where not all keyword-only arguments are fulfilled
- raises an exception.
-
- """
- func = eval("lambda x, *, y, z=1: None")
- exc = pytest.raises(ValueError, check_callable_args, func, [1], {})
- assert str(exc.value) == ('The following keyword-only arguments have not been supplied in '
- 'kwargs: y')
diff --git a/tests/triggers/test_calendarinterval.py b/tests/triggers/test_calendarinterval.py
index 079d014..96f9b7e 100644
--- a/tests/triggers/test_calendarinterval.py
+++ b/tests/triggers/test_calendarinterval.py
@@ -38,7 +38,7 @@ def test_missing_time(timezone, serializer):
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2016, 3, 28, 2, 30))
+ assert trigger.next() == datetime(2016, 3, 28, 2, 30, tzinfo=timezone)
def test_repeated_time(timezone, serializer):
@@ -52,7 +52,7 @@ def test_repeated_time(timezone, serializer):
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2016, 10, 30, 2, 30), is_dst=True)
+ assert trigger.next() == datetime(2016, 10, 30, 2, 30, tzinfo=timezone, fold=0)
def test_nonexistent_days(timezone, serializer):
@@ -61,8 +61,8 @@ def test_nonexistent_days(timezone, serializer):
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2016, 3, 31))
- assert trigger.next() == timezone.localize(datetime(2016, 5, 31))
+ assert trigger.next() == datetime(2016, 3, 31, tzinfo=timezone)
+ assert trigger.next() == datetime(2016, 5, 31, tzinfo=timezone)
def test_repr(timezone, serializer):
diff --git a/tests/triggers/test_combining.py b/tests/triggers/test_combining.py
index 73a5836..c7c409e 100644
--- a/tests/triggers/test_combining.py
+++ b/tests/triggers/test_combining.py
@@ -10,8 +10,8 @@ from apscheduler.triggers.interval import IntervalTrigger
class TestAndTrigger:
@pytest.mark.parametrize('threshold', [1, 0])
def test_two_datetriggers(self, timezone, serializer, threshold):
- date1 = timezone.localize(datetime(2020, 5, 16, 14, 17, 30, 254212))
- date2 = timezone.localize(datetime(2020, 5, 16, 14, 17, 31, 254212))
+ date1 = datetime(2020, 5, 16, 14, 17, 30, 254212, tzinfo=timezone)
+ date2 = datetime(2020, 5, 16, 14, 17, 31, 254212, tzinfo=timezone)
trigger = AndTrigger([DateTrigger(date1), DateTrigger(date2)], threshold=threshold)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
@@ -23,7 +23,7 @@ class TestAndTrigger:
assert trigger.next() is None
def test_max_iterations(self, timezone, serializer):
- start_time = timezone.localize(datetime(2020, 5, 16, 14, 17, 30, 254212))
+ start_time = datetime(2020, 5, 16, 14, 17, 30, 254212, tzinfo=timezone)
trigger = AndTrigger([
IntervalTrigger(seconds=4, start_time=start_time, timezone=timezone),
IntervalTrigger(seconds=4, start_time=start_time + timedelta(seconds=2),
@@ -35,7 +35,7 @@ class TestAndTrigger:
pytest.raises(MaxIterationsReached, trigger.next)
def test_repr(self, timezone, serializer):
- start_time = timezone.localize(datetime(2020, 5, 16, 14, 17, 30, 254212))
+ start_time = datetime(2020, 5, 16, 14, 17, 30, 254212, tzinfo=timezone)
trigger = AndTrigger([
IntervalTrigger(seconds=4, start_time=start_time, timezone=timezone),
IntervalTrigger(seconds=4, start_time=start_time + timedelta(seconds=2),
@@ -46,15 +46,15 @@ class TestAndTrigger:
assert repr(trigger) == (
"AndTrigger([IntervalTrigger(seconds=4, "
- "start_time='2020-05-16T14:17:30.254212+02:00'), IntervalTrigger(seconds=4, "
- "start_time='2020-05-16T14:17:32.254212+02:00')], threshold=1.0, max_iterations=10000)"
+ "start_time='2020-05-16 14:17:30.254212+02:00'), IntervalTrigger(seconds=4, "
+ "start_time='2020-05-16 14:17:32.254212+02:00')], threshold=1.0, max_iterations=10000)"
)
class TestOrTrigger:
def test_two_datetriggers(self, timezone, serializer):
- date1 = timezone.localize(datetime(2020, 5, 16, 14, 17, 30, 254212))
- date2 = timezone.localize(datetime(2020, 5, 18, 15, 1, 53, 940564))
+ date1 = datetime(2020, 5, 16, 14, 17, 30, 254212, tzinfo=timezone)
+ date2 = datetime(2020, 5, 18, 15, 1, 53, 940564, tzinfo=timezone)
trigger = OrTrigger([DateTrigger(date1), DateTrigger(date2)])
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
@@ -64,7 +64,7 @@ class TestOrTrigger:
assert trigger.next() is None
def test_two_interval_triggers(self, timezone, serializer):
- start_time = timezone.localize(datetime(2020, 5, 16, 14, 17, 30, 254212))
+ start_time = datetime(2020, 5, 16, 14, 17, 30, 254212, tzinfo=timezone)
end_time1 = start_time + timedelta(seconds=16)
end_time2 = start_time + timedelta(seconds=18)
trigger = OrTrigger([
@@ -86,8 +86,8 @@ class TestOrTrigger:
assert trigger.next() is None
def test_repr(self, timezone):
- date1 = timezone.localize(datetime(2020, 5, 16, 14, 17, 30, 254212))
- date2 = timezone.localize(datetime(2020, 5, 18, 15, 1, 53, 940564))
+ date1 = datetime(2020, 5, 16, 14, 17, 30, 254212, tzinfo=timezone)
+ date2 = datetime(2020, 5, 18, 15, 1, 53, 940564, tzinfo=timezone)
trigger = OrTrigger([DateTrigger(date1), DateTrigger(date2)])
- assert repr(trigger) == ("OrTrigger([DateTrigger('2020-05-16T14:17:30.254212+02:00'), "
- "DateTrigger('2020-05-18T15:01:53.940564+02:00')])")
+ assert repr(trigger) == ("OrTrigger([DateTrigger('2020-05-16 14:17:30.254212+02:00'), "
+ "DateTrigger('2020-05-18 15:01:53.940564+02:00')])")
diff --git a/tests/triggers/test_cron.py b/tests/triggers/test_cron.py
index 8f26aa3..f79879b 100644
--- a/tests/triggers/test_cron.py
+++ b/tests/triggers/test_cron.py
@@ -1,9 +1,14 @@
+import sys
from datetime import datetime
import pytest
-import pytz
from apscheduler.triggers.cron import CronTrigger
+if sys.version_info >= (3, 9):
+ from zoneinfo import ZoneInfo
+else:
+ from backports.zoneinfo import ZoneInfo
+
def test_invalid_expression():
exc = pytest.raises(ValueError, CronTrigger, year='2009-fault')
@@ -52,61 +57,61 @@ def test_invalid_ranges(values, expected):
def test_cron_trigger_1(timezone, serializer):
- start_time = timezone.localize(datetime(2008, 12, 1))
+ start_time = datetime(2008, 12, 1, tzinfo=timezone)
trigger = CronTrigger(year='2009/2', month='1-4/3', day='5-6', start_time=start_time,
timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2009, 1, 5))
- assert trigger.next() == timezone.localize(datetime(2009, 1, 6))
- assert trigger.next() == timezone.localize(datetime(2009, 4, 5))
- assert trigger.next() == timezone.localize(datetime(2009, 4, 6))
- assert trigger.next() == timezone.localize(datetime(2011, 1, 5))
+ assert trigger.next() == datetime(2009, 1, 5, tzinfo=timezone)
+ assert trigger.next() == datetime(2009, 1, 6, tzinfo=timezone)
+ assert trigger.next() == datetime(2009, 4, 5, tzinfo=timezone)
+ assert trigger.next() == datetime(2009, 4, 6, tzinfo=timezone)
+ assert trigger.next() == datetime(2011, 1, 5, tzinfo=timezone)
assert repr(trigger) == ("CronTrigger(year='2009/2', month='1-4/3', day='5-6', week='*', "
"day_of_week='*', hour='0', minute='0', second='0', "
"start_time='2008-12-01T00:00:00+01:00', timezone='Europe/Berlin')")
def test_cron_trigger_2(timezone, serializer):
- start_time = timezone.localize(datetime(2009, 10, 14))
+ start_time = datetime(2009, 10, 14, tzinfo=timezone)
trigger = CronTrigger(year='2009/2', month='1-3', day='5', start_time=start_time,
timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2011, 1, 5))
- assert trigger.next() == timezone.localize(datetime(2011, 2, 5))
- assert trigger.next() == timezone.localize(datetime(2011, 3, 5))
- assert trigger.next() == timezone.localize(datetime(2013, 1, 5))
+ assert trigger.next() == datetime(2011, 1, 5, tzinfo=timezone)
+ assert trigger.next() == datetime(2011, 2, 5, tzinfo=timezone)
+ assert trigger.next() == datetime(2011, 3, 5, tzinfo=timezone)
+ assert trigger.next() == datetime(2013, 1, 5, tzinfo=timezone)
assert repr(trigger) == ("CronTrigger(year='2009/2', month='1-3', day='5', week='*', "
"day_of_week='*', hour='0', minute='0', second='0', "
"start_time='2009-10-14T00:00:00+02:00', timezone='Europe/Berlin')")
def test_cron_trigger_3(timezone, serializer):
- start_time = timezone.localize(datetime(2009, 1, 1))
+ start_time = datetime(2009, 1, 1, tzinfo=timezone)
trigger = CronTrigger(year='2009', month='feb-dec', hour='8-9', start_time=start_time,
timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2009, 2, 1, 8))
- assert trigger.next() == timezone.localize(datetime(2009, 2, 1, 9))
- assert trigger.next() == timezone.localize(datetime(2009, 2, 2, 8))
+ assert trigger.next() == datetime(2009, 2, 1, 8, tzinfo=timezone)
+ assert trigger.next() == datetime(2009, 2, 1, 9, tzinfo=timezone)
+ assert trigger.next() == datetime(2009, 2, 2, 8, tzinfo=timezone)
assert repr(trigger) == ("CronTrigger(year='2009', month='feb-dec', day='*', week='*', "
"day_of_week='*', hour='8-9', minute='0', second='0', "
"start_time='2009-01-01T00:00:00+01:00', timezone='Europe/Berlin')")
def test_cron_trigger_4(timezone, serializer):
- start_time = timezone.localize(datetime(2012, 2, 1))
+ start_time = datetime(2012, 2, 1, tzinfo=timezone)
trigger = CronTrigger(year='2012', month='2', day='last', start_time=start_time,
timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2012, 2, 29))
+ assert trigger.next() == datetime(2012, 2, 29, tzinfo=timezone)
assert repr(trigger) == ("CronTrigger(year='2012', month='2', day='last', week='*', "
"day_of_week='*', hour='0', minute='0', second='0', "
"start_time='2012-02-01T00:00:00+01:00', timezone='Europe/Berlin')")
@@ -114,28 +119,28 @@ def test_cron_trigger_4(timezone, serializer):
@pytest.mark.parametrize('expr', ['3-5', 'wed-fri'], ids=['numeric', 'text'])
def test_weekday_overlap(timezone, serializer, expr):
- start_time = timezone.localize(datetime(2009, 1, 1))
+ start_time = datetime(2009, 1, 1, tzinfo=timezone)
trigger = CronTrigger(year=2009, month=1, day='6-10', day_of_week=expr, start_time=start_time,
timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2009, 1, 7))
+ assert trigger.next() == datetime(2009, 1, 7, tzinfo=timezone)
assert repr(trigger) == ("CronTrigger(year='2009', month='1', day='6-10', week='*', "
"day_of_week='wed-fri', hour='0', minute='0', second='0', "
"start_time='2009-01-01T00:00:00+01:00', timezone='Europe/Berlin')")
def test_weekday_range(timezone, serializer):
- start_time = timezone.localize(datetime(2020, 1, 1))
+ start_time = datetime(2020, 1, 1, tzinfo=timezone)
trigger = CronTrigger(year=2020, month=1, week=1, day_of_week='fri-sun', start_time=start_time,
timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2020, 1, 3))
- assert trigger.next() == timezone.localize(datetime(2020, 1, 4))
- assert trigger.next() == timezone.localize(datetime(2020, 1, 5))
+ assert trigger.next() == datetime(2020, 1, 3, tzinfo=timezone)
+ assert trigger.next() == datetime(2020, 1, 4, tzinfo=timezone)
+ assert trigger.next() == datetime(2020, 1, 5, tzinfo=timezone)
assert trigger.next() is None
assert repr(trigger) == ("CronTrigger(year='2020', month='1', day='*', week='1', "
"day_of_week='fri-sun', hour='0', minute='0', second='0', "
@@ -143,14 +148,14 @@ def test_weekday_range(timezone, serializer):
def test_last_weekday(timezone, serializer):
- start_time = timezone.localize(datetime(2020, 1, 1))
+ start_time = datetime(2020, 1, 1, tzinfo=timezone)
trigger = CronTrigger(year=2020, day='last sun', start_time=start_time, timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2020, 1, 26))
- assert trigger.next() == timezone.localize(datetime(2020, 2, 23))
- assert trigger.next() == timezone.localize(datetime(2020, 3, 29))
+ assert trigger.next() == datetime(2020, 1, 26, tzinfo=timezone)
+ assert trigger.next() == datetime(2020, 2, 23, tzinfo=timezone)
+ assert trigger.next() == datetime(2020, 3, 29, tzinfo=timezone)
assert repr(trigger) == ("CronTrigger(year='2020', month='*', day='last sun', week='*', "
"day_of_week='*', hour='0', minute='0', second='0', "
"start_time='2020-01-01T00:00:00+01:00', timezone='Europe/Berlin')")
@@ -162,30 +167,30 @@ def test_increment_weekday(timezone, serializer):
date won't cause problems.
"""
- start_time = timezone.localize(datetime(2009, 9, 25, 7))
+ start_time = datetime(2009, 9, 25, 7, tzinfo=timezone)
trigger = CronTrigger(hour='5-6', start_time=start_time, timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2009, 9, 26, 5))
+ assert trigger.next() == datetime(2009, 9, 26, 5, tzinfo=timezone)
assert repr(trigger) == ("CronTrigger(year='*', month='*', day='*', week='*', "
"day_of_week='*', hour='5-6', minute='0', second='0', "
"start_time='2009-09-25T07:00:00+02:00', timezone='Europe/Berlin')")
def test_month_rollover(timezone, serializer):
- start_time = timezone.localize(datetime(2016, 2, 1))
+ start_time = datetime(2016, 2, 1, tzinfo=timezone)
trigger = CronTrigger(day=30, start_time=start_time, timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2016, 3, 30))
- assert trigger.next() == timezone.localize(datetime(2016, 4, 30))
+ assert trigger.next() == datetime(2016, 3, 30, tzinfo=timezone)
+ assert trigger.next() == datetime(2016, 4, 30, tzinfo=timezone)
@pytest.mark.parametrize('weekday', ['1,0', 'mon,sun'], ids=['numeric', 'text'])
def test_weekday_nomatch(timezone, serializer, weekday):
- start_time = timezone.localize(datetime(2009, 1, 1))
+ start_time = datetime(2009, 1, 1, tzinfo=timezone)
trigger = CronTrigger(year=2009, month=1, day='6-10', day_of_week=weekday,
start_time=start_time, timezone=timezone)
if serializer:
@@ -198,13 +203,13 @@ def test_weekday_nomatch(timezone, serializer, weekday):
def test_weekday_positional(timezone, serializer):
- start_time = timezone.localize(datetime(2009, 1, 1))
+ start_time = datetime(2009, 1, 1, tzinfo=timezone)
trigger = CronTrigger(year=2009, month=1, day='4th wed', start_time=start_time,
timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2009, 1, 28))
+ assert trigger.next() == datetime(2009, 1, 28, tzinfo=timezone)
assert repr(trigger) == ("CronTrigger(year='2009', month='1', day='4th wed', week='*', "
"day_of_week='*', hour='0', minute='0', second='0', "
"start_time='2009-01-01T00:00:00+01:00', timezone='Europe/Berlin')")
@@ -212,13 +217,13 @@ def test_weekday_positional(timezone, serializer):
def test_end_time(timezone, serializer):
"""Test that next() won't produce"""
- start_time = timezone.localize(datetime(2014, 4, 13, 2))
- end_time = timezone.localize(datetime(2014, 4, 13, 4))
+ start_time = datetime(2014, 4, 13, 2, tzinfo=timezone)
+ end_time = datetime(2014, 4, 13, 4, tzinfo=timezone)
trigger = CronTrigger(hour=4, start_time=start_time, end_time=end_time, timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2014, 4, 13, 4))
+ assert trigger.next() == datetime(2014, 4, 13, 4, tzinfo=timezone)
assert trigger.next() is None
assert repr(trigger) == ("CronTrigger(year='*', month='*', day='*', week='*', "
"day_of_week='*', hour='4', minute='0', second='0', "
@@ -227,13 +232,13 @@ def test_end_time(timezone, serializer):
def test_week_1(timezone, serializer):
- start_time = timezone.localize(datetime(2009, 1, 1))
+ start_time = datetime(2009, 1, 1, tzinfo=timezone)
trigger = CronTrigger(year=2009, month=2, week=8, start_time=start_time, timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
for day in range(16, 23):
- assert trigger.next() == timezone.localize(datetime(2009, 2, day))
+ assert trigger.next() == datetime(2009, 2, day, tzinfo=timezone)
assert trigger.next() is None
assert repr(trigger) == ("CronTrigger(year='2009', month='2', day='*', week='8', "
@@ -243,43 +248,48 @@ def test_week_1(timezone, serializer):
@pytest.mark.parametrize('weekday', [3, 'wed'], ids=['numeric', 'text'])
def test_week_2(timezone, serializer, weekday):
- start_time = timezone.localize(datetime(2009, 1, 1))
+ start_time = datetime(2009, 1, 1, tzinfo=timezone)
trigger = CronTrigger(year=2009, week=15, day_of_week=weekday, start_time=start_time,
timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(datetime(2009, 4, 8))
+ assert trigger.next() == datetime(2009, 4, 8, tzinfo=timezone)
assert trigger.next() is None
assert repr(trigger) == ("CronTrigger(year='2009', month='*', day='*', week='15', "
"day_of_week='wed', hour='0', minute='0', second='0', "
"start_time='2009-01-01T00:00:00+01:00', timezone='Europe/Berlin')")
-@pytest.mark.parametrize('trigger_args, start_time, start_time_dst, correct_next_date', [
- ({'hour': 8}, datetime(2013, 3, 9, 12), False, datetime(2013, 3, 10, 8)),
- ({'hour': 8}, datetime(2013, 11, 2, 12), True, datetime(2013, 11, 3, 8)),
- ({'minute': '*/30'}, datetime(2013, 3, 10, 1, 35), False, datetime(2013, 3, 10, 3)),
- ({'minute': '*/30'}, datetime(2013, 11, 3, 1, 35), True, datetime(2013, 11, 3, 1))
-], ids=['absolute_spring', 'absolute_autumn', 'interval_spring', 'interval_autumn'])
-def test_dst_change(trigger_args, start_time, start_time_dst, correct_next_date, serializer):
+@pytest.mark.parametrize('trigger_args, start_time, start_time_fold, correct_next_date,'
+ 'correct_next_date_fold', [
+ ({'hour': 8}, datetime(2013, 3, 9, 12), 0, datetime(2013, 3, 10, 8), 0),
+ ({'hour': 8}, datetime(2013, 11, 2, 12), 0, datetime(2013, 11, 3, 8), 0),
+ ({'minute': '*/30'}, datetime(2013, 3, 10, 1, 35),
+ 0, datetime(2013, 3, 10, 3), 0),
+ ({'minute': '*/30'}, datetime(2013, 11, 3, 1, 35),
+ 0, datetime(2013, 11, 3, 1), 1)
+ ], ids=['absolute_spring', 'absolute_autumn', 'interval_spring', 'interval_autumn'])
+def test_dst_change(trigger_args, start_time, start_time_fold, correct_next_date,
+ correct_next_date_fold, serializer):
"""
Making sure that CronTrigger works correctly when crossing the DST switch threshold.
Note that you should explicitly compare datetimes as strings to avoid the internal datetime
comparison which would test for equality in the UTC timezone.
"""
- timezone = pytz.timezone('US/Eastern')
- start_time = timezone.localize(start_time, is_dst=start_time_dst)
+ timezone = ZoneInfo('US/Eastern')
+ start_time = start_time.replace(tzinfo=timezone, fold=start_time_fold)
trigger = CronTrigger(timezone=timezone, start_time=start_time, **trigger_args)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
- assert trigger.next() == timezone.localize(correct_next_date, is_dst=not start_time_dst)
+ assert trigger.next() == correct_next_date.replace(tzinfo=timezone,
+ fold=correct_next_date_fold)
def test_zero_value(timezone):
- start_time = timezone.localize(datetime(2020, 1, 1))
+ start_time = datetime(2020, 1, 1, tzinfo=timezone)
trigger = CronTrigger(year=2009, month=2, hour=0, start_time=start_time, timezone=timezone)
assert repr(trigger) == ("CronTrigger(year='2009', month='2', day='*', week='*', "
"day_of_week='*', hour='0', minute='0', second='0', "
@@ -287,12 +297,12 @@ def test_zero_value(timezone):
def test_year_list(timezone, serializer):
- start_time = timezone.localize(datetime(2009, 1, 1))
+ start_time = datetime(2009, 1, 1, tzinfo=timezone)
trigger = CronTrigger(year='2009,2008', start_time=start_time, timezone=timezone)
assert repr(trigger) == "CronTrigger(year='2009,2008', month='1', day='1', week='*', " \
"day_of_week='*', hour='0', minute='0', second='0', " \
"start_time='2009-01-01T00:00:00+01:00', timezone='Europe/Berlin')"
- assert trigger.next() == timezone.localize(datetime(2009, 1, 1))
+ assert trigger.next() == datetime(2009, 1, 1, tzinfo=timezone)
assert trigger.next() is None
@@ -328,7 +338,7 @@ def test_year_list(timezone, serializer):
'saturday_first', 'weekend'])
def test_from_crontab(expr, expected_repr, timezone, serializer):
trigger = CronTrigger.from_crontab(expr, timezone)
- trigger.start_time = timezone.localize(datetime(2020, 5, 19, 19, 53, 22))
+ trigger.start_time = datetime(2020, 5, 19, 19, 53, 22, tzinfo=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
diff --git a/tests/triggers/test_date.py b/tests/triggers/test_date.py
index 5f4c607..6147c1c 100644
--- a/tests/triggers/test_date.py
+++ b/tests/triggers/test_date.py
@@ -4,7 +4,7 @@ from apscheduler.triggers.date import DateTrigger
def test_run_time(timezone, serializer):
- run_time = timezone.localize(datetime(2020, 5, 14, 11, 56, 12))
+ run_time = datetime(2020, 5, 14, 11, 56, 12, tzinfo=timezone)
trigger = DateTrigger(run_time)
if serializer:
payload = serializer.serialize(trigger)
@@ -12,4 +12,4 @@ def test_run_time(timezone, serializer):
assert trigger.next() == run_time
assert trigger.next() is None
- assert repr(trigger) == "DateTrigger('2020-05-14T11:56:12+02:00')"
+ assert repr(trigger) == "DateTrigger('2020-05-14 11:56:12+02:00')"
diff --git a/tests/triggers/test_interval.py b/tests/triggers/test_interval.py
index 6761777..292659f 100644
--- a/tests/triggers/test_interval.py
+++ b/tests/triggers/test_interval.py
@@ -10,16 +10,16 @@ def test_bad_interval():
def test_bad_end_time(timezone):
- start_time = timezone.localize(datetime(2020, 5, 16))
- end_time = timezone.localize(datetime(2020, 5, 15))
+ start_time = datetime(2020, 5, 16, tzinfo=timezone)
+ end_time = datetime(2020, 5, 15, tzinfo=timezone)
exc = pytest.raises(ValueError, IntervalTrigger, seconds=1, start_time=start_time,
end_time=end_time)
exc.match('end_time cannot be earlier than start_time')
def test_end_time(timezone, serializer):
- start_time = timezone.localize(datetime(2020, 5, 16, 19, 32, 44, 649521))
- end_time = timezone.localize(datetime(2020, 5, 16, 22, 33, 1))
+ start_time = datetime(2020, 5, 16, 19, 32, 44, 649521, tzinfo=timezone)
+ end_time = datetime(2020, 5, 16, 22, 33, 1, tzinfo=timezone)
interval = timedelta(hours=1, seconds=6)
trigger = IntervalTrigger(start_time=start_time, end_time=end_time, hours=1, seconds=6)
if serializer:
@@ -32,13 +32,13 @@ def test_end_time(timezone, serializer):
def test_repr(timezone, serializer):
- start_time = timezone.localize(datetime(2020, 5, 15, 12, 55, 32, 954032))
- end_time = timezone.localize(datetime(2020, 6, 4, 16, 18, 49, 306942))
+ start_time = datetime(2020, 5, 15, 12, 55, 32, 954032, tzinfo=timezone)
+ end_time = datetime(2020, 6, 4, 16, 18, 49, 306942, tzinfo=timezone)
trigger = IntervalTrigger(weeks=1, days=2, hours=3, minutes=4, seconds=5, microseconds=123525,
start_time=start_time, end_time=end_time, timezone=timezone)
if serializer:
trigger = serializer.deserialize(serializer.serialize(trigger))
assert repr(trigger) == ("IntervalTrigger(weeks=1, days=2, hours=3, minutes=4, seconds=5, "
- "microseconds=123525, start_time='2020-05-15T12:55:32.954032+02:00', "
- "end_time='2020-06-04T16:18:49.306942+02:00')")
+ "microseconds=123525, start_time='2020-05-15 12:55:32.954032+02:00', "
+ "end_time='2020-06-04 16:18:49.306942+02:00')")