feat: add governed service workflow launcher
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user