"""监控API测试:权限系统监控API端点验证 测试权限系统监控API的功能。 """ import pytest from fastapi.testclient import TestClient from app.core.permission_monitor import get_permission_monitor, set_permission_monitor, PermissionMonitor @pytest.mark.asyncio async def test_get_permission_metrics(client: TestClient, auth_headers: dict): """测试获取权限系统指标""" # 清除并重置监控器 monitor = PermissionMonitor() set_permission_monitor(monitor) # 记录一些指标 monitor.record_permission_check(allowed=True, elapsed_time=0.005) monitor.record_permission_check(allowed=False, elapsed_time=0.003) response = client.get("/api/v1/permission-monitoring/metrics", headers=auth_headers) assert response.status_code == 200 data = response.json() assert "check_metrics" in data assert "cache_metrics" in data assert data["check_metrics"]["total_checks"] == 2 @pytest.mark.asyncio async def test_get_cache_statistics(client: TestClient, auth_headers: dict): """测试获取缓存统计""" # 清除并重置监控器 monitor = PermissionMonitor() set_permission_monitor(monitor) # 记录缓存访问 monitor.record_cache_hit() monitor.record_cache_hit() monitor.record_cache_miss() response = client.get("/api/v1/permission-monitoring/cache-stats", headers=auth_headers) assert response.status_code == 200 data = response.json() assert "cache_metrics" in data assert data["cache_metrics"]["total_accesses"] == 3 assert data["cache_metrics"]["cache_hits"] == 2 @pytest.mark.asyncio async def test_get_alerts(client: TestClient, auth_headers: dict): """测试获取告警列表""" # 清除并重置监控器 monitor = PermissionMonitor() set_permission_monitor(monitor) # 生成告警 monitor.record_permission_check(allowed=True, elapsed_time=0.1) response = client.get("/api/v1/permission-monitoring/alerts", headers=auth_headers) assert response.status_code == 200 data = response.json() assert "alerts" in data assert data["total"] > 0 @pytest.mark.asyncio async def test_get_alerts_with_level_filter(client: TestClient, auth_headers: dict): """测试按级别过滤告警""" # 清除并重置监控器 monitor = PermissionMonitor() set_permission_monitor(monitor) # 生成告警 monitor.record_permission_check(allowed=True, elapsed_time=0.1) response = client.get( "/api/v1/permission-monitoring/alerts?level=warning", headers=auth_headers, ) assert response.status_code == 200 data = response.json() assert "alerts" in data @pytest.mark.asyncio async def test_get_alerts_with_limit(client: TestClient, auth_headers: dict): """测试限制告警数量""" # 清除并重置监控器 monitor = PermissionMonitor() set_permission_monitor(monitor) # 生成多个告警 for _ in range(20): monitor.record_permission_check(allowed=True, elapsed_time=0.1) response = client.get( "/api/v1/permission-monitoring/alerts?limit=5", headers=auth_headers, ) assert response.status_code == 200 data = response.json() assert len(data["alerts"]) <= 5 @pytest.mark.asyncio async def test_reset_metrics(client: TestClient, auth_headers: dict): """测试重置指标""" # 清除并重置监控器 monitor = PermissionMonitor() set_permission_monitor(monitor) # 记录指标 monitor.record_permission_check(allowed=True, elapsed_time=0.005) assert monitor.metrics.check_metrics.total_checks == 1 # 重置指标 response = client.post("/api/v1/permission-monitoring/reset-metrics", headers=auth_headers) assert response.status_code == 200 # 验证指标已重置 assert monitor.metrics.check_metrics.total_checks == 0 @pytest.mark.asyncio async def test_clear_alerts(client: TestClient, auth_headers: dict): """测试清除告警""" # 清除并重置监控器 monitor = PermissionMonitor() set_permission_monitor(monitor) # 生成告警 monitor.record_permission_check(allowed=True, elapsed_time=0.1) assert len(monitor.get_alerts()) > 0 # 清除告警 response = client.post("/api/v1/permission-monitoring/clear-alerts", headers=auth_headers) assert response.status_code == 200 # 验证告警已清除 assert len(monitor.get_alerts()) == 0 @pytest.mark.asyncio async def test_permission_system_health_healthy(client: TestClient, auth_headers: dict): """测试权限系统健康检查(健康状态)""" # 清除并重置监控器 monitor = PermissionMonitor() set_permission_monitor(monitor) # 记录良好的指标 for _ in range(100): monitor.record_permission_check(allowed=True, elapsed_time=0.001) for _ in range(100): monitor.record_cache_hit() response = client.get("/api/v1/permission-monitoring/health", headers=auth_headers) assert response.status_code == 200 data = response.json() assert data["status"] in ["healthy", "degraded"] assert data["health_score"] > 50 @pytest.mark.asyncio async def test_permission_system_health_degraded(client: TestClient, auth_headers: dict): """测试权限系统健康检查(降级状态)""" # 清除并重置监控器 monitor = PermissionMonitor() set_permission_monitor(monitor) # 记录不良的指标 for _ in range(100): monitor.record_permission_check(allowed=False, elapsed_time=0.1) for _ in range(100): monitor.record_cache_miss() response = client.get("/api/v1/permission-monitoring/health", headers=auth_headers) assert response.status_code == 200 data = response.json() assert "status" in data assert "health_score" in data assert "issues" in data @pytest.mark.asyncio async def test_permission_system_health_includes_metrics(client: TestClient, auth_headers: dict): """测试健康检查包含详细指标""" # 清除并重置监控器 monitor = PermissionMonitor() set_permission_monitor(monitor) response = client.get("/api/v1/permission-monitoring/health", headers=auth_headers) assert response.status_code == 200 data = response.json() assert "metrics" in data assert "cache_stats" in data assert "check_metrics" in data["metrics"] assert "cache_metrics" in data["metrics"]