"""Pydantic schemas for TestTemplate endpoints.""" import uuid from datetime import datetime from pydantic import BaseModel, ConfigDict # ── Full output ───────────────────────────────────────────────────── class TestTemplateOut(BaseModel): """Complete representation of a test template.""" id: uuid.UUID mitre_technique_id: str name: str description: str | None = None source: str source_url: str | None = None attack_procedure: str | None = None expected_detection: str | None = None platform: str | None = None tool_suggested: str | None = None severity: str | None = None atomic_test_id: str | None = None is_active: bool = True created_at: datetime | None = None model_config = ConfigDict(from_attributes=True) # ── Create ────────────────────────────────────────────────────────── class TestTemplateCreate(BaseModel): """Payload for creating a custom test template.""" mitre_technique_id: str name: str description: str | None = None source: str = "custom" source_url: str | None = None attack_procedure: str | None = None expected_detection: str | None = None platform: str | None = None tool_suggested: str | None = None severity: str | None = None atomic_test_id: str | None = None # ── Summary (for listings) ───────────────────────────────────────── class TestTemplateSummary(BaseModel): """Lightweight representation for listing templates.""" id: uuid.UUID mitre_technique_id: str name: str source: str platform: str | None = None severity: str | None = None model_config = ConfigDict(from_attributes=True) # ── Instantiate (create a real Test from a template) ──────────────── class TestTemplateInstantiate(BaseModel): """Payload to create a real test from an existing template.""" template_id: uuid.UUID technique_id: uuid.UUID