feat: add governed service workflow launcher

This commit is contained in:
2026-08-01 17:48:41 +02:00
parent 43c1f3fb72
commit 55f98d1b65
7 changed files with 272 additions and 1 deletions
+60
View File
@@ -1,6 +1,7 @@
from __future__ import annotations
from dataclasses import replace
from datetime import UTC, datetime, timedelta
import unittest
from sqlalchemy import create_engine
@@ -24,6 +25,13 @@ from govoplan_core.core.dataflows import (
CAPABILITY_DATAFLOW_RUN_LIFECYCLE,
DataflowRunDescriptor,
)
from govoplan_core.core.institutional import (
InstitutionalReference,
ServiceBinding,
ServiceDefinition,
ServiceLaunchRequest,
TemporalRevision,
)
from govoplan_core.db.base import Base
from govoplan_workflow_engine.backend.db.models import (
WorkflowDefinition,
@@ -55,6 +63,7 @@ from govoplan_workflow_engine.backend.service import (
activate_definition,
create_definition,
)
from govoplan_workflow_engine.backend.service_launcher import WorkflowServiceLauncher
try:
from test_bpmn import NATIVE_BPMN
except ModuleNotFoundError as exc:
@@ -496,6 +505,57 @@ class WorkflowInstanceServiceTests(unittest.TestCase):
),
)
def test_service_launcher_starts_and_replays_exact_active_workflow(self) -> None:
now = datetime.now(tz=UTC)
service_ref = InstitutionalReference(
kind="service",
owner_module="services",
object_id="monthly-service",
tenant_id="tenant-1",
version="3",
valid_at=now,
)
binding = ServiceBinding("workflow", self.definition.id)
definition = ServiceDefinition(
reference=service_ref,
key="monthly.processing",
temporal=TemporalRevision(
revision="3",
valid_from=now - timedelta(days=1),
recorded_at=now - timedelta(days=2),
change_reason="Published workflow service.",
),
title="Monthly processing",
audience=("authenticated",),
bindings=(binding,),
publication_state="published",
)
request = ServiceLaunchRequest(
service_ref=service_ref,
binding=binding,
idempotency_key="service-workflow-1",
requested_at=now,
parameters={"case_id": "case-1"},
)
launcher = WorkflowServiceLauncher(self.registry)
first = launcher.launch_service(
self.session,
principal(),
definition=definition,
request=request,
)
second = launcher.launch_service(
self.session,
principal(),
definition=definition,
request=request,
)
self.assertFalse(first.replayed)
self.assertTrue(second.replayed)
self.assertEqual(first.target_ref, second.target_ref)
def test_guided_workflow_rejects_automated_start_origin(self) -> None:
definition = create_definition(
self.session,