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