diff --git a/api/tests/test_containers_integration_tests/repositories/test_sqlalchemy_api_workflow_run_repository.py b/api/tests/test_containers_integration_tests/repositories/test_sqlalchemy_api_workflow_run_repository.py index df11267842e..f08dd267975 100644 --- a/api/tests/test_containers_integration_tests/repositories/test_sqlalchemy_api_workflow_run_repository.py +++ b/api/tests/test_containers_integration_tests/repositories/test_sqlalchemy_api_workflow_run_repository.py @@ -86,6 +86,17 @@ def _create_workflow_run( return workflow_run +def _unpersisted_pause(*, workflow_id: str, workflow_run_id: str) -> WorkflowPauseEntity: + return _PrivateWorkflowPauseEntity( + pause_model=WorkflowPause( + workflow_id=workflow_id, + workflow_run_id=workflow_run_id, + state_object_key="unpersisted-state", + ), + reason_models=[], + ) + + def _cleanup_scope_data(session: Session, scope: _TestScope) -> None: """Remove test-created DB rows and storage objects for a test scope.""" @@ -736,8 +747,7 @@ class TestResumeWorkflowPause: test_scope, status=WorkflowExecutionStatus.RUNNING, ) - pause_entity = Mock(spec=WorkflowPauseEntity) - pause_entity.id = str(uuid4()) + pause_entity = _unpersisted_pause(workflow_id=test_scope.workflow_id, workflow_run_id=workflow_run.id) with pytest.raises(_WorkflowRunError, match="WorkflowRun is not in PAUSED status"): repository.resume_workflow_pause( @@ -769,8 +779,9 @@ class TestResumeWorkflowPause: assert pause_model is not None test_scope.state_keys.add(pause_model.state_object_key) - mismatched_pause_entity = Mock(spec=WorkflowPauseEntity) - mismatched_pause_entity.id = str(uuid4()) + mismatched_pause_entity = _unpersisted_pause( + workflow_id=test_scope.workflow_id, workflow_run_id=workflow_run.id + ) with pytest.raises(_WorkflowRunError, match="different id in WorkflowPause and WorkflowPauseEntity"): repository.resume_workflow_pause( @@ -819,8 +830,7 @@ class TestDeleteWorkflowPause: ) -> None: """Raise _WorkflowRunError when deleting a non-existent pause.""" - pause_entity = Mock(spec=WorkflowPauseEntity) - pause_entity.id = str(uuid4()) + pause_entity = _unpersisted_pause(workflow_id=str(uuid4()), workflow_run_id=str(uuid4())) with pytest.raises(_WorkflowRunError, match="WorkflowPause not found"): repository.delete_workflow_pause(pause_entity=pause_entity) diff --git a/api/tests/unit_tests/core/repositories/test_factory.py b/api/tests/unit_tests/core/repositories/test_factory.py index a98bdb3f93f..f795a965b03 100644 --- a/api/tests/unit_tests/core/repositories/test_factory.py +++ b/api/tests/unit_tests/core/repositories/test_factory.py @@ -14,9 +14,9 @@ from sqlalchemy.orm import Session, sessionmaker from core.repositories.factory import ( DifyCoreRepositoryFactory, RepositoryImportError, - WorkflowExecutionRepository, - WorkflowNodeExecutionRepository, ) +from core.repositories.sqlalchemy_workflow_execution_repository import SQLAlchemyWorkflowExecutionRepository +from core.repositories.sqlalchemy_workflow_node_execution_repository import SQLAlchemyWorkflowNodeExecutionRepository from libs.module_loading import import_string from models import Account, EndUser from models.enums import WorkflowRunTriggeredFrom @@ -76,10 +76,8 @@ class TestRepositoryFactory: app_id = "test-app-id" triggered_from = WorkflowRunTriggeredFrom.APP_RUN - # Create mock repository class and instance - mock_repository_class = MagicMock() - mock_repository_instance = MagicMock(spec=WorkflowExecutionRepository) - mock_repository_class.return_value = mock_repository_instance + # Record construction while creating the real SQLAlchemy repository. + mock_repository_class = MagicMock(wraps=SQLAlchemyWorkflowExecutionRepository) # Mock import_string with patch("core.repositories.factory.import_string", return_value=mock_repository_class, autospec=True): @@ -99,7 +97,7 @@ class TestRepositoryFactory: app_id=app_id, triggered_from=triggered_from, ) - assert result is mock_repository_instance + assert isinstance(result, SQLAlchemyWorkflowExecutionRepository) def test_create_workflow_execution_repository_import_error(self, sqlite_session_factory, config_overrides): """Test WorkflowExecutionRepository creation with import error.""" @@ -144,10 +142,8 @@ class TestRepositoryFactory: app_id = "test-app-id" triggered_from = WorkflowNodeExecutionTriggeredFrom.SINGLE_STEP - # Create mock repository class and instance - mock_repository_class = MagicMock() - mock_repository_instance = MagicMock(spec=WorkflowNodeExecutionRepository) - mock_repository_class.return_value = mock_repository_instance + # Record construction while creating the real SQLAlchemy repository. + mock_repository_class = MagicMock(wraps=SQLAlchemyWorkflowNodeExecutionRepository) # Mock import_string with patch("core.repositories.factory.import_string", return_value=mock_repository_class, autospec=True): @@ -167,7 +163,7 @@ class TestRepositoryFactory: app_id=app_id, triggered_from=triggered_from, ) - assert result is mock_repository_instance + assert isinstance(result, SQLAlchemyWorkflowNodeExecutionRepository) def test_create_workflow_node_execution_repository_import_error(self, sqlite_session_factory, config_overrides): """Test WorkflowNodeExecutionRepository creation with import error.""" @@ -218,10 +214,8 @@ class TestRepositoryFactory: app_id = "test-app-id" triggered_from = WorkflowRunTriggeredFrom.APP_RUN - # Create mock repository class and instance - mock_repository_class = MagicMock() - mock_repository_instance = MagicMock(spec=WorkflowExecutionRepository) - mock_repository_class.return_value = mock_repository_instance + # Record construction while creating the real SQLAlchemy repository. + mock_repository_class = MagicMock(wraps=SQLAlchemyWorkflowExecutionRepository) # Mock import_string with patch("core.repositories.factory.import_string", return_value=mock_repository_class, autospec=True): @@ -241,4 +235,4 @@ class TestRepositoryFactory: app_id=app_id, triggered_from=triggered_from, ) - assert result is mock_repository_instance + assert isinstance(result, SQLAlchemyWorkflowExecutionRepository) diff --git a/api/tests/unit_tests/extensions/test_ext_application_services.py b/api/tests/unit_tests/extensions/test_ext_application_services.py index 320b3eddca0..41ace4fbd1a 100644 --- a/api/tests/unit_tests/extensions/test_ext_application_services.py +++ b/api/tests/unit_tests/extensions/test_ext_application_services.py @@ -858,7 +858,7 @@ def test_build_application_services_groups_dataset_services_and_reuses_repositor database_client=sqlite_session_factory, deployment_edition=DeploymentEdition.COMMUNITY, initialization_password="", - redis=MagicMock(spec=RedisClientWrapper), + redis=_redis(), ) assert isinstance(services.data_sources.bindings, DataSourceBindingApplicationService) @@ -902,7 +902,7 @@ def test_build_application_services_wires_credential_query( database_client=sqlite_session_factory, deployment_edition=DeploymentEdition.COMMUNITY, initialization_password="", - redis=MagicMock(spec=RedisClientWrapper), + redis=_redis(), ) tenant_id, actor_id = str(uuid4()), str(uuid4()) with sqlite_session_factory.begin() as session: @@ -1004,7 +1004,7 @@ def test_build_application_services_reuses_installed_app_generation_dependencies database_client=sqlite_session_factory, deployment_edition=DeploymentEdition.COMMUNITY, initialization_password="", - redis=MagicMock(spec=RedisClientWrapper), + redis=_redis(), ) assert services.installed_apps.access._installed_apps is services.installed_apps.generation._usage