"""Analytics and advanced metrics API tests (FASE-2.5, 2.6).""" import uuid from app.models.technique import Technique from app.models.test import Test from app.models.enums import TestState def test_analytics_coverage_flat_json(client, auth_headers, db): t = Technique(mitre_id="T1001", name="Test Tech", tactic="discovery") db.add(t) db.commit() r = client.get("/api/v1/analytics/coverage", headers=auth_headers) assert r.status_code == 200 data = r.json() assert isinstance(data, list) assert any(row["mitre_id"] == "T1001" for row in data) assert "tactic" in data[0] assert "status" in data[0] def test_analytics_tests_date_filter(client, auth_headers, db, admin_user): technique = Technique(mitre_id="T1002", name="Filter Tech", tactic="impact") db.add(technique) db.flush() db.add( Test( name="dated test", technique_id=technique.id, state=TestState.draft, created_by=admin_user.id, ), ) db.commit() r = client.get( "/api/v1/analytics/tests", params={"date_from": "2020-01-01"}, headers=auth_headers, ) assert r.status_code == 200 assert isinstance(r.json(), list) def test_analytics_operators_requires_admin(client, auth_headers, red_tech_headers): client.cookies.clear() denied = client.get("/api/v1/analytics/operators", headers=red_tech_headers) assert denied.status_code == 403 client.cookies.clear() ok = client.get("/api/v1/analytics/operators", headers=auth_headers) assert ok.status_code == 200 assert isinstance(ok.json(), list) def test_coverage_by_tactic(client, auth_headers, db): db.add(Technique(mitre_id="T2001", name="A", tactic="initial-access")) db.add(Technique(mitre_id="T2002", name="B", tactic="initial-access")) db.commit() r = client.get("/api/v1/metrics/advanced/coverage-by-tactic", headers=auth_headers) assert r.status_code == 200 rows = r.json() assert isinstance(rows, list) ia = next((x for x in rows if x["tactic"] == "initial-access"), None) assert ia is not None assert ia["total"] >= 2 assert "coverage_pct" in ia def test_never_tested_lists_untested_technique(client, auth_headers, db): db.add(Technique(mitre_id="T9999", name="Never Run", tactic="collection")) db.commit() r = client.get("/api/v1/metrics/advanced/never-tested", headers=auth_headers) assert r.status_code == 200 keys = {row["mitre_id"] for row in r.json()} assert "T9999" in keys def test_avg_validation_time_empty(client, auth_headers): r = client.get("/api/v1/metrics/advanced/avg-validation-time", headers=auth_headers) assert r.status_code == 200 body = r.json() assert body["total_validated"] == 0