This commit is contained in:
@@ -2,36 +2,28 @@ import pytest
|
|||||||
from slic.utils.run_later import run_at, run_in, run_later
|
from slic.utils.run_later import run_at, run_in, run_later
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
# Dummy progress bar replacement to avoid actual tqdm usage
|
|
||||||
class DummyBar:
|
class DummyBar:
|
||||||
def __enter__(self): return self
|
def __enter__(self): return self
|
||||||
def __exit__(self, *a): pass
|
def __exit__(self, *a): pass
|
||||||
def set(self, val): pass
|
def set(self, val): pass
|
||||||
|
|
||||||
|
|
||||||
# Helper class to simulate and manipulate time for testing
|
class FakeDatetime(datetime):
|
||||||
class FakeDatetime:
|
"""Subclass datetime to override now()."""
|
||||||
def __init__(self, start_time):
|
_now = None
|
||||||
self.t = start_time
|
|
||||||
def now(self):
|
|
||||||
return self.t
|
|
||||||
def advance(self, seconds):
|
|
||||||
self.t += timedelta(seconds=seconds)
|
|
||||||
def __getattr__(self, attr):
|
|
||||||
return getattr(datetime, attr)
|
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def set_now(cls, value):
|
||||||
|
cls._now = value
|
||||||
|
|
||||||
# Wrapper to monkeypatch the whole datetime module with a fake .now()
|
@classmethod
|
||||||
class FakeDateTimeModule:
|
def now(cls, tz=None):
|
||||||
def __init__(self, fake_dt):
|
return cls._now
|
||||||
self.fake_dt = fake_dt
|
|
||||||
self.datetime = datetime
|
|
||||||
|
|
||||||
def now(self):
|
@classmethod
|
||||||
return self.fake_dt.now()
|
def advance(cls, seconds):
|
||||||
|
cls._now += timedelta(seconds=seconds)
|
||||||
def __getattr__(self, attr):
|
|
||||||
return getattr(datetime, attr)
|
|
||||||
|
|
||||||
|
|
||||||
def test_run_at(monkeypatch):
|
def test_run_at(monkeypatch):
|
||||||
@@ -41,18 +33,18 @@ def test_run_at(monkeypatch):
|
|||||||
triggered.append(label)
|
triggered.append(label)
|
||||||
|
|
||||||
base = datetime(2025, 1, 1, 12, 0, 0)
|
base = datetime(2025, 1, 1, 12, 0, 0)
|
||||||
fake_dt = FakeDatetime(base)
|
FakeDatetime.set_now(base)
|
||||||
|
|
||||||
monkeypatch.setattr("slic.utils.run_later.datetime", FakeDateTimeModule(fake_dt))
|
monkeypatch.setattr("slic.utils.run_later.datetime", FakeDatetime)
|
||||||
monkeypatch.setattr("slic.utils.run_later.sleep", lambda x: None)
|
monkeypatch.setattr("slic.utils.run_later.sleep", lambda x: None)
|
||||||
monkeypatch.setattr("slic.utils.run_later.tqdm_mod", lambda *a, **k: DummyBar())
|
monkeypatch.setattr("slic.utils.run_later.tqdm_mod", lambda *a, **k: DummyBar())
|
||||||
|
|
||||||
run_at(base + timedelta(seconds=30), fexample, "not yet")
|
run_at(base + timedelta(seconds=30), fexample, "not yet")
|
||||||
assert "not yet" not in triggered
|
assert "not yet" not in triggered
|
||||||
|
|
||||||
fake_dt.advance(31)
|
FakeDatetime.advance(31)
|
||||||
run_at(base + timedelta(seconds=30), fexample, "now OK 0")
|
run_at(base + timedelta(seconds=30), fexample, "now OK")
|
||||||
assert "now OK 0" in triggered
|
assert "now OK" in triggered
|
||||||
|
|
||||||
run_at(base - timedelta(seconds=1), fexample, "too late")
|
run_at(base - timedelta(seconds=1), fexample, "too late")
|
||||||
assert "too late" not in triggered
|
assert "too late" not in triggered
|
||||||
@@ -65,20 +57,20 @@ def test_run_in(monkeypatch):
|
|||||||
triggered.append(label)
|
triggered.append(label)
|
||||||
|
|
||||||
base = datetime(2025, 1, 1, 13, 0, 0)
|
base = datetime(2025, 1, 1, 13, 0, 0)
|
||||||
fake_dt = FakeDatetime(base)
|
FakeDatetime.set_now(base)
|
||||||
|
|
||||||
monkeypatch.setattr("slic.utils.run_later.datetime", FakeDateTimeModule(fake_dt))
|
monkeypatch.setattr("slic.utils.run_later.datetime", FakeDatetime)
|
||||||
monkeypatch.setattr("slic.utils.run_later.sleep", lambda x: None)
|
monkeypatch.setattr("slic.utils.run_later.sleep", lambda x: None)
|
||||||
monkeypatch.setattr("slic.utils.run_later.tqdm_mod", lambda *a, **k: DummyBar())
|
monkeypatch.setattr("slic.utils.run_later.tqdm_mod", lambda *a, **k: DummyBar())
|
||||||
|
|
||||||
run_in(timedelta(seconds=20), fexample, "not yet")
|
run_in(timedelta(seconds=20), fexample, "not yet")
|
||||||
assert "not yet" not in triggered
|
assert "not yet" not in triggered
|
||||||
|
|
||||||
fake_dt.advance(25)
|
FakeDatetime.advance(25)
|
||||||
run_in(timedelta(seconds=20), fexample, "now OK 1")
|
run_in(timedelta(seconds=20), fexample, "now OK")
|
||||||
assert "now OK 1" in triggered
|
assert "now OK" in triggered
|
||||||
|
|
||||||
fake_dt.advance(-100)
|
FakeDatetime.advance(-100)
|
||||||
run_in(timedelta(seconds=-1), fexample, "past")
|
run_in(timedelta(seconds=-1), fexample, "past")
|
||||||
assert "past" not in triggered
|
assert "past" not in triggered
|
||||||
|
|
||||||
@@ -90,24 +82,24 @@ def test_run_later(monkeypatch):
|
|||||||
triggered.append(label)
|
triggered.append(label)
|
||||||
|
|
||||||
base = datetime(2025, 1, 1, 14, 0, 0)
|
base = datetime(2025, 1, 1, 14, 0, 0)
|
||||||
fake_dt = FakeDatetime(base)
|
FakeDatetime.set_now(base)
|
||||||
|
|
||||||
monkeypatch.setattr("slic.utils.run_later.datetime", FakeDateTimeModule(fake_dt))
|
monkeypatch.setattr("slic.utils.run_later.datetime", FakeDatetime)
|
||||||
monkeypatch.setattr("slic.utils.run_later.sleep", lambda x: None)
|
monkeypatch.setattr("slic.utils.run_later.sleep", lambda x: None)
|
||||||
monkeypatch.setattr("slic.utils.run_later.tqdm_mod", lambda *a, **k: DummyBar())
|
monkeypatch.setattr("slic.utils.run_later.tqdm_mod", lambda *a, **k: DummyBar())
|
||||||
|
|
||||||
run_later(15, fexample, "15s later")
|
run_later(15, fexample, "15s later")
|
||||||
assert "15s later" not in triggered
|
assert "15s later" not in triggered
|
||||||
|
|
||||||
fake_dt.advance(20)
|
FakeDatetime.advance(20)
|
||||||
run_later(15, fexample, "now OK 2")
|
run_later(15, fexample, "now OK")
|
||||||
assert "now OK 2" in triggered
|
assert "now OK" in triggered
|
||||||
|
|
||||||
run_later(timedelta(seconds=-5), fexample, "past")
|
run_later(timedelta(seconds=-5), fexample, "past")
|
||||||
assert "past" not in triggered
|
assert "past" not in triggered
|
||||||
|
|
||||||
target = base + timedelta(seconds=10)
|
target = base + timedelta(seconds=10)
|
||||||
run_later(target, fexample, "datetime later")
|
run_later(target, fexample, "datetime later")
|
||||||
fake_dt.advance(11)
|
FakeDatetime.advance(11)
|
||||||
run_later(target, fexample, "datetime now OK")
|
run_later(target, fexample, "datetime now OK")
|
||||||
assert "datetime now OK" in triggered
|
assert "datetime now OK" in triggered
|
||||||
|
|||||||
Reference in New Issue
Block a user