diff --git a/tests/test_utils_run_later.py b/tests/test_utils_run_later.py index f1156378d..9423c856e 100644 --- a/tests/test_utils_run_later.py +++ b/tests/test_utils_run_later.py @@ -1,105 +1,103 @@ import pytest -from slic.utils.run_later import run_at, run_in, run_later from datetime import datetime, timedelta +from slic.utils.run_later import run_at, run_in, run_later, today, tomorrow, yesterday - +# Dummy tqdm class DummyBar: def __enter__(self): return self def __exit__(self, *a): pass def set(self, val): pass - -class FakeDatetime(datetime): - """Subclass datetime to override now().""" +# Fake time controller +class FakeDatetime: _now = None @classmethod - def set_now(cls, value): - cls._now = value + def set_now(cls, dt): + cls._now = dt @classmethod - def now(cls, tz=None): + def now(cls): return cls._now @classmethod def advance(cls, seconds): cls._now += timedelta(seconds=seconds) +# Wrapper to patch the datetime module +class FakeDateTimeModule: + def __getattr__(self, attr): + if attr == "now": + return FakeDatetime.now + return getattr(datetime, attr) + +# -------- Tests -------- # def test_run_at(monkeypatch): triggered = [] + def fexample(label): triggered.append(label) - def fexample(label): - triggered.append(label) - - base = datetime(2025, 1, 1, 12, 0, 0) - FakeDatetime.set_now(base) - - monkeypatch.setattr("slic.utils.run_later.datetime", FakeDatetime) + FakeDatetime.set_now(datetime(2025, 1, 1, 6, 0, 0)) + monkeypatch.setattr("slic.utils.run_later.datetime", FakeDateTimeModule()) monkeypatch.setattr("slic.utils.run_later.sleep", lambda x: None) monkeypatch.setattr("slic.utils.run_later.tqdm_mod", lambda *a, **k: DummyBar()) - run_at(base + timedelta(seconds=30), fexample, "not yet") + # Trop tôt : ne doit pas exécuter + run_at(today(6, 30), fexample, "not yet") assert "not yet" not in triggered - FakeDatetime.advance(31) - run_at(base + timedelta(seconds=30), fexample, "now OK") + # Bon moment : doit exécuter + FakeDatetime.advance(31 * 60) # +31 min + run_at(today(6, 30), fexample, "now OK") assert "now OK" in triggered - run_at(base - timedelta(seconds=1), fexample, "too late") + # Trop tard : ne doit pas exécuter + run_at(yesterday(23, 59), fexample, "too late") assert "too late" not in triggered def test_run_in(monkeypatch): triggered = [] + def fexample(label): triggered.append(label) - def fexample(label): - triggered.append(label) - - base = datetime(2025, 1, 1, 13, 0, 0) - FakeDatetime.set_now(base) - - monkeypatch.setattr("slic.utils.run_later.datetime", FakeDatetime) + FakeDatetime.set_now(datetime(2025, 1, 1, 10, 0, 0)) + monkeypatch.setattr("slic.utils.run_later.datetime", FakeDateTimeModule()) monkeypatch.setattr("slic.utils.run_later.sleep", lambda x: None) monkeypatch.setattr("slic.utils.run_later.tqdm_mod", lambda *a, **k: DummyBar()) - run_in(timedelta(seconds=20), fexample, "not yet") + # Trop tôt + run_in(timedelta(minutes=10), fexample, "not yet") assert "not yet" not in triggered - FakeDatetime.advance(25) - run_in(timedelta(seconds=20), fexample, "now OK") + # Bon moment + FakeDatetime.advance(11 * 60) + run_in(timedelta(minutes=10), fexample, "now OK") assert "now OK" in triggered - FakeDatetime.advance(-100) - run_in(timedelta(seconds=-1), fexample, "past") - assert "past" not in triggered + # Trop tard + FakeDatetime.advance(-3600) + run_in(timedelta(seconds=-1), fexample, "too late") + assert "too late" not in triggered def test_run_later(monkeypatch): triggered = [] + def fexample(label): triggered.append(label) - def fexample(label): - triggered.append(label) - - base = datetime(2025, 1, 1, 14, 0, 0) - FakeDatetime.set_now(base) - - monkeypatch.setattr("slic.utils.run_later.datetime", FakeDatetime) + FakeDatetime.set_now(datetime(2025, 1, 1, 12, 0, 0)) + monkeypatch.setattr("slic.utils.run_later.datetime", FakeDateTimeModule()) monkeypatch.setattr("slic.utils.run_later.sleep", lambda x: None) monkeypatch.setattr("slic.utils.run_later.tqdm_mod", lambda *a, **k: DummyBar()) - run_later(15, fexample, "15s later") - assert "15s later" not in triggered + # Trop tôt (15 secondes à attendre) + run_later(15, fexample, "not yet") + assert "not yet" not in triggered + # Bon moment (20 secondes plus tard) FakeDatetime.advance(20) run_later(15, fexample, "now OK") assert "now OK" in triggered - run_later(timedelta(seconds=-5), fexample, "past") - assert "past" not in triggered - - target = base + timedelta(seconds=10) - run_later(target, fexample, "datetime later") - FakeDatetime.advance(11) - run_later(target, fexample, "datetime now OK") - assert "datetime now OK" in triggered + # Trop tard (temps déjà dépassé) + run_later(timedelta(seconds=-5), fexample, "too late") + assert "too late" not in triggered