Add backend monitor and notification tests
This commit is contained in:
@@ -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() == []
|
||||
Reference in New Issue
Block a user