visa / tests\test_loop.py
archivartaunik's picture
Test failure-specific retry interval
af45cd5 verified
Raw
History Blame Contribute Delete
2.66 kB
from datetime import datetime
from visa_checker.loop import scheduled_interval_seconds, run_loop
def test_scheduled_interval_seconds_uses_time_bands():
assert scheduled_interval_seconds(datetime(2026, 6, 28, 7, 59)) == 3600
assert scheduled_interval_seconds(datetime(2026, 6, 28, 8, 0)) == 60
assert scheduled_interval_seconds(datetime(2026, 6, 28, 10, 59)) == 60
assert scheduled_interval_seconds(datetime(2026, 6, 28, 11, 0)) == 120
assert scheduled_interval_seconds(datetime(2026, 6, 28, 12, 59)) == 120
assert scheduled_interval_seconds(datetime(2026, 6, 28, 13, 0)) == 300
assert scheduled_interval_seconds(datetime(2026, 6, 28, 17, 59)) == 300
assert scheduled_interval_seconds(datetime(2026, 6, 28, 18, 0)) == 3600
def test_run_loop_sleeps_between_checks():
calls = []
sleeps = []
run_loop(
check_once=lambda: calls.append("check"),
interval_seconds=300,
sleep=sleeps.append,
max_runs=2,
)
assert calls == ["check", "check"]
assert sleeps == [300]
def test_run_loop_uses_scheduled_interval_after_success():
calls = []
sleeps = []
run_loop(
check_once=lambda: calls.append("check"),
interval_seconds=300,
interval_provider=lambda: 60,
sleep=sleeps.append,
max_runs=2,
)
assert calls == ["check", "check"]
assert sleeps == [60]
def test_run_loop_can_run_once_without_sleeping():
calls = []
sleeps = []
run_loop(
check_once=lambda: calls.append("check"),
interval_seconds=300,
sleep=sleeps.append,
run_once=True,
)
assert calls == ["check"]
assert sleeps == []
def test_run_loop_continues_after_check_error():
calls = []
sleeps = []
def check_once():
calls.append("check")
if len(calls) == 1:
raise RuntimeError("temporary failure")
run_loop(
check_once=check_once,
interval_seconds=300,
error_interval_seconds=30,
sleep=sleeps.append,
max_runs=2,
)
assert calls == ["check", "check"]
assert sleeps == [30]
def test_run_loop_uses_exception_retry_after_seconds():
calls = []
sleeps = []
class SlowRetryError(RuntimeError):
retry_after_seconds = 3600
def check_once():
calls.append("check")
if len(calls) == 1:
raise SlowRetryError("blocked")
run_loop(
check_once=check_once,
interval_seconds=300,
error_interval_seconds=30,
sleep=sleeps.append,
max_runs=2,
)
assert calls == ["check", "check"]
assert sleeps == [3600]