|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- from unittest.mock import MagicMock
-
- import pytest
- from sqlalchemy.orm import Session
-
- from models.model import App
- from models.workflow import Workflow
- from services.workflow_service import DraftWorkflowDeletionError, WorkflowInUseError, WorkflowService
-
-
- @pytest.fixture
- def workflow_setup():
- workflow_service = WorkflowService()
- session = MagicMock(spec=Session)
- tenant_id = "test-tenant-id"
- workflow_id = "test-workflow-id"
-
- # Mock workflow
- workflow = MagicMock(spec=Workflow)
- workflow.id = workflow_id
- workflow.tenant_id = tenant_id
- workflow.version = "1.0" # Not a draft
- workflow.tool_published = False # Not published as a tool by default
-
- # Mock app
- app = MagicMock(spec=App)
- app.id = "test-app-id"
- app.name = "Test App"
- app.workflow_id = None # Not used by an app by default
-
- return {
- "workflow_service": workflow_service,
- "session": session,
- "tenant_id": tenant_id,
- "workflow_id": workflow_id,
- "workflow": workflow,
- "app": app,
- }
-
-
- def test_delete_workflow_success(workflow_setup):
- # Setup mocks
- workflow_setup["session"].scalar = MagicMock(
- side_effect=[workflow_setup["workflow"], None]
- ) # Return workflow first, then None for app
-
- # Call the method
- result = workflow_setup["workflow_service"].delete_workflow(
- session=workflow_setup["session"],
- workflow_id=workflow_setup["workflow_id"],
- tenant_id=workflow_setup["tenant_id"],
- )
-
- # Verify
- assert result is True
- workflow_setup["session"].delete.assert_called_once_with(workflow_setup["workflow"])
-
-
- def test_delete_workflow_draft_error(workflow_setup):
- # Setup mocks
- workflow_setup["workflow"].version = "draft"
- workflow_setup["session"].scalar = MagicMock(return_value=workflow_setup["workflow"])
-
- # Call the method and verify exception
- with pytest.raises(DraftWorkflowDeletionError):
- workflow_setup["workflow_service"].delete_workflow(
- session=workflow_setup["session"],
- workflow_id=workflow_setup["workflow_id"],
- tenant_id=workflow_setup["tenant_id"],
- )
-
- # Verify
- workflow_setup["session"].delete.assert_not_called()
-
-
- def test_delete_workflow_in_use_by_app_error(workflow_setup):
- # Setup mocks
- workflow_setup["app"].workflow_id = workflow_setup["workflow_id"]
- workflow_setup["session"].scalar = MagicMock(
- side_effect=[workflow_setup["workflow"], workflow_setup["app"]]
- ) # Return workflow first, then app
-
- # Call the method and verify exception
- with pytest.raises(WorkflowInUseError) as excinfo:
- workflow_setup["workflow_service"].delete_workflow(
- session=workflow_setup["session"],
- workflow_id=workflow_setup["workflow_id"],
- tenant_id=workflow_setup["tenant_id"],
- )
-
- # Verify error message contains app name
- assert "Cannot delete workflow that is currently in use by app" in str(excinfo.value)
-
- # Verify
- workflow_setup["session"].delete.assert_not_called()
-
-
- def test_delete_workflow_published_as_tool_error(workflow_setup):
- # Setup mocks
- workflow_setup["workflow"].tool_published = True
- workflow_setup["session"].scalar = MagicMock(
- side_effect=[workflow_setup["workflow"], None]
- ) # Return workflow first, then None for app
-
- # Call the method and verify exception
- with pytest.raises(WorkflowInUseError) as excinfo:
- workflow_setup["workflow_service"].delete_workflow(
- session=workflow_setup["session"],
- workflow_id=workflow_setup["workflow_id"],
- tenant_id=workflow_setup["tenant_id"],
- )
-
- # Verify error message
- assert "Cannot delete workflow that is published as a tool" in str(excinfo.value)
-
- # Verify
- workflow_setup["session"].delete.assert_not_called()
|