import main def test_main_exits_quickly(monkeypatch): monkeypatch.setattr(main, "send_notification", lambda x: None) monkeypatch.setattr(main, "start_dashboard", lambda: None) monkeypatch.setattr(main.schedule, "run_pending", lambda: ( _ for _ in ()).throw(KeyboardInterrupt())) monkeypatch.setattr(main.time, "sleep", lambda s: None) monkeypatch.setenv("DISCORD_WEBHOOK_URL", "http://example.com/webhook") main.WEBHOOK_URL = "http://example.com/webhook" main.main() def test_get_next_scheduled_event(): now = main.datetime(2025, 1, 1, 10, 14, 30) nxt = main.get_next_scheduled_event(now) assert nxt["type"] == "reminder" assert nxt["at"].hour == 10 and nxt["at"].minute == 15 now = main.datetime(2025, 1, 1, 10, 50, 1) nxt = main.get_next_scheduled_event(now) assert nxt["type"] == "reminder" assert nxt["at"].hour == 11 and nxt["at"].minute == 15 def test_schedule_startup_test_cleanup_when_sent(monkeypatch): captured: dict[str, object] = {} delete_calls: list[tuple[int, str | None]] = [] class FakeEvery: @property def minutes(self): return self def do(self, fn, *args, **kwargs): captured["job"] = lambda: fn(*args, **kwargs) return object() monkeypatch.setattr(main.schedule, "every", lambda n: FakeEvery()) monkeypatch.setattr( main, "delete_old_messages", lambda minutes, content_pattern=None: delete_calls.append( (minutes, content_pattern)), ) main._schedule_startup_test_cleanup(True) assert "job" in captured result = captured["job"]() assert result == main.schedule.CancelJob assert delete_calls == [(1, main.TEST_MESSAGE_DELETE_PATTERN)] def test_schedule_startup_test_cleanup_skips_when_not_sent(monkeypatch): called = {"value": False} class FakeEvery: @property def minutes(self): return self def do(self, fn, *args, **kwargs): called["value"] = True return object() monkeypatch.setattr(main.schedule, "every", lambda n: FakeEvery()) main._schedule_startup_test_cleanup(False) assert called["value"] is False def test_main_sends_startup_test_and_deletes_it(monkeypatch): send_calls: list[str] = [] delete_calls: list[tuple[int, str | None]] = [] scheduled_jobs: dict[int, list[object]] = {1: [], 5: []} monkeypatch.setattr(main, "start_dashboard", lambda: None) monkeypatch.setattr(main, "schedule_notification", lambda interval, at, type: None) class FakeEvery: def __init__(self, minutes_value: int): self.minutes_value = minutes_value @property def minutes(self): return self def do(self, fn, *args, **kwargs): scheduled_jobs.setdefault(self.minutes_value, []).append( lambda: fn(*args, **kwargs) ) return object() monkeypatch.setattr(main.schedule, "every", lambda n: FakeEvery(n)) def fake_send_notification(message: str) -> bool: send_calls.append(message) return True def fake_delete_old_messages(minutes: int = 6, content_pattern: str | None = None): delete_calls.append((minutes, content_pattern)) def fake_run_pending(): for job in scheduled_jobs.get(1, []): job() raise KeyboardInterrupt() monkeypatch.setattr(main, "send_notification", fake_send_notification) monkeypatch.setattr(main, "delete_old_messages", fake_delete_old_messages) monkeypatch.setattr(main.schedule, "run_pending", fake_run_pending) monkeypatch.setattr(main.time, "sleep", lambda s: None) monkeypatch.setenv("DISCORD_WEBHOOK_URL", "http://example.com/webhook") main.WEBHOOK_URL = "http://example.com/webhook" main.main() assert send_calls == ["test"] assert delete_calls == [(1, main.TEST_MESSAGE_DELETE_PATTERN)]