78 lines
2.7 KiB
Python
78 lines
2.7 KiB
Python
import pytest
|
|
|
|
from infrasynth.workflows.models import (
|
|
Transition,
|
|
Workflow,
|
|
WorkflowAwareModel,
|
|
WorkflowInstance,
|
|
WorkflowNode,
|
|
)
|
|
|
|
pytestmark = pytest.mark.django_db
|
|
|
|
|
|
@pytest.fixture
|
|
def workflow(user):
|
|
return Workflow.objects.create(slug="approval", name="Approval", created_by=user)
|
|
|
|
|
|
class TestWorkflow:
|
|
def test_create(self):
|
|
workflow = Workflow.objects.create(slug="approval", name="Approval")
|
|
assert workflow.is_active is True
|
|
assert str(workflow) == "Approval"
|
|
|
|
def test_unique_slug(self):
|
|
Workflow.objects.create(slug="approval", name="A")
|
|
with pytest.raises(Exception):
|
|
Workflow.objects.create(slug="approval", name="B")
|
|
|
|
|
|
class TestWorkflowNode:
|
|
def test_create(self, workflow):
|
|
node = WorkflowNode.objects.create(
|
|
workflow=workflow,
|
|
name="Start",
|
|
node_type=WorkflowNode.NodeType.START,
|
|
)
|
|
assert node.node_type == "start"
|
|
assert node.approval_strategy == "all"
|
|
assert node.min_approvals == 1
|
|
assert str(node) == "approval:Start"
|
|
|
|
def test_unique_name_per_workflow(self, workflow):
|
|
WorkflowNode.objects.create(workflow=workflow, name="A")
|
|
with pytest.raises(Exception):
|
|
WorkflowNode.objects.create(workflow=workflow, name="A")
|
|
|
|
|
|
class TestTransition:
|
|
def test_create(self, workflow):
|
|
start = WorkflowNode.objects.create(workflow=workflow, name="Start", node_type=WorkflowNode.NodeType.START)
|
|
end = WorkflowNode.objects.create(workflow=workflow, name="End", node_type=WorkflowNode.NodeType.END)
|
|
transition = Transition.objects.create(from_node=start, to_node=end, condition_slug="approved")
|
|
assert transition.from_node == start
|
|
assert transition.to_node == end
|
|
assert str(transition) == "approval:Start → approval:End"
|
|
|
|
|
|
class TestWorkflowInstance:
|
|
def test_default_status(self, workflow, user):
|
|
instance = WorkflowInstance.objects.create(workflow=workflow, owner=user)
|
|
assert instance.status == WorkflowInstance.Status.IN_PROGRESS
|
|
assert instance.completed_at is None
|
|
|
|
|
|
class TestWorkflowAwareModel:
|
|
def test_abstract_with_instance_fk(self):
|
|
from django.db.models import ForeignKey
|
|
|
|
assert WorkflowAwareModel._meta.abstract is True
|
|
field = WorkflowAwareModel._meta.get_field("workflow_instance")
|
|
assert isinstance(field, ForeignKey)
|
|
assert field.null is True
|
|
assert field.blank is True
|
|
|
|
def test_assignable_workflow_instance(self, workflow, user):
|
|
WorkflowInstance.objects.create(workflow=workflow, owner=user)
|
|
assert workflow.instances.count() == 1
|