From c77f85dbd9cdbeb63526bbc0b890c3833b83441c Mon Sep 17 00:00:00 2001 From: tligui_y Date: Tue, 5 Aug 2025 07:58:39 +0200 Subject: [PATCH] Update tests/test_utils_run_later.py --- tests/test_utils_run_later.py | 102 +++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 44 deletions(-) diff --git a/tests/test_utils_run_later.py b/tests/test_utils_run_later.py index 8bf2d47af..756d14c16 100644 --- a/tests/test_utils_run_later.py +++ b/tests/test_utils_run_later.py @@ -2,97 +2,111 @@ import pytest from datetime import datetime, timedelta from slic.utils.run_later import run_at, run_in, run_later, today, tomorrow, yesterday -# Simule tqdm +# Dummy progress bar replacement class DummyBar: def __enter__(self): return self def __exit__(self, *a): pass def set(self, val): pass -# Simule l'heure courante -class FakeClock: - now = datetime(2025, 1, 1, 6, 0, 0) +# Global clock control +class FakeDatetime: + _now = None @classmethod - def set(cls, dt): - cls.now = dt + def set_now(cls, value): + cls._now = value @classmethod def advance(cls, seconds): - cls.now += timedelta(seconds=seconds) + cls._now += timedelta(seconds=seconds) + + @classmethod + def now(cls): + return cls._now -@pytest.fixture(autouse=True) +@pytest.fixture def patch_time(monkeypatch): - # Patch sleep + tqdm + # Mock sleep to do nothing monkeypatch.setattr("slic.utils.run_later.sleep", lambda x: None) + # Mock progress bar monkeypatch.setattr("slic.utils.run_later.tqdm_mod", lambda *a, **k: DummyBar()) - - # Patch datetime.now() dans slic.utils.run_later - class FakeDateTime(datetime): - @classmethod - def now(cls, tz=None): - return FakeClock.now - - monkeypatch.setattr("slic.utils.run_later.datetime", FakeDateTime) - - monkeypatch.setattr("slic.utils.run_later.today", lambda h=0, m=0: datetime(FakeClock.now.year, FakeClock.now.month, FakeClock.now.day, h, m)) - monkeypatch.setattr("slic.utils.run_later.tomorrow", lambda h=0, m=0: datetime(FakeClock.now.year, FakeClock.now.month, FakeClock.now.day, h, m) + timedelta(days=1)) - monkeypatch.setattr("slic.utils.run_later.yesterday", lambda h=0, m=0: datetime(FakeClock.now.year, FakeClock.now.month, FakeClock.now.day, h, m) - timedelta(days=1)) + # Mock datetime.now to use our fake time + monkeypatch.setattr("slic.utils.run_later.datetime", FakeDatetime) + # Mock helper functions to use fake time + monkeypatch.setattr("slic.utils.run_later.today", lambda *args, **kwargs: datetime( + FakeDatetime.now().year, FakeDatetime.now().month, FakeDatetime.now().day, *args, **kwargs)) + monkeypatch.setattr("slic.utils.run_later.tomorrow", lambda *args, **kwargs: datetime( + FakeDatetime.now().year, FakeDatetime.now().month, FakeDatetime.now().day, *args, **kwargs) + timedelta(days=1)) + monkeypatch.setattr("slic.utils.run_later.yesterday", lambda *args, **kwargs: datetime( + FakeDatetime.now().year, FakeDatetime.now().month, FakeDatetime.now().day, *args, **kwargs) - timedelta(days=1)) -def test_run_at(): +def test_run_at(patch_time): triggered = [] def fexample(label): triggered.append(label) - FakeClock.set(datetime(2025, 1, 1, 6, 0, 0)) - run_at(today(6, 30), fexample, "not yet") - assert "not yet" not in triggered + FakeDatetime.set_now(datetime(2025, 1, 1, 6, 0, 0)) - FakeClock.advance(31 * 60) + # Schedule for 6:30 run_at(today(6, 30), fexample, "now OK") + assert not triggered # Shouldn't have run yet + + # Advance to 6:30:01 + FakeDatetime.advance(30 * 60 + 1) + run_at(today(6, 30), fexample, "now OK") # This should trigger the function assert "now OK" in triggered - FakeClock.set(datetime(2025, 1, 1, 6, 0, 0)) + # Try scheduling something in the past run_at(yesterday(23, 59), fexample, "too late") assert "too late" not in triggered -def test_run_in(): +def test_run_in(patch_time): triggered = [] def fexample(label): triggered.append(label) - FakeClock.set(datetime(2025, 1, 1, 12, 0, 0)) - run_in(timedelta(seconds=60), fexample, "not yet") - assert "not yet" not in triggered + FakeDatetime.set_now(datetime(2025, 1, 1, 12, 0, 0)) - FakeClock.advance(61) + # Schedule for 60 seconds later run_in(timedelta(seconds=60), fexample, "now OK") + assert not triggered # Shouldn't have run yet + + # Advance 61 seconds + FakeDatetime.advance(61) + run_in(timedelta(seconds=60), fexample, "now OK") # This should trigger assert "now OK" in triggered - FakeClock.advance(-200) + # Try scheduling something in the past run_in(timedelta(seconds=-1), fexample, "too late") assert "too late" not in triggered -def test_run_later(): +def test_run_later(patch_time): triggered = [] def fexample(label): triggered.append(label) - FakeClock.set(datetime(2025, 1, 1, 14, 0, 0)) - run_later(45, fexample, "not yet") - assert "not yet" not in triggered + FakeDatetime.set_now(datetime(2025, 1, 1, 14, 0, 0)) - FakeClock.advance(60) + # Schedule for 45 seconds later run_later(45, fexample, "now OK") + assert not triggered # Shouldn't have run yet + + # Advance 60 seconds + FakeDatetime.advance(60) + run_later(45, fexample, "now OK") # This should trigger assert "now OK" in triggered + # Try scheduling something in the past run_later(timedelta(seconds=-1), fexample, "too late") assert "too late" not in triggered - FakeClock.set(datetime(2025, 1, 1, 15, 0, 0)) - run_later(today(15, 5), fexample, "not yet dt") - assert "not yet dt" not in triggered - - FakeClock.advance(6 * 60) + # Test with datetime object + FakeDatetime.set_now(datetime(2025, 1, 1, 15, 0, 0)) run_later(today(15, 5), fexample, "now OK dt") - assert "now OK dt" in triggered + assert not triggered # Shouldn't have run yet + + # Advance 6 minutes + FakeDatetime.advance(6 * 60) + run_later(today(15, 5), fexample, "now OK dt") # This should trigger + assert "now OK dt" in triggered \ No newline at end of file