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() == []