feat: Telegram settings in DB with UI edit and test send
Store notification_channels (migration 004), effective config DB over env, PUT/test API endpoints, Settings form, and pass db session into ingest notify. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
"""GET /api/v1/settings/notifications"""
|
||||
"""GET/PUT/POST /api/v1/settings/notifications"""
|
||||
|
||||
from app.services.telegram_notify import get_settings
|
||||
from unittest.mock import patch
|
||||
|
||||
from app.config import get_settings
|
||||
from app.models.notification_channel import NotificationChannel
|
||||
from app.services.notification_settings import get_effective_telegram_config
|
||||
|
||||
|
||||
def test_get_notification_settings_masks_secrets(jwt_headers, client, monkeypatch):
|
||||
@@ -18,4 +22,70 @@ def test_get_notification_settings_masks_secrets(jwt_headers, client, monkeypatc
|
||||
assert body["telegram"]["min_severity"] == "warning"
|
||||
assert body["telegram"]["source"] == "env"
|
||||
assert body["telegram"]["bot_token_hint"].endswith("ghij")
|
||||
assert "1234567890" not in body["telegram"]["bot_token_hint"]
|
||||
|
||||
|
||||
def test_put_telegram_settings_persists_db(jwt_headers, client, db_session, monkeypatch):
|
||||
monkeypatch.setenv("TELEGRAM_ENABLED", "false")
|
||||
monkeypatch.setenv("TELEGRAM_BOT_TOKEN", "")
|
||||
monkeypatch.setenv("TELEGRAM_CHAT_ID", "")
|
||||
monkeypatch.setenv("TELEGRAM_MIN_SEVERITY", "high")
|
||||
get_settings.cache_clear()
|
||||
|
||||
response = client.put(
|
||||
"/api/v1/settings/notifications/telegram",
|
||||
headers=jwt_headers,
|
||||
json={
|
||||
"enabled": True,
|
||||
"min_severity": "warning",
|
||||
"bot_token": "1234567890:TESTTOKEN",
|
||||
"chat_id": "999001",
|
||||
},
|
||||
)
|
||||
assert response.status_code == 200
|
||||
body = response.json()
|
||||
assert body["source"] == "db"
|
||||
assert body["enabled"] is True
|
||||
assert body["min_severity"] == "warning"
|
||||
|
||||
row = db_session.get(NotificationChannel, "telegram")
|
||||
assert row is not None
|
||||
assert row.bot_token == "1234567890:TESTTOKEN"
|
||||
assert row.chat_id == "999001"
|
||||
|
||||
cfg = get_effective_telegram_config(db_session)
|
||||
assert cfg.source == "db"
|
||||
assert cfg.min_severity == "warning"
|
||||
|
||||
|
||||
def test_post_telegram_test_success(jwt_headers, client, db_session, monkeypatch):
|
||||
monkeypatch.setenv("TELEGRAM_ENABLED", "true")
|
||||
monkeypatch.setenv("TELEGRAM_BOT_TOKEN", "tok")
|
||||
monkeypatch.setenv("TELEGRAM_CHAT_ID", "1")
|
||||
get_settings.cache_clear()
|
||||
|
||||
db_session.add(
|
||||
NotificationChannel(
|
||||
channel="telegram",
|
||||
enabled=True,
|
||||
min_severity="warning",
|
||||
bot_token="1234567890:ABCDEF",
|
||||
chat_id="2843230",
|
||||
)
|
||||
)
|
||||
db_session.commit()
|
||||
|
||||
with patch("app.api.v1.settings.send_telegram_test_message") as mock_test:
|
||||
response = client.post("/api/v1/settings/notifications/telegram/test", headers=jwt_headers)
|
||||
assert response.status_code == 200
|
||||
assert response.json()["ok"] is True
|
||||
mock_test.assert_called_once()
|
||||
|
||||
|
||||
def test_post_telegram_test_not_configured(jwt_headers, client, monkeypatch):
|
||||
monkeypatch.setenv("TELEGRAM_ENABLED", "false")
|
||||
monkeypatch.setenv("TELEGRAM_BOT_TOKEN", "")
|
||||
monkeypatch.setenv("TELEGRAM_CHAT_ID", "")
|
||||
get_settings.cache_clear()
|
||||
|
||||
response = client.post("/api/v1/settings/notifications/telegram/test", headers=jwt_headers)
|
||||
assert response.status_code == 400
|
||||
|
||||
Reference in New Issue
Block a user