"""Tests for escalation routes and schemas (escalation_routes.py).""" import pytest from unittest.mock import MagicMock from datetime import datetime from compliance.api.escalation_routes import ( EscalationCreate, EscalationUpdate, EscalationStatusUpdate, _row_to_dict, ) # ============================================================================= # Schema Tests — EscalationCreate # ============================================================================= class TestEscalationCreate: def test_minimal_valid(self): req = EscalationCreate(title="Test Eskalation") assert req.title == "Test Eskalation" assert req.priority == "medium" assert req.description is None assert req.category is None assert req.assignee is None def test_full_values(self): req = EscalationCreate( title="DSGVO-Verstoß", description="Datenleck entdeckt", priority="critical", category="dsgvo_breach", assignee="admin@example.com", reporter="user@example.com", source_module="incidents", ) assert req.title == "DSGVO-Verstoß" assert req.priority == "critical" assert req.category == "dsgvo_breach" assert req.source_module == "incidents" def test_serialization(self): req = EscalationCreate(title="Test", priority="high") data = req.model_dump(exclude_none=True) assert data["title"] == "Test" assert data["priority"] == "high" assert "description" not in data # ============================================================================= # Schema Tests — EscalationUpdate # ============================================================================= class TestEscalationUpdate: def test_empty_update(self): req = EscalationUpdate() data = req.model_dump(exclude_none=True) assert data == {} def test_partial_update(self): req = EscalationUpdate(assignee="new@example.com", priority="low") data = req.model_dump(exclude_none=True) assert data == {"assignee": "new@example.com", "priority": "low"} def test_title_update(self): req = EscalationUpdate(title="Aktualisierter Titel") data = req.model_dump(exclude_none=True) assert data["title"] == "Aktualisierter Titel" assert "priority" not in data # ============================================================================= # Schema Tests — EscalationStatusUpdate # ============================================================================= class TestEscalationStatusUpdate: def test_status_only(self): req = EscalationStatusUpdate(status="in_progress") assert req.status == "in_progress" assert req.resolved_at is None def test_with_resolved_at(self): ts = datetime(2026, 3, 1, 12, 0, 0) req = EscalationStatusUpdate(status="resolved", resolved_at=ts) assert req.status == "resolved" assert req.resolved_at == ts def test_closed_status(self): req = EscalationStatusUpdate(status="closed") assert req.status == "closed" # ============================================================================= # Helper Tests — _row_to_dict # ============================================================================= class TestRowToDict: def test_basic_conversion(self): row = MagicMock() row._mapping = {"id": "abc-123", "title": "Test", "priority": "medium"} result = _row_to_dict(row) assert result["id"] == "abc-123" assert result["title"] == "Test" assert result["priority"] == "medium" def test_datetime_serialized(self): ts = datetime(2026, 3, 1, 10, 0, 0) row = MagicMock() row._mapping = {"id": "abc", "created_at": ts} result = _row_to_dict(row) assert result["created_at"] == ts.isoformat() def test_none_values_preserved(self): row = MagicMock() row._mapping = {"id": "abc", "description": None, "resolved_at": None} result = _row_to_dict(row) assert result["description"] is None assert result["resolved_at"] is None