feat(reports): extend report generation service [FASE-2.3]

Add quarterly summary and technique detail builders with UUID-safe lookups and unit tests for purple campaign context.
This commit is contained in:
2026-05-18 14:00:42 +02:00
parent 96fdd9fa85
commit ed2c34ef28
2 changed files with 179 additions and 2 deletions

View File

@@ -0,0 +1,58 @@
"""Report generation service tests (FASE-2.3)."""
import uuid
from unittest.mock import patch
import pytest
from app.domain.exceptions import EntityNotFoundError
from app.models.campaign import Campaign, CampaignTest
from app.models.enums import TestState
from app.models.technique import Technique
from app.models.test import Test
@patch("app.services.report_generation_service.report_engine.generate_pdf")
def test_generate_purple_campaign_report_pdf(mock_pdf, db, admin_user):
mock_pdf.return_value = "/tmp/fake.pdf"
technique = Technique(
mitre_id="T1059.001",
name="PowerShell",
tactic="execution",
)
db.add(technique)
db.flush()
campaign = Campaign(name="Q1 Purple", description="Scope", status="active")
db.add(campaign)
db.flush()
test = Test(
name="PS test",
technique_id=technique.id,
state=TestState.validated,
created_by=admin_user.id,
)
db.add(test)
db.flush()
db.add(CampaignTest(campaign_id=campaign.id, test_id=test.id))
db.commit()
path = __import__(
"app.services.report_generation_service",
fromlist=["generate_purple_campaign_report"],
).generate_purple_campaign_report(db, str(campaign.id), "pdf")
assert path == "/tmp/fake.pdf"
mock_pdf.assert_called_once()
context = mock_pdf.call_args[0][1]
assert context["tests_validated"] == 1
assert len(context["tests"]) == 1
def test_generate_technique_detail_not_found(db):
from app.services.report_generation_service import generate_technique_detail_report
with pytest.raises(EntityNotFoundError):
generate_technique_detail_report(db, str(uuid.uuid4()), "html")