"""Tests for Notfallplan routes and schemas (notfallplan_routes.py).""" import pytest from compliance.api.notfallplan_routes import ( ContactCreate, ContactUpdate, ScenarioCreate, ScenarioUpdate, ChecklistCreate, ExerciseCreate, ) # ============================================================================= # Schema Tests — ContactCreate # ============================================================================= class TestContactCreate: def test_minimal_valid(self): req = ContactCreate(name="Max Mustermann") assert req.name == "Max Mustermann" assert req.is_primary is False assert req.available_24h is False assert req.email is None assert req.phone is None def test_full_contact(self): req = ContactCreate( name="Anna Schmidt", role="DSB", email="anna@example.com", phone="+49 160 12345678", is_primary=True, available_24h=True, ) assert req.role == "DSB" assert req.is_primary is True assert req.available_24h is True def test_serialization(self): req = ContactCreate(name="Test Kontakt", role="IT-Leiter") data = req.model_dump(exclude_none=True) assert data["name"] == "Test Kontakt" assert data["role"] == "IT-Leiter" assert "email" not in data # ============================================================================= # Schema Tests — ContactUpdate # ============================================================================= class TestContactUpdate: def test_empty_update(self): req = ContactUpdate() data = req.model_dump(exclude_none=True) assert data == {} def test_partial_update(self): req = ContactUpdate(phone="+49 170 9876543", available_24h=True) data = req.model_dump(exclude_none=True) assert data == {"phone": "+49 170 9876543", "available_24h": True} # ============================================================================= # Schema Tests — ScenarioCreate # ============================================================================= class TestScenarioCreate: def test_minimal_valid(self): req = ScenarioCreate(title="Datenpanne") assert req.title == "Datenpanne" assert req.severity == "medium" assert req.is_active is True assert req.response_steps == [] def test_with_response_steps(self): steps = ["Schritt 1: Incident identifizieren", "Schritt 2: DSB informieren"] req = ScenarioCreate( title="Ransomware-Angriff", category="system_failure", severity="critical", response_steps=steps, estimated_recovery_time=48, ) assert req.category == "system_failure" assert req.severity == "critical" assert len(req.response_steps) == 2 assert req.estimated_recovery_time == 48 def test_full_serialization(self): req = ScenarioCreate( title="Phishing", category="data_breach", severity="high", description="Mitarbeiter wurde Opfer eines Phishing-Angriffs", ) data = req.model_dump(exclude_none=True) assert data["severity"] == "high" assert data["category"] == "data_breach" # ============================================================================= # Schema Tests — ScenarioUpdate # ============================================================================= class TestScenarioUpdate: def test_empty_update(self): req = ScenarioUpdate() data = req.model_dump(exclude_none=True) assert data == {} def test_severity_update(self): req = ScenarioUpdate(severity="low") data = req.model_dump(exclude_none=True) assert data == {"severity": "low"} def test_deactivate(self): req = ScenarioUpdate(is_active=False) data = req.model_dump(exclude_none=True) assert data["is_active"] is False # ============================================================================= # Schema Tests — ChecklistCreate # ============================================================================= class TestChecklistCreate: def test_minimal_valid(self): req = ChecklistCreate(title="DSB benachrichtigen") assert req.title == "DSB benachrichtigen" assert req.is_required is True assert req.order_index == 0 assert req.scenario_id is None def test_with_scenario_link(self): req = ChecklistCreate( title="IT-Team alarmieren", scenario_id="550e8400-e29b-41d4-a716-446655440000", order_index=1, is_required=True, ) assert req.scenario_id == "550e8400-e29b-41d4-a716-446655440000" assert req.order_index == 1 # ============================================================================= # Schema Tests — ExerciseCreate # ============================================================================= class TestExerciseCreate: def test_minimal_valid(self): req = ExerciseCreate(title="Jahresübung 2026") assert req.title == "Jahresübung 2026" assert req.participants == [] assert req.outcome is None def test_full_exercise(self): req = ExerciseCreate( title="Ransomware-Simulation", scenario_id="550e8400-e29b-41d4-a716-446655440000", participants=["Max Mustermann", "Anna Schmidt"], outcome="passed", notes="Übung verlief planmäßig", ) assert req.outcome == "passed" assert len(req.participants) == 2 assert req.notes == "Übung verlief planmäßig"