Update tests/test_utils_run_later.py
Run CI Tests / test (push) Successful in 1m40s

This commit is contained in:
2025-08-04 21:46:50 +02:00
parent 079a67a8c8
commit 64265fdc03
+47 -49
View File
@@ -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