124 lines
3.9 KiB
Python
124 lines
3.9 KiB
Python
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)]
|