154 lines
5.2 KiB
Python
154 lines
5.2 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from sqlalchemy import create_engine, select
|
|
from sqlalchemy.orm import Session, sessionmaker
|
|
|
|
from govoplan_core.core.configuration_packages import (
|
|
ConfigurationExportSelection,
|
|
ConfigurationPackageFragment,
|
|
ConfigurationPreflightContext,
|
|
)
|
|
from govoplan_core.db.base import Base
|
|
from govoplan_workflow_engine.backend.configuration_provider import (
|
|
WORKFLOW_DEFINITIONS_FRAGMENT,
|
|
apply_workflow_definitions,
|
|
export_workflow_definitions,
|
|
preflight_workflow_definitions,
|
|
)
|
|
from govoplan_workflow_engine.backend.db.models import (
|
|
WorkflowDefinition,
|
|
WorkflowDefinitionRevision,
|
|
)
|
|
|
|
|
|
def fragment(*, label: str = "Review request") -> ConfigurationPackageFragment:
|
|
return ConfigurationPackageFragment(
|
|
module_id="workflow_engine",
|
|
fragment_type=WORKFLOW_DEFINITIONS_FRAGMENT,
|
|
fragment_id="permit-workflows",
|
|
payload={
|
|
"origin_module_id": "permits",
|
|
"origin_module_version": "1.0.0",
|
|
"items": [
|
|
{
|
|
"definition_key": "permit-review",
|
|
"name": "Permit review",
|
|
"scope_type": "system",
|
|
"graph": {
|
|
"schema_version": 1,
|
|
"nodes": [
|
|
{
|
|
"id": "start",
|
|
"type": "workflow.start.manual",
|
|
"label": "Start",
|
|
"config": {"input_schema_ref": ""},
|
|
},
|
|
{
|
|
"id": "review",
|
|
"type": "workflow.activity",
|
|
"label": label,
|
|
"config": {
|
|
"title": label,
|
|
"instructions": "",
|
|
"assignee": "",
|
|
"due_after": "",
|
|
},
|
|
},
|
|
{
|
|
"id": "done",
|
|
"type": "workflow.end.completed",
|
|
"label": "Done",
|
|
"config": {"output_mapping": {}},
|
|
},
|
|
],
|
|
"edges": [
|
|
{
|
|
"id": "start-review",
|
|
"source": "start",
|
|
"target": "review",
|
|
},
|
|
{"id": "review-done", "source": "review", "target": "done"},
|
|
],
|
|
},
|
|
},
|
|
],
|
|
},
|
|
)
|
|
|
|
|
|
class WorkflowConfigurationProviderTests(unittest.TestCase):
|
|
def setUp(self) -> None:
|
|
self.engine = create_engine("sqlite:///:memory:")
|
|
Base.metadata.create_all(
|
|
self.engine,
|
|
tables=[
|
|
WorkflowDefinition.__table__,
|
|
WorkflowDefinitionRevision.__table__,
|
|
],
|
|
)
|
|
self.Session = sessionmaker(bind=self.engine)
|
|
self.session: Session = self.Session()
|
|
self.context = ConfigurationPreflightContext(
|
|
installed_modules={"workflow_engine": "0.1.14"},
|
|
)
|
|
|
|
def tearDown(self) -> None:
|
|
self.session.close()
|
|
Base.metadata.drop_all(
|
|
self.engine,
|
|
tables=[
|
|
WorkflowDefinitionRevision.__table__,
|
|
WorkflowDefinition.__table__,
|
|
],
|
|
)
|
|
self.engine.dispose()
|
|
|
|
def test_fragment_preflight_apply_update_and_export(self) -> None:
|
|
initial = preflight_workflow_definitions(
|
|
self.session,
|
|
fragment(),
|
|
self.context,
|
|
)
|
|
created = apply_workflow_definitions(
|
|
self.session,
|
|
fragment(),
|
|
self.context,
|
|
registry=None,
|
|
)
|
|
repeated = apply_workflow_definitions(
|
|
self.session,
|
|
fragment(),
|
|
self.context,
|
|
registry=None,
|
|
)
|
|
updated = apply_workflow_definitions(
|
|
self.session,
|
|
fragment(label="Review corrected request"),
|
|
self.context,
|
|
registry=None,
|
|
)
|
|
exported = export_workflow_definitions(
|
|
self.session,
|
|
ConfigurationExportSelection(scopes=("system",)),
|
|
)
|
|
|
|
definition = self.session.scalar(select(WorkflowDefinition))
|
|
assert definition is not None
|
|
self.assertEqual("create", initial.plan[0].action)
|
|
self.assertIn("permit-review", created.created_refs)
|
|
self.assertFalse(repeated.created_refs)
|
|
self.assertFalse(repeated.updated_refs)
|
|
self.assertIn("permit-review", updated.updated_refs)
|
|
self.assertEqual(2, definition.current_revision)
|
|
self.assertEqual("workflow_definitions", exported.fragments[0].fragment_type)
|
|
self.assertEqual(
|
|
"permit-review",
|
|
exported.fragments[0].payload["items"][0]["definition_key"],
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|