Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

test_workflow_deletion.py 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. from unittest.mock import MagicMock
  2. import pytest
  3. from sqlalchemy.orm import Session
  4. from models.model import App
  5. from models.workflow import Workflow
  6. from services.workflow_service import DraftWorkflowDeletionError, WorkflowInUseError, WorkflowService
  7. @pytest.fixture
  8. def workflow_setup():
  9. workflow_service = WorkflowService()
  10. session = MagicMock(spec=Session)
  11. tenant_id = "test-tenant-id"
  12. workflow_id = "test-workflow-id"
  13. # Mock workflow
  14. workflow = MagicMock(spec=Workflow)
  15. workflow.id = workflow_id
  16. workflow.tenant_id = tenant_id
  17. workflow.version = "1.0" # Not a draft
  18. workflow.tool_published = False # Not published as a tool by default
  19. # Mock app
  20. app = MagicMock(spec=App)
  21. app.id = "test-app-id"
  22. app.name = "Test App"
  23. app.workflow_id = None # Not used by an app by default
  24. return {
  25. "workflow_service": workflow_service,
  26. "session": session,
  27. "tenant_id": tenant_id,
  28. "workflow_id": workflow_id,
  29. "workflow": workflow,
  30. "app": app,
  31. }
  32. def test_delete_workflow_success(workflow_setup):
  33. # Setup mocks
  34. workflow_setup["session"].scalar = MagicMock(
  35. side_effect=[workflow_setup["workflow"], None]
  36. ) # Return workflow first, then None for app
  37. # Call the method
  38. result = workflow_setup["workflow_service"].delete_workflow(
  39. session=workflow_setup["session"],
  40. workflow_id=workflow_setup["workflow_id"],
  41. tenant_id=workflow_setup["tenant_id"],
  42. )
  43. # Verify
  44. assert result is True
  45. workflow_setup["session"].delete.assert_called_once_with(workflow_setup["workflow"])
  46. def test_delete_workflow_draft_error(workflow_setup):
  47. # Setup mocks
  48. workflow_setup["workflow"].version = "draft"
  49. workflow_setup["session"].scalar = MagicMock(return_value=workflow_setup["workflow"])
  50. # Call the method and verify exception
  51. with pytest.raises(DraftWorkflowDeletionError):
  52. workflow_setup["workflow_service"].delete_workflow(
  53. session=workflow_setup["session"],
  54. workflow_id=workflow_setup["workflow_id"],
  55. tenant_id=workflow_setup["tenant_id"],
  56. )
  57. # Verify
  58. workflow_setup["session"].delete.assert_not_called()
  59. def test_delete_workflow_in_use_by_app_error(workflow_setup):
  60. # Setup mocks
  61. workflow_setup["app"].workflow_id = workflow_setup["workflow_id"]
  62. workflow_setup["session"].scalar = MagicMock(
  63. side_effect=[workflow_setup["workflow"], workflow_setup["app"]]
  64. ) # Return workflow first, then app
  65. # Call the method and verify exception
  66. with pytest.raises(WorkflowInUseError) as excinfo:
  67. workflow_setup["workflow_service"].delete_workflow(
  68. session=workflow_setup["session"],
  69. workflow_id=workflow_setup["workflow_id"],
  70. tenant_id=workflow_setup["tenant_id"],
  71. )
  72. # Verify error message contains app name
  73. assert "Cannot delete workflow that is currently in use by app" in str(excinfo.value)
  74. # Verify
  75. workflow_setup["session"].delete.assert_not_called()
  76. def test_delete_workflow_published_as_tool_error(workflow_setup):
  77. # Setup mocks
  78. workflow_setup["workflow"].tool_published = True
  79. workflow_setup["session"].scalar = MagicMock(
  80. side_effect=[workflow_setup["workflow"], None]
  81. ) # Return workflow first, then None for app
  82. # Call the method and verify exception
  83. with pytest.raises(WorkflowInUseError) as excinfo:
  84. workflow_setup["workflow_service"].delete_workflow(
  85. session=workflow_setup["session"],
  86. workflow_id=workflow_setup["workflow_id"],
  87. tenant_id=workflow_setup["tenant_id"],
  88. )
  89. # Verify error message
  90. assert "Cannot delete workflow that is published as a tool" in str(excinfo.value)
  91. # Verify
  92. workflow_setup["session"].delete.assert_not_called()