103 lines
3.0 KiB
Python
103 lines
3.0 KiB
Python
"""Tests for Phase 5 snapshot evolution and breakdown fields."""
|
|
|
|
from datetime import datetime, timedelta, timezone
|
|
|
|
from app.models.coverage_snapshot import CoverageSnapshot
|
|
from app.models.enums import TechniqueStatus
|
|
from app.models.technique import Technique
|
|
from app.services.snapshot_service import create_snapshot, get_coverage_evolution
|
|
|
|
|
|
def test_create_snapshot_includes_tactic_breakdown(db, admin_user):
|
|
tech = Technique(
|
|
mitre_id="T1059",
|
|
name="Command and Scripting Interpreter",
|
|
tactic="execution",
|
|
status_global=TechniqueStatus.validated,
|
|
)
|
|
db.add(tech)
|
|
db.commit()
|
|
|
|
snap = create_snapshot(db, name="Phase5 test", user_id=admin_user.id)
|
|
|
|
assert snap.by_tactic
|
|
assert "execution" in snap.by_tactic
|
|
assert snap.by_status
|
|
assert snap.coverage_percentage >= 0
|
|
assert snap.never_tested_count >= 0
|
|
|
|
|
|
def test_coverage_evolution_filters_by_months(db, admin_user):
|
|
now = datetime.now(timezone.utc)
|
|
old = CoverageSnapshot(
|
|
name="old",
|
|
organization_score=50.0,
|
|
total_techniques=10,
|
|
validated_count=5,
|
|
partial_count=1,
|
|
not_covered_count=1,
|
|
in_progress_count=1,
|
|
not_evaluated_count=2,
|
|
coverage_percentage=50.0,
|
|
by_tactic={"execution": {"total": 10, "validated": 5}},
|
|
by_status={"validated": 5},
|
|
stale_count=0,
|
|
never_tested_count=2,
|
|
created_by=admin_user.id,
|
|
)
|
|
old.created_at = now - timedelta(days=400)
|
|
recent = CoverageSnapshot(
|
|
name="recent",
|
|
organization_score=70.0,
|
|
total_techniques=10,
|
|
validated_count=7,
|
|
partial_count=1,
|
|
not_covered_count=0,
|
|
in_progress_count=1,
|
|
not_evaluated_count=1,
|
|
coverage_percentage=70.0,
|
|
by_tactic={"execution": {"total": 10, "validated": 7}},
|
|
by_status={"validated": 7},
|
|
stale_count=1,
|
|
never_tested_count=1,
|
|
created_by=admin_user.id,
|
|
)
|
|
db.add_all([old, recent])
|
|
db.commit()
|
|
|
|
evolution = get_coverage_evolution(db, months=6)
|
|
assert len(evolution) == 1
|
|
assert evolution[0]["org_score"] == 70.0
|
|
assert evolution[0]["coverage_pct"] == 70.0
|
|
assert evolution[0]["stale_count"] == 1
|
|
|
|
|
|
def test_evolution_endpoint(client, db, admin_user, admin_token):
|
|
snap = CoverageSnapshot(
|
|
name="api-evolution",
|
|
organization_score=60.0,
|
|
total_techniques=5,
|
|
validated_count=3,
|
|
partial_count=0,
|
|
not_covered_count=0,
|
|
in_progress_count=0,
|
|
not_evaluated_count=2,
|
|
coverage_percentage=60.0,
|
|
by_tactic={},
|
|
by_status={"validated": 3},
|
|
stale_count=0,
|
|
never_tested_count=2,
|
|
)
|
|
db.add(snap)
|
|
db.commit()
|
|
|
|
response = client.get(
|
|
"/api/v1/snapshots/evolution?months=12",
|
|
headers={"Authorization": f"Bearer {admin_token}"},
|
|
)
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert isinstance(data, list)
|
|
assert len(data) >= 1
|
|
assert "org_score" in data[0]
|