2026-05-09 22:18:38 +02:00
|
|
|
import pytest
|
|
|
|
|
import tempfile
|
|
|
|
|
import uuid
|
|
|
|
|
from api.crontab_manager import CrontabManager
|
|
|
|
|
|
2026-05-11 15:05:29 +02:00
|
|
|
|
2026-05-09 22:18:38 +02:00
|
|
|
@pytest.fixture
|
|
|
|
|
def crontab_file():
|
2026-05-11 15:05:29 +02:00
|
|
|
with tempfile.NamedTemporaryFile(mode="w+", delete=False) as f:
|
2026-05-09 22:18:38 +02:00
|
|
|
pass
|
|
|
|
|
yield f.name
|
|
|
|
|
|
2026-05-11 15:05:29 +02:00
|
|
|
|
2026-05-09 22:18:38 +02:00
|
|
|
def test_crontab_manager_empty(crontab_file):
|
|
|
|
|
manager = CrontabManager(tabfile=crontab_file)
|
|
|
|
|
assert manager.get_alarms() == []
|
|
|
|
|
|
2026-05-11 15:05:29 +02:00
|
|
|
|
2026-05-09 22:18:38 +02:00
|
|
|
def test_add_and_list_alarm(crontab_file):
|
|
|
|
|
manager = CrontabManager(tabfile=crontab_file)
|
|
|
|
|
alarm_id = str(uuid.uuid4())
|
|
|
|
|
manager.set_alarm(
|
|
|
|
|
alarm_id=alarm_id,
|
|
|
|
|
cron_expression="30 7 * * *",
|
|
|
|
|
command="python wecker.py",
|
2026-05-11 15:05:29 +02:00
|
|
|
is_enabled=True,
|
2026-05-09 22:18:38 +02:00
|
|
|
)
|
2026-05-11 15:05:29 +02:00
|
|
|
|
2026-05-09 22:18:38 +02:00
|
|
|
alarms = manager.get_alarms()
|
|
|
|
|
assert len(alarms) == 1
|
|
|
|
|
assert alarms[0]["id"] == alarm_id
|
|
|
|
|
assert alarms[0]["cron_expression"] == "30 7 * * *"
|
|
|
|
|
assert alarms[0]["command"] == "python wecker.py"
|
|
|
|
|
assert alarms[0]["is_enabled"] is True
|
|
|
|
|
|
2026-05-11 15:05:29 +02:00
|
|
|
|
2026-05-09 22:18:38 +02:00
|
|
|
def test_update_alarm(crontab_file):
|
|
|
|
|
manager = CrontabManager(tabfile=crontab_file)
|
|
|
|
|
alarm_id = "test-id"
|
|
|
|
|
manager.set_alarm(
|
|
|
|
|
alarm_id=alarm_id,
|
|
|
|
|
cron_expression="30 7 * * *",
|
|
|
|
|
command="python wecker.py",
|
2026-05-11 15:05:29 +02:00
|
|
|
is_enabled=True,
|
2026-05-09 22:18:38 +02:00
|
|
|
)
|
2026-05-11 15:05:29 +02:00
|
|
|
|
2026-05-09 22:18:38 +02:00
|
|
|
manager.set_alarm(
|
|
|
|
|
alarm_id=alarm_id,
|
|
|
|
|
cron_expression="0 8 * * *",
|
|
|
|
|
command="python wecker.py --loud",
|
2026-05-11 15:05:29 +02:00
|
|
|
is_enabled=False,
|
2026-05-09 22:18:38 +02:00
|
|
|
)
|
2026-05-11 15:05:29 +02:00
|
|
|
|
2026-05-09 22:18:38 +02:00
|
|
|
alarms = manager.get_alarms()
|
|
|
|
|
assert len(alarms) == 1
|
|
|
|
|
assert alarms[0]["cron_expression"] == "0 8 * * *"
|
|
|
|
|
assert alarms[0]["command"] == "python wecker.py --loud"
|
|
|
|
|
assert alarms[0]["is_enabled"] is False
|
|
|
|
|
|
2026-05-11 15:05:29 +02:00
|
|
|
|
2026-05-09 22:18:38 +02:00
|
|
|
def test_delete_alarm(crontab_file):
|
|
|
|
|
manager = CrontabManager(tabfile=crontab_file)
|
|
|
|
|
alarm_id = "test-id-2"
|
|
|
|
|
manager.set_alarm(alarm_id, "0 0 * * *", "cmd", True)
|
|
|
|
|
assert len(manager.get_alarms()) == 1
|
2026-05-11 15:05:29 +02:00
|
|
|
|
2026-05-09 22:18:38 +02:00
|
|
|
manager.delete_alarm(alarm_id)
|
|
|
|
|
assert len(manager.get_alarms()) == 0
|
2026-06-18 16:47:56 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_set_alarm_rejects_invalid_cron_expression(crontab_file):
|
|
|
|
|
manager = CrontabManager(tabfile=crontab_file)
|
|
|
|
|
with pytest.raises(ValueError, match="Invalid cron expression"):
|
|
|
|
|
manager.set_alarm("test-id", "not-a-cron-expression", "cmd", True)
|