Files
slic/tests/test_utils_run_later.py
T
tligui_y fbba560475
Run CI Tests / test (push) Successful in 2m37s
Update tests/test_utils_run_later.py
2025-08-05 14:22:37 +02:00

172 lines
4.7 KiB
Python

import pytest
import time_machine
import io
from datetime import datetime, timedelta
from slic.utils.run_later import run_at, run_in, run_later, today, tomorrow, yesterday
import pytest
from slic.utils.run_later import MatMulTrick
from datetime import datetime
# Test MatMulTrick
def original_func(*args, **kwargs):
return ("called", args, kwargs)
def test_init_and_repr():
wrapped = MatMulTrick(original_func)
assert wrapped.func is original_func
assert repr(wrapped) == repr(original_func)
def test_call():
wrapped = MatMulTrick(original_func)
result = wrapped(1, 2, a=3)
assert result == ("called", (1, 2), {'a': 3})
def test_matmul_with_string():
wrapped = MatMulTrick(original_func)
result = wrapped @ "6:30"
assert result == ("called", (6, 30), {})
def test_matmul_with_list():
wrapped = MatMulTrick(original_func)
result = wrapped @ [6, 30]
assert result == ("called", (6, 30), {})
def test_matmul_with_single_int():
wrapped = MatMulTrick(original_func)
result = wrapped @ 7
assert result == ("called", (7,), {})
# Test run functions
def fexample(label):
print(f"Triggered: {label}")
def test_run_at_future_triggered_and_logs(capsys):
with time_machine.travel(datetime(2025, 1, 1, 12, 0, 0), tick=True):
run_at(datetime(2025, 1, 1, 12, 0, 0) + timedelta(seconds=0.2), fexample, "A")
captured = capsys.readouterr().out
assert "will run at" in captured
assert "this will be in" in captured
assert "Triggered: A" in captured
def test_run_at_already_past(capsys):
with time_machine.travel(datetime(2025, 1, 1, 12, 0, 0), tick=True):
run_at(datetime(2025, 1, 1, 11, 59, 59), fexample, "B")
captured = capsys.readouterr().out
assert "it is already past" in captured
assert "ago" in captured
assert "Triggered: B" not in captured
def test_run_in_future_triggered_and_logs(capsys):
with time_machine.travel(datetime(2025, 1, 1, 12, 0, 0), tick=True):
run_in(timedelta(seconds=0.2), fexample, "IN")
captured = capsys.readouterr().out
assert "will run at" in captured
assert "this will be in" in captured
assert "Triggered: IN" in captured
def test_run_in_past(capsys):
with time_machine.travel(datetime(2025, 1, 1, 12, 0, 0), tick=True):
run_in(-timedelta(seconds=2), fexample, "IN PAST")
captured = capsys.readouterr().out
assert "it is already past" in captured
assert "Triggered: IN PAST" not in captured
from slic.utils.run_later import run_later
def test_run_later_with_seconds(capsys):
with time_machine.travel(datetime(2025, 1, 1, 14, 0, 0), tick=True):
run_later(0.2, fexample, "LATER")
captured = capsys.readouterr().out
assert "will run at" in captured
assert "Triggered: LATER" in captured
def test_run_later_with_past_datetime(capsys):
with time_machine.travel(datetime(2025, 1, 1, 14, 0, 0), tick=True):
past_time = datetime(2025, 1, 1, 13, 59, 59)
run_later(past_time, fexample, "TOO LATE")
captured = capsys.readouterr().out
assert "it is already past" in captured
assert "Triggered: TOO LATE" not in captured
def test_run_at_tqdm_multiple_updates(monkeypatch, capsys):
def fexample():
print("Function done!")
when = datetime.now() + timedelta(seconds=0.2)
run_at(when, fexample)
captured = capsys.readouterr()
assert "0%| |" in captured.err
assert "50%|█████ |" in captured.err
assert "100%|██████████|" in captured.err
assert "Function done!" in captured.out
# Test today/yesterday and tomorrow functions
def test_today_basic():
with time_machine.travel("2025-01-01 10:00:00", tick=False):
val = today(12, 30)
assert val == datetime(2025, 1, 1, 12, 30)
def test_tomorrow_basic():
with time_machine.travel("2025-01-01 10:00:00", tick=False):
val = tomorrow(12, 30)
assert val == datetime(2025, 1, 2, 12, 30)
def test_yesterday_basic():
with time_machine.travel("2025-01-01 10:00:00", tick=False):
val = yesterday(12, 30)
assert val == datetime(2024, 12, 31, 12, 30)
def test_today_matmul_string():
with time_machine.travel("2025-01-01 00:00:00", tick=False):
val = today @ "15:45"
assert val == datetime(2025, 1, 1, 15, 45)
def test_tomorrow_matmul_list():
with time_machine.travel("2025-01-01 00:00:00", tick=False):
val = tomorrow @ [6, 0]
assert val == datetime(2025, 1, 2, 6, 0)
def test_yesterday_matmul_single():
with time_machine.travel("2025-01-01 00:00:00", tick=False):
val = yesterday @ 7
assert val == datetime(2024, 12, 31, 7, 0)