infrasynth-backend-kit/tests/test_workflows/test_models.py
2026-08-28 14:38:47 -05:00

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