feat: enforce shared UI foundations and pin reference journey
Dependency Audit / dependency-audit (push) Successful in 1m57s
Deployment Installer / deployment-installer (push) Successful in 6s
Security Audit / security-audit (push) Successful in 12m24s

This commit is contained in:
2026-08-18 21:32:25 +02:00
parent a1b80eda27
commit e2f505eeab
11 changed files with 445 additions and 64 deletions
+52 -27
View File
@@ -2,6 +2,8 @@ from __future__ import annotations
from dataclasses import dataclass
from datetime import UTC, datetime, timedelta
import json
from pathlib import Path
from types import SimpleNamespace
import unittest
@@ -82,6 +84,11 @@ from govoplan_workflow_engine.backend.work_items import WorkflowWorkItemProvider
NOW = datetime(2026, 8, 1, 10, 0, tzinfo=UTC)
JOURNEY = json.loads(
(Path(__file__).parent / "fixtures/resident_parking_permit_journey.json").read_text(
encoding="utf-8"
)
)
def _service() -> ServiceDefinition:
@@ -89,24 +96,24 @@ def _service() -> ServiceDefinition:
reference=InstitutionalReference(
kind="service",
owner_module="portal",
object_id="permit",
object_id=JOURNEY["service"]["object_id"],
tenant_id="tenant-1",
version="5",
version=JOURNEY["service"]["version"],
),
key="permit.apply",
key=JOURNEY["service"]["key"],
temporal=TemporalRevision(
revision="5",
revision=JOURNEY["service"]["version"],
valid_from=NOW - timedelta(days=1),
valid_to=NOW + timedelta(days=1),
recorded_at=NOW - timedelta(days=2),
),
title="Apply for a permit",
audience=("resident",),
required_evidence_types=("application",),
title=JOURNEY["title"],
audience=(JOURNEY["service"]["audience"],),
required_evidence_types=tuple(JOURNEY["service"]["required_evidence_types"]),
bindings=(
ServiceBinding("capability", CAPABILITY_CASES_SERVICE_INTAKE),
ServiceBinding("case", "permit-application"),
ServiceBinding("workflow", "workflow:permit-review"),
ServiceBinding("case", JOURNEY["case"]["type_key"]),
ServiceBinding("workflow", "workflow:resident-parking-permit-review"),
),
publication_state="published",
)
@@ -230,8 +237,14 @@ class InstitutionalServiceJourneyTests(unittest.TestCase):
self.assertTrue(entries[0].available)
self.assertIs(definition, entries[0].definition)
self.assertEqual(definition.reference, plan.service_ref)
self.assertEqual("5", plan.context.service_ref.version)
self.assertEqual("workflow:permit-review", plan.workflow_refs[0])
self.assertEqual(JOURNEY["service"]["version"], plan.context.service_ref.version)
self.assertEqual("workflow:resident-parking-permit-review", plan.workflow_refs[0])
def test_reference_fixture_names_remaining_manual_target_evidence(self) -> None:
self.assertEqual("Anwohnerparkausweis", JOURNEY["title_de"])
self.assertEqual("de-DE", JOURNEY["locale"])
self.assertEqual(5, len(JOURNEY["acceptance"]["automated"]))
self.assertEqual(5, len(JOURNEY["acceptance"]["manual_or_target"]))
def test_portal_launches_exact_form_revision_and_persists_submission(self) -> None:
engine = create_engine("sqlite+pysqlite:///:memory:")
@@ -252,19 +265,19 @@ class InstitutionalServiceJourneyTests(unittest.TestCase):
reference=InstitutionalReference(
kind="form",
owner_module="forms",
object_id="permit-application",
object_id=JOURNEY["form"]["object_id"],
tenant_id="tenant-1",
version="3",
),
key="permit-application",
key=JOURNEY["form"]["object_id"],
temporal=TemporalRevision(
revision="3",
valid_from=NOW - timedelta(days=1),
valid_to=NOW + timedelta(days=1),
recorded_at=NOW - timedelta(days=2),
change_reason="Publish the permit application.",
change_reason="Publish the resident parking permit application.",
),
title="Permit application",
title=JOURNEY["title"],
fields=(
FormFieldDefinition(
key="applicant_name",
@@ -272,6 +285,18 @@ class InstitutionalServiceJourneyTests(unittest.TestCase):
required=True,
constraints={"min_length": 2},
),
FormFieldDefinition(
key="residence_address",
label="Primary residence address",
required=True,
constraints={"min_length": 5},
),
FormFieldDefinition(
key="licence_plate",
label="Vehicle licence plate",
required=True,
constraints={"min_length": 3},
),
),
publication_state="published",
allow_drafts=True,
@@ -286,18 +311,18 @@ class InstitutionalServiceJourneyTests(unittest.TestCase):
reference=InstitutionalReference(
kind="service",
owner_module="services",
object_id="permit",
object_id=JOURNEY["service"]["object_id"],
tenant_id="tenant-1",
version="6",
version=JOURNEY["service"]["version"],
),
key="permit.apply",
key=JOURNEY["service"]["key"],
temporal=TemporalRevision(
revision="6",
revision=JOURNEY["service"]["version"],
valid_from=NOW - timedelta(days=1),
valid_to=NOW + timedelta(days=1),
recorded_at=NOW - timedelta(days=2),
),
title="Apply for a permit",
title=JOURNEY["title"],
audience=("public",),
bindings=(binding,),
publication_state="published",
@@ -311,7 +336,7 @@ class InstitutionalServiceJourneyTests(unittest.TestCase):
reference=service.reference,
requested_at=NOW,
idempotency_key="portal-form-launch-1",
parameters={"applicant_name": "Ada Lovelace"},
parameters=JOURNEY["form"]["fields"],
)
replay = directory.launch_service(
session,
@@ -319,7 +344,7 @@ class InstitutionalServiceJourneyTests(unittest.TestCase):
reference=service.reference,
requested_at=NOW,
idempotency_key="portal-form-launch-1",
parameters={"applicant_name": "Ada Lovelace"},
parameters=JOURNEY["form"]["fields"],
)
instance = FormRuntimeService(registry).get_instance(
session,
@@ -348,7 +373,7 @@ class InstitutionalServiceJourneyTests(unittest.TestCase):
)
self.assertEqual(NOW, instance.definition_ref.valid_at)
self.assertEqual(service.reference, instance.service_ref)
self.assertEqual("Ada Lovelace", instance.values["applicant_name"])
self.assertEqual(JOURNEY["form"]["fields"], instance.values)
finally:
session.close()
engine.dispose()
@@ -392,7 +417,7 @@ class InstitutionalServiceJourneyTests(unittest.TestCase):
tenant_id="tenant-1",
actor_id="account-1",
payload=WorkflowDefinitionCreateRequest(
name="Permit decision",
name=JOURNEY["workflow"]["definition_name"],
graph=WorkflowGraph(
nodes=[
WorkflowNode(
@@ -403,8 +428,8 @@ class InstitutionalServiceJourneyTests(unittest.TestCase):
id="review",
type="workflow.activity",
config={
"title": "Decide the permit application",
"instructions": "Review the filed evidence and record the decision.",
"title": JOURNEY["workflow"]["work_item_title"],
"instructions": JOURNEY["workflow"]["instructions"],
"assignee": "account:account-1",
"due_after": "2d",
},
@@ -464,7 +489,7 @@ class InstitutionalServiceJourneyTests(unittest.TestCase):
self.assertEqual(1, work.total)
self.assertEqual(step_id, work.items[0].id)
self.assertEqual(
"Decide the permit application",
JOURNEY["workflow"]["work_item_title"],
work.items[0].title,
)
self.assertTrue(work.items[0].action_url.startswith("/workflow?"))