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]