- utc_to_eastern: use zoneinfo instead of hardcoded EDT offset (-4) so start times are correct in both EST and EDT - standings: fetch before truncate so a failed API call doesn't wipe existing standings data - routes: call parse_games() once per request instead of three times - scheduler: wrap run_pending() in try/except so an unhandled exception doesn't kill the background thread Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
import pytest
|
|
|
|
from app.scheduler import start_scheduler
|
|
|
|
|
|
class TestStartScheduler:
|
|
def test_registers_standings_refresh_every_600_seconds(self, mocker):
|
|
mock_schedule = mocker.patch("app.scheduler.schedule")
|
|
mocker.patch("app.scheduler.time.sleep", side_effect=StopIteration)
|
|
|
|
with pytest.raises(StopIteration):
|
|
start_scheduler()
|
|
|
|
intervals = [call[0][0] for call in mock_schedule.every.call_args_list]
|
|
assert 600 in intervals
|
|
|
|
def test_registers_score_refresh_every_10_seconds(self, mocker):
|
|
mock_schedule = mocker.patch("app.scheduler.schedule")
|
|
mocker.patch("app.scheduler.time.sleep", side_effect=StopIteration)
|
|
|
|
with pytest.raises(StopIteration):
|
|
start_scheduler()
|
|
|
|
intervals = [call[0][0] for call in mock_schedule.every.call_args_list]
|
|
assert 10 in intervals
|
|
|
|
def test_runs_pending_on_each_tick(self, mocker):
|
|
mock_schedule = mocker.patch("app.scheduler.schedule")
|
|
call_count = {"n": 0}
|
|
|
|
def sleep_twice(_):
|
|
call_count["n"] += 1
|
|
if call_count["n"] >= 2:
|
|
raise StopIteration
|
|
|
|
mocker.patch("app.scheduler.time.sleep", side_effect=sleep_twice)
|
|
|
|
with pytest.raises(StopIteration):
|
|
start_scheduler()
|
|
|
|
assert mock_schedule.run_pending.call_count >= 2
|
|
|
|
def test_continues_after_exception_in_run_pending(self, mocker):
|
|
mock_schedule = mocker.patch("app.scheduler.schedule")
|
|
call_count = {"n": 0}
|
|
|
|
def raise_then_stop(_):
|
|
call_count["n"] += 1
|
|
if call_count["n"] >= 2:
|
|
raise StopIteration
|
|
|
|
mock_schedule.run_pending.side_effect = RuntimeError("boom")
|
|
mocker.patch("app.scheduler.time.sleep", side_effect=raise_then_stop)
|
|
|
|
with pytest.raises(StopIteration):
|
|
start_scheduler()
|
|
|
|
assert mock_schedule.run_pending.call_count >= 2
|