diff --git a/src/reader/_update.py b/src/reader/_update.py index 2ecdb838..aede7b35 100644 --- a/src/reader/_update.py +++ b/src/reader/_update.py @@ -325,6 +325,7 @@ def set_number(name, src, dst, type, min=0, max=float('inf')): # type: ignore def next_update_after(now: datetime, interval: int, jitter: float = 0) -> datetime: now_s = (now.replace(tzinfo=None) - UPDATE_AFTER_START).total_seconds() rv_s = int((now_s // interval + 1 + random.random() * jitter) * interval) + rv_s = rv_s // 60 * 60 rv = datetime.utcfromtimestamp(rv_s + EPOCH_OFFSET).replace(tzinfo=now.tzinfo) return rv diff --git a/tests/test_reader.py b/tests/test_reader.py index c0bf6b01..e618efef 100644 --- a/tests/test_reader.py +++ b/tests/test_reader.py @@ -999,22 +999,14 @@ def test_update_after_invalid_config(reader, config, config_is_global): (datetime(2010, 1, 2), 3600 * 24 * 3, 0, 0, datetime(2010, 1, 5)), (datetime(2010, 1, 4, 23), 3600 * 24 * 3, 0, 0, datetime(2010, 1, 5)), (datetime(2010, 1, 5), 3600 * 24 * 3, 0, 0, datetime(2010, 1, 8)), - # an arbitrary interval; acknowledging the start date is 1970-01-05 - (datetime(1970, 1, 5), 1234, 0, 0, datetime(1970, 1, 5, 0, 20, 34)), - (datetime(1970, 1, 5, 0, 20, 33), 1234, 0, 0, datetime(1970, 1, 5, 0, 20, 34)), - (datetime(1970, 1, 5, 0, 20, 34), 1234, 0, 0, datetime(1970, 1, 5, 0, 41, 8)), - # >>> (datetime(1970, 1, 5) - datetime(2010, 1, 1)) % timedelta(seconds=1234) - # datetime.timedelta(seconds=338) - (datetime(2010, 1, 1), 1234, 0, 0, datetime(2010, 1, 1, 0, 5, 38)), # jitter (datetime(2010, 1, 1), 3600 * 8, 1, 0, datetime(2010, 1, 1, 8)), (datetime(2010, 1, 1), 3600 * 8, 1, 0.5, datetime(2010, 1, 1, 12)), (datetime(2010, 1, 1), 3600 * 8, 1, 1, datetime(2010, 1, 1, 16)), (datetime(2010, 1, 1), 3600 * 8, 0.5, 0.5, datetime(2010, 1, 1, 10)), (datetime(2010, 1, 1), 3600 * 8, 0.5, 0.1, datetime(2010, 1, 1, 8, 24)), - (datetime(2010, 1, 1), 3600 * 8, 0.5, 0.12, datetime(2010, 1, 1, 8, 28, 48)), - (datetime(2010, 1, 1), 3600 * 8, 0.5, 0.123, datetime(2010, 1, 1, 8, 29, 31)), - # FIXME: round to whole minutes + (datetime(2010, 1, 1), 3600 * 8, 0.5, 0.12, datetime(2010, 1, 1, 8, 28)), + (datetime(2010, 1, 1), 3600 * 8, 0.5, 0.123, datetime(2010, 1, 1, 8, 29)), ], ) def test_next_update_after(monkeypatch, now, interval, jitter, random, expected):