From 079a67a8c8524ca2b928932aba35715445bfe9e3 Mon Sep 17 00:00:00 2001 From: tligui_y Date: Mon, 4 Aug 2025 18:39:19 +0200 Subject: [PATCH] Update tests/test_utils_run_later.py --- tests/test_utils_run_later.py | 68 ++++++++++++++++------------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/tests/test_utils_run_later.py b/tests/test_utils_run_later.py index c416087a7..f1156378d 100644 --- a/tests/test_utils_run_later.py +++ b/tests/test_utils_run_later.py @@ -2,36 +2,28 @@ import pytest from slic.utils.run_later import run_at, run_in, run_later from datetime import datetime, timedelta -# Dummy progress bar replacement to avoid actual tqdm usage + class DummyBar: def __enter__(self): return self def __exit__(self, *a): pass def set(self, val): pass -# Helper class to simulate and manipulate time for testing -class FakeDatetime: - def __init__(self, start_time): - 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) +class FakeDatetime(datetime): + """Subclass datetime to override now().""" + _now = None + @classmethod + def set_now(cls, value): + cls._now = value -# Wrapper to monkeypatch the whole datetime module with a fake .now() -class FakeDateTimeModule: - def __init__(self, fake_dt): - self.fake_dt = fake_dt - self.datetime = datetime + @classmethod + def now(cls, tz=None): + return cls._now - def now(self): - return self.fake_dt.now() - - def __getattr__(self, attr): - return getattr(datetime, attr) + @classmethod + def advance(cls, seconds): + cls._now += timedelta(seconds=seconds) def test_run_at(monkeypatch): @@ -41,18 +33,18 @@ def test_run_at(monkeypatch): triggered.append(label) 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.tqdm_mod", lambda *a, **k: DummyBar()) run_at(base + timedelta(seconds=30), fexample, "not yet") assert "not yet" not in triggered - fake_dt.advance(31) - run_at(base + timedelta(seconds=30), fexample, "now OK 0") - assert "now OK 0" in triggered + FakeDatetime.advance(31) + run_at(base + timedelta(seconds=30), fexample, "now OK") + assert "now OK" in triggered run_at(base - timedelta(seconds=1), fexample, "too late") assert "too late" not in triggered @@ -65,20 +57,20 @@ def test_run_in(monkeypatch): triggered.append(label) 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.tqdm_mod", lambda *a, **k: DummyBar()) run_in(timedelta(seconds=20), fexample, "not yet") assert "not yet" not in triggered - fake_dt.advance(25) - run_in(timedelta(seconds=20), fexample, "now OK 1") - assert "now OK 1" in triggered + FakeDatetime.advance(25) + run_in(timedelta(seconds=20), fexample, "now OK") + assert "now OK" in triggered - fake_dt.advance(-100) + FakeDatetime.advance(-100) run_in(timedelta(seconds=-1), fexample, "past") assert "past" not in triggered @@ -90,24 +82,24 @@ def test_run_later(monkeypatch): triggered.append(label) 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.tqdm_mod", lambda *a, **k: DummyBar()) run_later(15, fexample, "15s later") assert "15s later" not in triggered - fake_dt.advance(20) - run_later(15, fexample, "now OK 2") - assert "now OK 2" in triggered + 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") - fake_dt.advance(11) + FakeDatetime.advance(11) run_later(target, fexample, "datetime now OK") assert "datetime now OK" in triggered