feat(campaign): complete reusable template workflow

This commit is contained in:
2026-08-19 21:56:08 +02:00
parent 14e94873a9
commit b6af7665f4
11 changed files with 294 additions and 14 deletions
+24 -1
View File
@@ -3,7 +3,10 @@ from __future__ import annotations
from datetime import UTC, datetime
from govoplan_campaign.backend.integrations import TemplatesCampaignIntegration
from govoplan_campaign.backend.routes.campaigns import _campaign_content_library_item
from govoplan_campaign.backend.routes.campaigns import (
_campaign_content_library_item,
_campaign_content_required_fields,
)
from govoplan_campaign.backend.schemas import CampaignContentLibrarySaveRequest
from govoplan_core.core.templates import (
TemplateContentDraftRequest,
@@ -109,6 +112,26 @@ def test_campaign_content_payload_keeps_revision_and_declared_target() -> None:
assert payload["text"] == "Mit freundlichen Grussen"
assert payload["published"] is True
assert payload["revision"] == 3
assert payload["required_fields"] == []
def test_campaign_content_required_fields_are_normalized_and_deduplicated() -> None:
payload = CampaignContentLibrarySaveRequest(
name="Greeting",
kind="campaign_part",
subject="Hello {{ local:display_name }}",
text="Reference ${global.case_reference}; hello {{local::display_name}}",
html="<p>{{fields.salutation}} {{local:to[2].email}} {{unsupported namespace}}</p>",
)
requirements = _campaign_content_required_fields(payload)
assert [item.path for item in requirements] == [
"global.case_reference",
"local.display_name",
"local.to.2.email",
"salutation",
]
def test_content_save_request_rejects_empty_selected_fragment() -> None: