import re import time from app import audit from app.models import KIND_SYSTEM, Event from tests.test_web import (ADMIN, VIEWER, admin, app, client, csrf_from, login_ok, post, # noqa: F401 users, viewer) ALERTING = "/settings/alerting" def alerting_form(**overrides): data = {"poll_interval": "30", "alerts_default_delay_minutes": "15", "alerts_reminder_hours": "0", "alerts_recovery_enabled": "1", "alerts_bundle_seconds": "60", "alerts_ai_per_minute": "10", "alerts_host_delay_minutes": "0", "alerts_send_limit_per_minute": "15", "ui_base_url": ""} data.update(overrides) return data def insert_state(app, host, service, state, output="x", **columns): values = {"host": host, "service": service, "state": state, "output": output, "last_state_change": 1000, "reported_state": state, **columns} names = ", ".join(values) app.state.db.execute(f"INSERT INTO service_states({names}) VALUES ({', '.join('?' for _ in values)})", tuple(values.values())) def test_alerting_page_shows_new_fields_and_baseline_button(client, admin): login_ok(client) page = client.get(ALERTING).text for text in ("Host-Verzögerung in Minuten", "Sendelimit: Nachrichten pro Minute und Ziel", "Basis-URL dieser Oberfläche", "Baseline neu setzen", 'name="alerts_host_delay_minutes"', 'name="alerts_send_limit_per_minute"', 'name="ui_base_url"'): assert text in page, text assert f'data-test-url="{ALERTING}/baseline"' in page assert "Regel-Verzögerungen gelten nicht für Host-Alarme" in page def test_alerting_defaults_are_shown(client, admin): login_ok(client) page = client.get(ALERTING).text assert re.search(r'name="alerts_send_limit_per_minute" type="text" value="15"', page) assert re.search(r'name="alerts_host_delay_minutes" type="text" value="0"', page) def test_alerting_saves_new_values_and_strips_trailing_slash(client, app, admin): login_ok(client) form = alerting_form(alerts_host_delay_minutes="5", alerts_send_limit_per_minute="20", ui_base_url="https://bot.example.de/") assert post(client, ALERTING, ALERTING, **form).status_code == 303 store = app.state.store assert store.get_int("alerts.host_delay_minutes", 0) == 5 assert store.get_int("alerts.send_limit_per_minute", 15) == 20 assert store.get("ui.base_url") == "https://bot.example.de" def test_alerting_rejects_invalid_new_values(client, app, admin): login_ok(client) for override in ({"alerts_host_delay_minutes": "1441"}, {"alerts_host_delay_minutes": "-1"}, {"alerts_host_delay_minutes": "abc"}, {"alerts_send_limit_per_minute": "0"}, {"alerts_send_limit_per_minute": "61"}, {"alerts_send_limit_per_minute": "1.5"}, {"ui_base_url": "ftp://bot.example.de"}, {"ui_base_url": "bot.example.de"}, {"ui_base_url": "https://bot example.de"}, {"ui_base_url": "https://bot.example.de/?a=1"}, {"ui_base_url": "https://bot.example.de/#x"}, {"ui_base_url": "javascript:alert(1)"}, {"ui_base_url": "https://" + "a" * 200}): response = post(client, ALERTING, ALERTING, **alerting_form(**override)) assert response.status_code == 422, override assert app.state.store.get("ui.base_url") in (None, "") def test_empty_base_url_clears_the_link(client, app, admin): login_ok(client) post(client, ALERTING, ALERTING, **alerting_form(ui_base_url="https://bot.example.de")) post(client, ALERTING, ALERTING, **alerting_form(ui_base_url="")) assert not app.state.store.get("ui.base_url") def test_content_mode_select_on_telegram_and_matrix(client, app, admin): login_ok(client) for slug, key in (("telegram", "telegram.content_mode"), ("matrix", "matrix.content_mode")): page = client.get(f"/settings/{slug}").text field = f"{slug}_content_mode" assert f'