Add backend monitor and notification tests

This commit is contained in:
Keith Smith
2026-05-23 16:14:38 -06:00
parent 5c9f93692a
commit 68d5e0a705
4 changed files with 207 additions and 2 deletions
+74
View File
@@ -0,0 +1,74 @@
from fastapi.testclient import TestClient
from sqlalchemy import select
from sqlalchemy.orm import Session
from app.models import AlertRule, Asset, Monitor
def test_create_website_monitor_creates_asset_and_alert_rule(client: TestClient, db_session: Session) -> None:
response = client.post(
"/monitors/website",
json={
"name": "Example Site",
"url": "https://example.com",
"expected_status": 200,
"expected_text": "Example Domain",
"unexpected_text": None,
"timeout_seconds": 7,
"check_tls_expiry": True,
"tls_warning_days": 45,
"interval_seconds": 60,
"create_asset": True,
"alert_enabled": True,
"alert_severity": "critical",
"failure_threshold": 2,
},
)
assert response.status_code == 200
body = response.json()
assert body["name"] == "Example Site"
assert body["monitor_type"] == "http"
assert body["target"] == "https://example.com"
assert body["config"]["check_tls_expiry"] is True
assert body["config"]["tls_warning_days"] == 45
monitor = db_session.get(Monitor, body["id"])
assert monitor is not None
assert monitor.asset_id is not None
asset = db_session.get(Asset, monitor.asset_id)
assert asset is not None
assert asset.name == "Example Site"
assert asset.asset_type == "website"
assert asset.address == "https://example.com"
rule = db_session.scalar(select(AlertRule).where(AlertRule.monitor_id == monitor.id))
assert rule is not None
assert rule.name == "Example Site website failure"
assert rule.severity == "critical"
assert rule.condition == {"type": "status_not_up"}
assert rule.failure_threshold == 2
assert rule.cooldown_seconds == 300
assert rule.is_enabled is True
def test_create_website_monitor_can_skip_default_alert_rule(client: TestClient, db_session: Session) -> None:
response = client.post(
"/monitors/website",
json={
"name": "Status Only",
"url": "https://status.example.com",
"interval_seconds": 120,
"create_asset": False,
"alert_enabled": False,
},
)
assert response.status_code == 200
body = response.json()
monitor = db_session.get(Monitor, body["id"])
assert monitor is not None
assert monitor.asset_id is None
assert db_session.scalars(select(AlertRule).where(AlertRule.monitor_id == monitor.id)).all() == []