Files
wecker/tests/test_crontab.py
gurix c50f296232 feat: pass alarm style through crontab manager and GraphQL API
- crontab_manager.get_alarms now parses --style from the cron command
  (defaults to 'blink' for legacy entries without --style)
- GraphQL Alarm type gains a 'style' field
- setAlarm accepts a 'style' arg (default 'simple') and validates it
  against the styles registry; unknown styles raise a GraphQL error
- _default_command embeds --style <name> into the cron command
- startRinging accepts 'style' (default 'simple') and passes --style to
  the spawned wecker.py

The crontab remains the single source of truth; the style simply rides
in the cron command alongside --music-file.
2026-07-31 16:20:16 +02:00

110 lines
3.1 KiB
Python

import pytest
import tempfile
import uuid
from api.crontab_manager import CrontabManager
@pytest.fixture
def crontab_file():
with tempfile.NamedTemporaryFile(mode="w+", delete=False) as f:
pass
yield f.name
def test_crontab_manager_empty(crontab_file):
manager = CrontabManager(tabfile=crontab_file)
assert manager.get_alarms() == []
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",
is_enabled=True,
)
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
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",
is_enabled=True,
)
manager.set_alarm(
alarm_id=alarm_id,
cron_expression="0 8 * * *",
command="python wecker.py --loud",
is_enabled=False,
)
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
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
manager.delete_alarm(alarm_id)
assert len(manager.get_alarms()) == 0
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)
def test_get_alarms_parses_style(crontab_file):
manager = CrontabManager(tabfile=crontab_file)
manager.set_alarm(
alarm_id="style-id",
cron_expression="30 7 * * *",
command="python wecker.py --style simple",
is_enabled=True,
)
alarms = manager.get_alarms()
assert len(alarms) == 1
assert alarms[0]["style"] == "simple"
def test_get_alarms_parses_eq_style(crontab_file):
manager = CrontabManager(tabfile=crontab_file)
manager.set_alarm(
alarm_id="style-eq-id",
cron_expression="30 7 * * *",
command="python wecker.py --style=blink",
is_enabled=True,
)
assert manager.get_alarms()[0]["style"] == "blink"
def test_get_alarms_legacy_command_defaults_to_blink(crontab_file):
manager = CrontabManager(tabfile=crontab_file)
manager.set_alarm(
alarm_id="legacy-id",
cron_expression="30 7 * * *",
command="python wecker.py",
is_enabled=True,
)
assert manager.get_alarms()[0]["style"] == "blink"