79 lines
2.0 KiB
Python
79 lines
2.0 KiB
Python
"""Tests for stale coverage detection."""
|
|
|
|
from datetime import datetime, timedelta, timezone
|
|
|
|
from app.models.enums import TechniqueStatus, TestState
|
|
from app.models.technique import Technique
|
|
from app.models.test import Test
|
|
from app.services.stale_detection_service import STALE_THRESHOLD_DAYS, detect_stale_coverage
|
|
|
|
|
|
def _technique(db, *, mitre_id="T1059", status=TechniqueStatus.validated):
|
|
tech = Technique(
|
|
mitre_id=mitre_id,
|
|
name="Command and Scripting Interpreter",
|
|
tactic="execution",
|
|
status_global=status,
|
|
review_required=False,
|
|
)
|
|
db.add(tech)
|
|
db.commit()
|
|
db.refresh(tech)
|
|
return tech
|
|
|
|
|
|
def _validated_test(db, technique, *, days_ago: int):
|
|
validated_at = datetime.now(timezone.utc) - timedelta(days=days_ago)
|
|
test = Test(
|
|
technique_id=technique.id,
|
|
name="Coverage test",
|
|
state=TestState.validated,
|
|
red_validated_at=validated_at,
|
|
blue_validated_at=validated_at,
|
|
created_at=validated_at,
|
|
)
|
|
db.add(test)
|
|
db.commit()
|
|
return test
|
|
|
|
|
|
def test_stale_technique_flagged_after_threshold(db):
|
|
tech = _technique(db)
|
|
_validated_test(db, tech, days_ago=STALE_THRESHOLD_DAYS + 30)
|
|
|
|
count = detect_stale_coverage(db)
|
|
|
|
db.refresh(tech)
|
|
assert count == 1
|
|
assert tech.review_required is True
|
|
|
|
|
|
def test_recent_validated_technique_not_flagged(db):
|
|
tech = _technique(db)
|
|
_validated_test(db, tech, days_ago=30)
|
|
|
|
count = detect_stale_coverage(db)
|
|
|
|
db.refresh(tech)
|
|
assert count == 0
|
|
assert tech.review_required is False
|
|
|
|
|
|
def test_not_evaluated_never_tested_not_flagged(db):
|
|
tech = _technique(db, status=TechniqueStatus.not_evaluated)
|
|
|
|
count = detect_stale_coverage(db)
|
|
|
|
db.refresh(tech)
|
|
assert count == 0
|
|
assert tech.review_required is False
|
|
|
|
|
|
def test_stale_detection_idempotent(db):
|
|
tech = _technique(db, mitre_id="T1204")
|
|
_validated_test(db, tech, days_ago=STALE_THRESHOLD_DAYS + 60)
|
|
tech.review_required = True
|
|
db.commit()
|
|
|
|
assert detect_stale_coverage(db) == 0
|