Add isRinging query to check alarm state via API

Features:
- New GraphQL query 'isRinging' returns true/false if wecker is active
- Checks the wecker process via PID file (PID_FILE in common.py)

DRY refactoring:
- Extract PID_FILE into shared common.py module
- Both wecker.py and api/schema.py import from common
- DRY enforcement tests verify identity (is) not just equality

Tests:
- test_is_ringing_returns_false_when_not_running
- test_is_ringing_returns_true_when_running
- test_pid_file_defined_once_across_modules (DRY enforcement)
- test_pid_file_same_shared_constant_in_api (DRY enforcement)
- Cleaned up unused imports in test_single_instance.py

Docs:
- Updated README.md with isRinging query documentation
This commit is contained in:
Markus Graf
2026-05-19 15:15:05 +02:00
parent 29aff04e33
commit 558c4ff5b6
6 changed files with 98 additions and 5 deletions
+38
View File
@@ -1,3 +1,4 @@
from unittest.mock import patch
from fastapi.testclient import TestClient
import tempfile
import os
@@ -14,6 +15,33 @@ from api.main import app # noqa: E402
client = TestClient(app)
def test_is_ringing_returns_false_when_not_running():
"""Test that isRinging returns False when no wecker process is running."""
headers = {"X-API-Key": "test-secret"}
query = """
query {
isRinging
}
"""
res = client.post("/graphql", json={"query": query}, headers=headers)
assert res.status_code == 200
assert res.json()["data"]["isRinging"] is False
@patch("api.schema.is_wecker_ringing", return_value=True)
def test_is_ringing_returns_true_when_running(mock_is_ringing):
"""Test that isRinging returns True when a wecker process is running."""
headers = {"X-API-Key": "test-secret"}
query = """
query {
isRinging
}
"""
res = client.post("/graphql", json={"query": query}, headers=headers)
assert res.status_code == 200
assert res.json()["data"]["isRinging"] is True
def test_auth_missing():
query = """
query {
@@ -173,3 +201,13 @@ def test_graphql_workflow():
# 7. List again is empty
res = client.post("/graphql", json={"query": query_get}, headers=headers)
assert res.json()["data"]["getAlarms"] == []
def test_pid_file_same_shared_constant_in_api():
"""Ensure api.schema uses the same PID_FILE from common, not a redefinition."""
from api import schema as api_schema
import common
assert api_schema.PID_FILE is common.PID_FILE, (
"api.schema.PID_FILE must reference common.PID_FILE, not redefine it"
)