diff options
| author | 2021-02-03 19:17:50 -0500 | |
|---|---|---|
| committer | 2021-02-03 19:17:50 -0500 | |
| commit | 475d074fd74425efbe783fad08f97f2df0c4909f (patch) | |
| tree | 2acdae53999b3c74b716efa4edb5b40311fa356a /tests/test_scheduling.py | |
| parent | cd502d52787f666fff3254d7d7e7578930c813c2 (diff) | |
| parent | 3a0d66f07b112b6d2bdc2b57bbf717a89a351ce6 (diff) | |
Update upstream source from tag 'upstream/8.1.2'
Update to upstream version '8.1.2'
with Debian dir e5e966a9e6010ef70618dc9a61558fa4db35aceb
Diffstat (limited to 'tests/test_scheduling.py')
| -rw-r--r-- | tests/test_scheduling.py | 255 |
1 files changed, 130 insertions, 125 deletions
diff --git a/tests/test_scheduling.py b/tests/test_scheduling.py index fddb4ff..af89afa 100644 --- a/tests/test_scheduling.py +++ b/tests/test_scheduling.py @@ -1,132 +1,137 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals, absolute_import +""" +Scheduling tests. + +These tests rely on a fixed time to work. +In order to achieve this the fixture for `now` sets the expected time. +""" import datetime -import locale -import os -import sys import dateutil.parser import dateutil.tz import pytest -from .base import BaseTestCase - -try: - from freezegun import freeze_time - _freeze_time = True -except ImportError: - _freeze_time = False - freeze_time = lambda x: lambda y: y - -_NOW = datetime.datetime( # Thursday - 2013, 8, 22, 10, 0, 0, tzinfo=dateutil.tz.tzutc()) - - -@pytest.mark.skipif(not _freeze_time, reason="freezegun not installed.") -class TestScheduling(BaseTestCase): - - @classmethod - def setUp(cls): - d = [name for name in sys.modules if name.startswith("six.moves.")] - cls.deleted = {} - for name in d: - cls.deleted[name] = sys.modules[name] - del sys.modules[name] - - @classmethod - def tearDown(cls): - for name, mod in cls.deleted.items(): - sys.modules[name] = mod - - @freeze_time(_NOW) - def test_get_date(self): - from nikola.plugins.command.new_post import get_date - - FMT = '%Y-%m-%d %H:%M:%S %Z' - NOW = _NOW.strftime(FMT) - TODAY = dateutil.parser.parse(NOW) - RULE_TH = 'RRULE:FREQ=WEEKLY;BYDAY=TH' - RULE_FR = 'RRULE:FREQ=WEEKLY;BYDAY=FR' - UTC = dateutil.tz.tzutc() - - # NOW does not match rule ######################################### - # No last date - expected = TODAY.replace(day=23).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_FR, tz=UTC)) - self.assertEqual(expected, get_date(True, RULE_FR, tz=UTC)) - - # Last date in the past; doesn't match rule - date = TODAY.replace(hour=7) - expected = TODAY.replace(day=23, hour=7).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_FR, date, tz=UTC)) - - # Last date in the future; doesn't match rule - date = TODAY.replace(day=24, hour=7) - expected = TODAY.replace(day=30, hour=7).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_FR, date, tz=UTC)) - - # Last date in the past; matches rule - date = TODAY.replace(day=16, hour=8) - expected = TODAY.replace(day=23, hour=8).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_FR, date, tz=UTC)) - - # Last date in the future; matches rule - date = TODAY.replace(day=23, hour=18) - expected = TODAY.replace(day=30, hour=18).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_FR, date, tz=UTC)) - - # NOW matches rule ################################################ - # Not scheduling should return NOW - self.assertEqual(NOW, get_date(False, RULE_TH, tz=UTC)) - # No last date - self.assertEqual(NOW, get_date(True, RULE_TH, tz=UTC)) - self.assertEqual(NOW, get_date(True, RULE_TH, tz=UTC)) - - # Last date in the past; doesn't match rule - # Corresponding time has already passed, today - date = TODAY.replace(day=21, hour=7) - expected = TODAY.replace(day=29, hour=7).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_TH, date, tz=UTC)) - # Corresponding time has not passed today - date = TODAY.replace(day=21, hour=18) - expected = TODAY.replace(day=22, hour=18).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_TH, date, tz=UTC)) - - # Last date in the future; doesn't match rule - # Corresponding time has already passed, today - date = TODAY.replace(day=24, hour=7) - expected = TODAY.replace(day=29, hour=7).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_TH, date, tz=UTC)) - # Corresponding time has not passed today - date = TODAY.replace(day=24, hour=18) - expected = TODAY.replace(day=29, hour=18).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_TH, date, tz=UTC)) - - # Last date in the past; matches rule - # Corresponding time has already passed, today - date = TODAY.replace(day=15, hour=7) - expected = TODAY.replace(day=29, hour=7).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_TH, date, tz=UTC)) - # Corresponding time has already passed, today; rule specifies HOUR - date = TODAY.replace(day=15, hour=7) - expected = TODAY.replace(day=29, hour=9).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_TH + ';BYHOUR=9', date, tz=UTC)) - # Corresponding time has not passed today - date = TODAY.replace(day=15, hour=18) - expected = TODAY.replace(day=22, hour=18).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_TH, date, tz=UTC)) - - # Last date in the future; matches rule - # Corresponding time has already passed, today - date = TODAY.replace(day=29, hour=7) - expected = TODAY.replace(day=5, month=9, hour=7).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_TH, date, tz=UTC)) - # Corresponding time has not passed today - date = TODAY.replace(day=22, hour=18) - expected = TODAY.replace(day=29, hour=18).strftime(FMT) - self.assertEqual(expected, get_date(True, RULE_TH, date, tz=UTC)) - -if __name__ == '__main__': - import unittest - unittest.main() +from nikola.plugins.command.new_post import get_date + +freezegun = pytest.importorskip("freezegun") +freeze_time = freezegun.freeze_time + +UTC = dateutil.tz.tzutc() +RULE_THURSDAYS = "RRULE:FREQ=WEEKLY;BYDAY=TH" +RULE_FRIDAYS = "RRULE:FREQ=WEEKLY;BYDAY=FR" + + +def test_current_time_not_matching_rule(today): + """`today` does not match rule.""" + # No last date + expected = today.replace(day=23) + assert expected == get_date(True, RULE_FRIDAYS, tz=UTC)[1] + assert expected == get_date(True, RULE_FRIDAYS, tz=UTC)[1] + + # Last date in the past; doesn't match rule + date = today.replace(hour=7) + expected = today.replace(day=23, hour=7) + assert expected == get_date(True, RULE_FRIDAYS, date, tz=UTC)[1] + + # Last date in the future; doesn't match rule + date = today.replace(day=24, hour=7) + expected = today.replace(day=30, hour=7) + assert expected == get_date(True, RULE_FRIDAYS, date, tz=UTC)[1] + + +def test_current_time_matching_rule(today): + # Last date in the past; matches rule + date = today.replace(day=16, hour=8) + expected = today.replace(day=23, hour=8) + assert expected == get_date(True, RULE_FRIDAYS, date, tz=UTC)[1] + + # Last date in the future; matches rule + date = today.replace(day=23, hour=18) + expected = today.replace(day=30, hour=18) + assert expected == get_date(True, RULE_FRIDAYS, date, tz=UTC)[1] + + +@pytest.mark.parametrize("scheduling", [True, False]) +def test_current_time_matching_rule_no_given_date(now, scheduling): + """ + No last date given means we should always get the current time. + + `now` matches the rule. + """ + assert now == get_date(scheduling, RULE_THURSDAYS, tz=UTC)[1] + + +def test_last_date_in_the_past_not_matching_rule(today): + """Last date in the past; doesn't match rule.""" + # Corresponding time has already passed, today + date = today.replace(day=21, hour=7) + expected = today.replace(day=29, hour=7) + assert expected == get_date(True, RULE_THURSDAYS, date, tz=UTC)[1] + + # Corresponding time has not passed today + date = today.replace(day=21, hour=18) + expected = today.replace(day=22, hour=18) + assert expected == get_date(True, RULE_THURSDAYS, date, tz=UTC)[1] + + +def test_last_date_in_the_future_not_matching_rule(today): + """Last date in the future; doesn't match rule.""" + # Corresponding time has already passed, today + date = today.replace(day=24, hour=7) + expected = today.replace(day=29, hour=7) + assert expected == get_date(True, RULE_THURSDAYS, date, tz=UTC)[1] + + # Corresponding time has not passed today + date = today.replace(day=24, hour=18) + expected = today.replace(day=29, hour=18) + assert expected == get_date(True, RULE_THURSDAYS, date, tz=UTC)[1] + + +def test_last_date_in_the_past_matching_rule(today): + """Last date in the past; matches rule.""" + # Corresponding time has already passed, today + date = today.replace(day=15, hour=7) + expected = today.replace(day=29, hour=7) + assert expected == get_date(True, RULE_THURSDAYS, date, tz=UTC)[1] + + # Corresponding time has already passed, today; rule specifies HOUR + date = today.replace(day=15, hour=7) + expected = today.replace(day=29, hour=9) + assert expected == get_date(True, RULE_THURSDAYS + ";BYHOUR=9", date, tz=UTC)[1] + + # Corresponding time has not passed today + date = today.replace(day=15, hour=18) + expected = today.replace(day=22, hour=18) + assert expected == get_date(True, RULE_THURSDAYS, date, tz=UTC)[1] + + +def test_last_date_in_the_future_matching_rule(today): + """Last date in the future; matches rule.""" + # Corresponding time has already passed, today + date = today.replace(day=29, hour=7) + expected = today.replace(day=5, month=9, hour=7) + assert expected == get_date(True, RULE_THURSDAYS, date, tz=UTC)[1] + + # Corresponding time has not passed today + date = today.replace(day=22, hour=18) + expected = today.replace(day=29, hour=18) + assert expected == get_date(True, RULE_THURSDAYS, date, tz=UTC)[1] + + +@pytest.fixture +def today(now): + current_time = now.strftime("%Y-%m-%d %H:%M:%S %Z") + yield dateutil.parser.parse(current_time) + + +@pytest.fixture +def now() -> datetime: + """ + Get the current time. + + datetime is frozen to this point in time. + """ + _NOW = datetime.datetime(2013, 8, 22, 10, 0, 0, tzinfo=UTC) # Thursday + + with freeze_time(_NOW): + yield _NOW |
