diff --git a/api/.ruff.toml b/api/.ruff.toml index 1bd4cf4bfd439a..b3e641ea856c1c 100644 --- a/api/.ruff.toml +++ b/api/.ruff.toml @@ -59,7 +59,6 @@ select = [ ignore = [ "E402", # module-import-not-at-top-of-file - "F841", # unused-variable "B901", # allow return in yield "B903", # class-as-data-structure "B904", # raise-without-from-inside-except diff --git a/api/controllers/console/app/annotation.py b/api/controllers/console/app/annotation.py index 897ba51d58ee69..906df17f4cd7cf 100644 --- a/api/controllers/console/app/annotation.py +++ b/api/controllers/console/app/annotation.py @@ -352,7 +352,6 @@ def post(self, req_data: CreateAnnotationPayload, session: Session, app_id: UUID @console_ns.response(204, "Annotations deleted successfully") @with_session def delete(self, session: Session, app_id: UUID): - # Use request.args.getlist to get annotation_ids array directly annotation_ids = request.args.getlist("annotation_id") diff --git a/api/controllers/console/app/audio.py b/api/controllers/console/app/audio.py index b5c6e6598d5f3c..5269fbcff18854 100644 --- a/api/controllers/console/app/audio.py +++ b/api/controllers/console/app/audio.py @@ -443,7 +443,7 @@ def _get_text_to_speech_voices(*, tenant_id: str, language: str): raise CompletionRequestError(e.description) except ValueError as e: raise e - except Exception as e: + except Exception: logger.exception("Failed to handle get request to TextModesApi") raise InternalServerError() diff --git a/api/controllers/console/app/completion.py b/api/controllers/console/app/completion.py index 254e5636dfb276..9c315b1e6e4a7d 100644 --- a/api/controllers/console/app/completion.py +++ b/api/controllers/console/app/completion.py @@ -205,7 +205,7 @@ def post(self, req_data: CompletionMessagePayload, session: Session, current_use raise CompletionRequestError(e.description) except ValueError as e: raise e - except Exception as e: + except Exception: logger.exception("internal server error.") raise InternalServerError() @@ -222,7 +222,6 @@ class CompletionMessageStopApi(Resource): @with_current_user_id @get_app_model(mode=AppMode.COMPLETION) def post(self, current_user_id: str, app_model: App, task_id: str): - AppTaskService.stop_task( task_id=task_id, invoke_from=InvokeFrom.DEBUGGER, @@ -589,7 +588,7 @@ def _generate_chat_message( raise CompletionRequestError(e.description) except ValueError as e: raise e - except Exception as e: + except Exception: logger.exception("internal server error.") raise InternalServerError() diff --git a/api/controllers/console/app/conversation.py b/api/controllers/console/app/conversation.py index 6b136bacb2d812..1117c818dbb695 100644 --- a/api/controllers/console/app/conversation.py +++ b/api/controllers/console/app/conversation.py @@ -111,7 +111,6 @@ class CompletionConversationApi(Resource): @get_app_model(mode=AppMode.COMPLETION) @model_validate(CompletionConversationQuery) def get(self, req_data: CompletionConversationQuery, session: Session, current_user: Account, app_model: App): - query = sa.select(Conversation).where( Conversation.app_id == app_model.id, Conversation.mode == "completion", Conversation.is_deleted.is_(False) ) @@ -241,7 +240,6 @@ class ChatConversationApi(Resource): @get_app_model(mode=[AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT, AppMode.AGENT]) @model_validate(ChatConversationQuery) def get(self, req_data: ChatConversationQuery, session: Session, current_user: Account, app_model: App): - subquery = ( sa.select(Conversation.id.label("conversation_id"), EndUser.session_id.label("from_end_user_session_id")) .outerjoin(EndUser, Conversation.from_end_user_id == EndUser.id) diff --git a/api/controllers/console/app/generator.py b/api/controllers/console/app/generator.py index eab25fc7e8fe2d..c565772dc12859 100644 --- a/api/controllers/console/app/generator.py +++ b/api/controllers/console/app/generator.py @@ -260,7 +260,6 @@ class RuleGenerateApi(Resource): @with_current_tenant_id @model_validate(RuleGeneratePayload) def post(self, req_data: RuleGeneratePayload, current_tenant_id: str): - try: rules = LLMGenerator.generate_rule_config(tenant_id=current_tenant_id, args=req_data) except ProviderTokenNotInitError as ex: @@ -294,7 +293,6 @@ class RuleCodeGenerateApi(Resource): @with_current_tenant_id @model_validate(RuleCodeGeneratePayload) def post(self, req_data: RuleCodeGeneratePayload, current_tenant_id: str): - try: code_result = LLMGenerator.generate_code( tenant_id=current_tenant_id, @@ -331,7 +329,6 @@ class RuleStructuredOutputGenerateApi(Resource): @with_current_tenant_id @model_validate(RuleStructuredOutputPayload) def post(self, req_data: RuleStructuredOutputPayload, current_tenant_id: str): - try: structured_output = LLMGenerator.generate_structured_output( tenant_id=current_tenant_id, @@ -545,7 +542,6 @@ class WorkflowGenerateApi(Resource): @with_current_tenant_id @model_validate(WorkflowGeneratePayload) def post(self, req_data: WorkflowGeneratePayload, current_tenant_id: str): - # Reject empty / over-length instructions at the boundary (shared with # the streaming endpoint) before spending a planner+builder roundtrip. guard = _workflow_instruction_guard(req_data) @@ -638,7 +634,6 @@ class WorkflowGenerateStreamApi(Resource): @with_current_tenant_id @model_validate(WorkflowGeneratePayload) def post(self, req_data: WorkflowGeneratePayload, current_tenant_id: str): - # Same boundary guards as the blocking endpoint — return a normal 400 # JSON for these BEFORE opening the stream. guard = _workflow_instruction_guard(req_data) diff --git a/api/controllers/console/app/message.py b/api/controllers/console/app/message.py index e2587abd70b556..56b0ead531232b 100644 --- a/api/controllers/console/app/message.py +++ b/api/controllers/console/app/message.py @@ -520,7 +520,6 @@ def _update_message_feedback( def _get_message_suggested_questions( *, context: RequestContext, app_id: str, app_mode: str, message_id: UUID ) -> dict[str, object]: - try: questions = application_services().message_suggested_questions.get_suggested_questions( app_id=app_id, diff --git a/api/controllers/console/app/workflow.py b/api/controllers/console/app/workflow.py index 156d5be5f4d054..596ed561196491 100644 --- a/api/controllers/console/app/workflow.py +++ b/api/controllers/console/app/workflow.py @@ -1867,7 +1867,7 @@ def post(self, current_user: Account, app_model: App, node_id: str): files=files, ) return jsonable_encoder(node_execution) - except Exception as e: + except Exception: logger.exception("Error running draft workflow trigger node") return jsonable_encoder( {"status": "error", "error": "An unexpected error occurred while running the node."} diff --git a/api/controllers/console/app/workflow_draft_variable.py b/api/controllers/console/app/workflow_draft_variable.py index 7b708b130344ee..a008d937eca58d 100644 --- a/api/controllers/console/app/workflow_draft_variable.py +++ b/api/controllers/console/app/workflow_draft_variable.py @@ -545,7 +545,6 @@ def get(self, current_user: Account, app_model: App): @get_app_model(mode=AppMode.ADVANCED_CHAT) @model_validate(ConversationVariableUpdatePayload) def post(self, req_data: ConversationVariableUpdatePayload, current_user: Account, app_model: App): - workflow_service = WorkflowService() conversation_variables_list = [ @@ -647,7 +646,6 @@ def get(self, _current_user: Account, app_model: App): @get_app_model(mode=[AppMode.ADVANCED_CHAT, AppMode.WORKFLOW]) @model_validate(EnvironmentVariableUpdatePayload) def post(self, req_data: EnvironmentVariableUpdatePayload, current_user: Account, app_model: App): - workflow_service = WorkflowService() environment_variables_list = [ diff --git a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py index c02db46f393bb2..63e40075eba4f5 100644 --- a/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py +++ b/api/controllers/console/datasets/rag_pipeline/rag_pipeline_workflow.py @@ -1148,7 +1148,6 @@ class RagPipelineRecommendedPluginApi(Resource): @with_current_tenant_id @model_validate(RagPipelineRecommendedPluginQuery) def get(self, req_data: RagPipelineRecommendedPluginQuery, current_tenant_id: str, current_user: Account): - rag_pipeline_service = RagPipelineService(db.session()) recommended_plugins = rag_pipeline_service.get_recommended_plugins( req_data.type, current_user, current_tenant_id diff --git a/api/controllers/console/workspace/endpoint.py b/api/controllers/console/workspace/endpoint.py index df8989e3fa102e..97f1a8009e8149 100644 --- a/api/controllers/console/workspace/endpoint.py +++ b/api/controllers/console/workspace/endpoint.py @@ -300,7 +300,6 @@ class EndpointListApi(Resource): @with_current_tenant_id @model_validate(EndpointListQuery) def get(self, req_data: EndpointListQuery, tenant_id: str, user_id: str): - endpoints = EndpointService.list_endpoints( tenant_id=tenant_id, user_id=user_id, @@ -330,7 +329,6 @@ class EndpointListForSinglePluginApi(Resource): @with_current_tenant_id @model_validate(EndpointListForPluginQuery) def get(self, req_data: EndpointListForPluginQuery, tenant_id: str, user_id: str): - endpoints = EndpointService.list_endpoints_for_single_plugin( tenant_id=tenant_id, user_id=user_id, diff --git a/api/controllers/console/workspace/models.py b/api/controllers/console/workspace/models.py index 759887ba5f9558..be4e120f33d3c6 100644 --- a/api/controllers/console/workspace/models.py +++ b/api/controllers/console/workspace/models.py @@ -216,7 +216,6 @@ class DefaultModelApi(Resource): @with_current_tenant_id @model_validate(ParserGetDefault) def get(self, req_data: ParserGetDefault, tenant_id: str): - model_provider_service = ModelProviderService() default_model_entity = model_provider_service.get_default_model_of_model_type( tenant_id=tenant_id, model_type=req_data.model_type @@ -323,7 +322,6 @@ def post(self, req_data: ParserPostModels, tenant_id: str, provider: str): @with_current_tenant_id @model_validate(ParserDeleteModels) def delete(self, req_data: ParserDeleteModels, tenant_id: str, provider: str): - model_provider_service = ModelProviderService() model_provider_service.remove_model( tenant_id=tenant_id, provider=provider, model=req_data.model, model_type=req_data.model_type @@ -349,7 +347,6 @@ class ModelProviderModelCredentialApi(Resource): @with_current_tenant_id @model_validate(ParserGetCredentials) def get(self, req_data: ParserGetCredentials, tenant_id: str, user: Account, provider: str): - model_provider_service = ModelProviderService() current_credential = model_provider_service.get_model_credential( tenant_id=tenant_id, @@ -412,7 +409,6 @@ def get(self, req_data: ParserGetCredentials, tenant_id: str, user: Account, pro @with_current_tenant_id @model_validate(ParserCreateCredential) def post(self, req_data: ParserCreateCredential, tenant_id: str, provider: str): - model_provider_service = ModelProviderService() try: @@ -445,7 +441,6 @@ def post(self, req_data: ParserCreateCredential, tenant_id: str, provider: str): @with_current_tenant_id @model_validate(ParserUpdateCredential) def put(self, req_data: ParserUpdateCredential, current_tenant_id: str, provider: str): - model_provider_service = ModelProviderService() try: @@ -473,7 +468,6 @@ def put(self, req_data: ParserUpdateCredential, current_tenant_id: str, provider @with_current_tenant_id @model_validate(ParserDeleteCredential) def delete(self, req_data: ParserDeleteCredential, current_tenant_id: str, provider: str): - model_provider_service = ModelProviderService() model_provider_service.remove_model_credential( tenant_id=current_tenant_id, @@ -498,7 +492,6 @@ class ModelProviderModelCredentialSwitchApi(Resource): @with_current_tenant_id @model_validate(ParserSwitch) def post(self, req_data: ParserSwitch, current_tenant_id: str, provider: str): - service = ModelProviderService() service.add_model_credential_to_model_list( tenant_id=current_tenant_id, @@ -523,7 +516,6 @@ class ModelProviderModelEnableApi(Resource): @rbac_permission_required(RBACCheck(RBACPermission.PLUGIN_PREFERENCES, Workspace())) @model_validate(ParserDeleteModels) def patch(self, req_data: ParserDeleteModels, tenant_id: str, provider: str): - model_provider_service = ModelProviderService() model_provider_service.enable_model( tenant_id=tenant_id, provider=provider, model=req_data.model, model_type=req_data.model_type @@ -545,7 +537,6 @@ class ModelProviderModelDisableApi(Resource): @rbac_permission_required(RBACCheck(RBACPermission.PLUGIN_PREFERENCES, Workspace())) @model_validate(ParserDeleteModels) def patch(self, req_data: ParserDeleteModels, tenant_id: str, provider: str): - model_provider_service = ModelProviderService() model_provider_service.disable_model( tenant_id=tenant_id, provider=provider, model=req_data.model, model_type=req_data.model_type @@ -577,7 +568,6 @@ class ModelProviderModelValidateApi(Resource): @with_current_tenant_id @model_validate(ParserValidate) def post(self, req_data: ParserValidate, tenant_id: str, provider: str): - model_provider_service = ModelProviderService() result = True @@ -615,7 +605,6 @@ class ModelProviderModelParameterRuleApi(Resource): @with_current_tenant_id @model_validate(ParserParameter) def get(self, req_data: ParserParameter, tenant_id: str, provider: str): - model_provider_service = ModelProviderService() parameter_rules = model_provider_service.get_model_parameter_rules( tenant_id=tenant_id, provider=provider, model=req_data.model diff --git a/api/controllers/console/workspace/plugin.py b/api/controllers/console/workspace/plugin.py index 519c8a6017521d..643097a1617c5f 100644 --- a/api/controllers/console/workspace/plugin.py +++ b/api/controllers/console/workspace/plugin.py @@ -688,7 +688,6 @@ class PluginListLatestVersionsApi(Resource): @account_initialization_required @model_validate(ParserLatest) def post(self, req_data: ParserLatest): - try: versions = PluginService.list_latest_versions(req_data.plugin_ids) except PluginDaemonClientSideError as e: @@ -708,7 +707,6 @@ class PluginListInstallationsFromIdsApi(Resource): @with_current_tenant_id @model_validate(ParserLatest) def post(self, req_data: ParserLatest, tenant_id: str): - try: plugins = PluginService.list_installations_from_ids(tenant_id, req_data.plugin_ids) except PluginDaemonClientSideError as e: @@ -725,7 +723,6 @@ class PluginIconApi(Resource): @setup_required @model_validate(ParserIcon) def get(self, req_data: ParserIcon): - try: icon_bytes, mimetype = PluginService.get_asset(req_data.tenant_id, req_data.filename) except PluginDaemonClientSideError as e: @@ -746,7 +743,6 @@ class PluginAssetApi(Resource): @with_current_tenant_id @model_validate(ParserAsset) def get(self, req_data: ParserAsset, tenant_id: str): - try: binary = PluginService.extract_asset(tenant_id, req_data.plugin_unique_identifier, req_data.file_name) return send_file(io.BytesIO(binary), mimetype="application/octet-stream") @@ -789,7 +785,6 @@ class PluginUploadFromGithubApi(Resource): @with_current_tenant_id @model_validate(ParserGithubUpload) def post(self, req_data: ParserGithubUpload, tenant_id: str): - try: response = PluginService.upload_pkg_from_github( tenant_id, req_data.repo, req_data.version, req_data.package @@ -833,7 +828,6 @@ class PluginInstallFromPkgApi(Resource): @with_current_tenant_id @model_validate(ParserPluginIdentifiers) def post(self, req_data: ParserPluginIdentifiers, tenant_id: str): - try: response = PluginService.install_from_local_pkg(tenant_id, req_data.plugin_unique_identifiers) except PluginDaemonClientSideError as e: @@ -855,7 +849,6 @@ class PluginInstallFromGithubApi(Resource): @with_current_tenant_id @model_validate(ParserGithubInstall) def post(self, req_data: ParserGithubInstall, tenant_id: str): - try: response = PluginService.install_from_github( tenant_id, @@ -883,7 +876,6 @@ class PluginInstallFromMarketplaceApi(Resource): @with_current_tenant_id @model_validate(ParserPluginIdentifiers) def post(self, req_data: ParserPluginIdentifiers, tenant_id: str): - try: response = PluginService.install_from_marketplace_pkg(tenant_id, req_data.plugin_unique_identifiers) except PluginDaemonClientSideError as e: @@ -905,7 +897,6 @@ class PluginFetchMarketplacePkgApi(Resource): @with_current_tenant_id @model_validate(ParserPluginIdentifierQuery) def get(self, req_data: ParserPluginIdentifierQuery, tenant_id: str): - try: return jsonable_encoder( { @@ -932,7 +923,6 @@ class PluginFetchManifestApi(Resource): @with_current_tenant_id @model_validate(ParserPluginIdentifierQuery) def get(self, req_data: ParserPluginIdentifierQuery, tenant_id: str): - try: return jsonable_encoder( { @@ -957,7 +947,6 @@ class PluginFetchInstallTasksApi(Resource): @with_current_tenant_id @model_validate(ParserTasks) def get(self, req_data: ParserTasks, tenant_id: str): - try: return jsonable_encoder( {"tasks": PluginService.fetch_install_tasks(tenant_id, req_data.page, req_data.page_size)} @@ -1043,7 +1032,6 @@ class PluginUpgradeFromMarketplaceApi(Resource): @with_current_tenant_id @model_validate(ParserMarketplaceUpgrade) def post(self, req_data: ParserMarketplaceUpgrade, tenant_id: str): - try: return jsonable_encoder( PluginService.upgrade_plugin_with_marketplace( @@ -1067,7 +1055,6 @@ class PluginUpgradeFromGithubApi(Resource): @with_current_tenant_id @model_validate(ParserGithubUpgrade) def post(self, req_data: ParserGithubUpgrade, tenant_id: str): - try: return jsonable_encoder( PluginService.upgrade_plugin_with_github( @@ -1096,7 +1083,6 @@ class PluginUninstallApi(Resource): @with_current_tenant_id @model_validate(ParserUninstall) def post(self, req_data: ParserUninstall, tenant_id: str): - try: return { "success": PluginService.uninstall( @@ -1171,7 +1157,6 @@ class PluginFetchDynamicSelectOptionsApi(Resource): @with_current_tenant_id @model_validate(ParserDynamicOptions) def get(self, req_data: ParserDynamicOptions, tenant_id: str, current_user: Account): - try: options = PluginParameterService.get_dynamic_select_options( tenant_id=tenant_id, diff --git a/api/controllers/console/workspace/tool_providers.py b/api/controllers/console/workspace/tool_providers.py index 46e837ad02997d..c55023ab353027 100644 --- a/api/controllers/console/workspace/tool_providers.py +++ b/api/controllers/console/workspace/tool_providers.py @@ -527,7 +527,6 @@ class ToolBuiltinProviderListToolsApi(Resource): @account_initialization_required @with_current_tenant_id def get(self, tenant_id: str, provider: str): - return dump_response( ToolApiListResponse, BuiltinToolManageService.list_builtin_tool_provider_tools( @@ -549,7 +548,6 @@ class ToolBuiltinProviderInfoApi(Resource): @account_initialization_required @with_current_tenant_id def get(self, tenant_id: str, provider: str): - return _dump_tool_provider_payload( BuiltinToolManageService.get_builtin_tool_provider_info(tenant_id, provider).to_dict() ) @@ -571,7 +569,6 @@ class ToolBuiltinProviderDeleteApi(Resource): @with_current_tenant_id @model_validate(BuiltinToolCredentialDeletePayload) def post(self, req_data: BuiltinToolCredentialDeletePayload, tenant_id: str, provider: str): - return dump_response( SimpleResultResponse, BuiltinToolManageService.delete_builtin_tool_provider( @@ -855,7 +852,6 @@ class ToolBuiltinProviderCredentialsSchemaApi(Resource): @account_initialization_required @with_current_tenant_id def get(self, tenant_id: str, provider, credential_type): - return dump_response( ProviderConfigListResponse, BuiltinToolManageService.list_builtin_provider_credentials_schema( @@ -1075,7 +1071,6 @@ class ToolApiListApi(Resource): @account_initialization_required @with_current_tenant_id def get(self, tenant_id: str): - return _dump_tool_provider_payload_list( [ provider.to_dict() @@ -1604,7 +1599,6 @@ class ToolMCPListAllApi(Resource): @account_initialization_required @with_current_tenant_id def get(self, tenant_id: str): - with sessionmaker(db.engine).begin() as session: service = MCPToolManageService(session=session) # Skip sensitive data decryption for list view to improve performance diff --git a/api/controllers/console/wraps.py b/api/controllers/console/wraps.py index b9420e56ccaac2..55f9ed1b4b9dd6 100644 --- a/api/controllers/console/wraps.py +++ b/api/controllers/console/wraps.py @@ -402,7 +402,6 @@ def decorated(*args: P.args, **kwargs: P.kwargs): def edit_permission_required[**P, R](f: Callable[P, R]) -> Callable[P, R]: @wraps(f) def decorated_function(*args: P.args, **kwargs: P.kwargs): - from libs.login import current_user if not dify_config.RBAC_ENABLED: @@ -419,7 +418,6 @@ def decorated_function(*args: P.args, **kwargs: P.kwargs): def is_admin_or_owner_required[**P, R](f: Callable[P, R]) -> Callable[P, R]: @wraps(f) def decorated_function(*args: P.args, **kwargs: P.kwargs): - from libs.login import current_user if not dify_config.RBAC_ENABLED: diff --git a/api/controllers/service_api/app/audio.py b/api/controllers/service_api/app/audio.py index 427598ead2a71c..e3d29c91fdf27a 100644 --- a/api/controllers/service_api/app/audio.py +++ b/api/controllers/service_api/app/audio.py @@ -152,7 +152,7 @@ def post(self, session: Session, app_model: App, end_user: EndUser): raise CompletionRequestError(e.description) except ValueError as e: raise e - except Exception as e: + except Exception: logger.exception("internal server error.") raise InternalServerError() @@ -244,6 +244,6 @@ def post(self, payload: TextToAudioPayload, session: Session, app_model: App, en raise CompletionRequestError(e.description) except ValueError as e: raise e - except Exception as e: + except Exception: logger.exception("internal server error.") raise InternalServerError() diff --git a/api/controllers/trigger/webhook.py b/api/controllers/trigger/webhook.py index 4b5e4cfc9b8806..d011975bb92b75 100644 --- a/api/controllers/trigger/webhook.py +++ b/api/controllers/trigger/webhook.py @@ -164,6 +164,6 @@ def handle_webhook_debug(webhook_id: str): raise NotFound(str(e)) except RequestEntityTooLarge: raise - except Exception as e: + except Exception: logger.exception("Webhook debug processing failed for %s", webhook_id) return jsonify({"error": "Internal server error", "message": "An internal error has occurred."}), 500 diff --git a/api/controllers/web/audio.py b/api/controllers/web/audio.py index 183d35603f2e6f..5fc45514adab85 100644 --- a/api/controllers/web/audio.py +++ b/api/controllers/web/audio.py @@ -124,7 +124,7 @@ def post(self, session: Session, app_model: App, end_user: EndUser): raise CompletionRequestError(e.description) except ValueError as e: raise e - except Exception as e: + except Exception: logger.exception("Failed to handle post request to AudioApi") raise InternalServerError() @@ -188,6 +188,6 @@ def post(self, payload: TextToAudioPayload, session: Session, app_model: App, en raise CompletionRequestError(e.description) except ValueError as e: raise e - except Exception as e: + except Exception: logger.exception("Failed to handle post request to TextApi") raise InternalServerError() diff --git a/api/controllers/web/completion.py b/api/controllers/web/completion.py index a7bfe9c166d401..b3efcffaa65ca4 100644 --- a/api/controllers/web/completion.py +++ b/api/controllers/web/completion.py @@ -161,7 +161,7 @@ def post(self, session: Session, app_model: App, end_user: EndUser): raise CompletionRequestError(e.description) except ValueError as e: raise e - except Exception as e: + except Exception: logger.exception("internal server error.") raise InternalServerError() @@ -275,7 +275,7 @@ def post(self, session: Session, app_model: App, end_user: EndUser): raise CompletionRequestError(e.description) except ValueError as e: raise e - except Exception as e: + except Exception: logger.exception("internal server error.") raise InternalServerError() diff --git a/api/core/tools/utils/model_invocation_utils.py b/api/core/tools/utils/model_invocation_utils.py index 901ce24f96600a..4723b1ef5c9923 100644 --- a/api/core/tools/utils/model_invocation_utils.py +++ b/api/core/tools/utils/model_invocation_utils.py @@ -154,7 +154,7 @@ def invoke( raise InvokeModelError(f"Invoke bad request error: {e}") except InvokeConnectionError as e: raise InvokeModelError(f"Invoke connection error: {e}") - except InvokeAuthorizationError as e: + except InvokeAuthorizationError: raise InvokeModelError("Invoke authorization error") except InvokeServerUnavailableError as e: raise InvokeModelError(f"Invoke server unavailable error: {e}") diff --git a/api/providers/trace/trace-weave/tests/unit_tests/weave_trace/test_weave_trace.py b/api/providers/trace/trace-weave/tests/unit_tests/weave_trace/test_weave_trace.py index da2202fb0a98fc..4c0abbc8e4c69b 100644 --- a/api/providers/trace/trace-weave/tests/unit_tests/weave_trace/test_weave_trace.py +++ b/api/providers/trace/trace-weave/tests/unit_tests/weave_trace/test_weave_trace.py @@ -265,7 +265,7 @@ def test_init_without_entity(self, mock_wandb, mock_weave): """Test __init__ initializes weave without entity prefix when entity is None.""" mock_w, weave_client = mock_weave config = _make_weave_config(entity=None) - instance = WeaveDataTrace(config) + WeaveDataTrace(config) mock_w.init.assert_called_once_with(project_name="my-project") @@ -318,7 +318,6 @@ def test_get_project_url_exception_raises(self, trace_instance, monkeypatch: pyt monkeypatch.setattr(trace_instance, "project_name", None) # Force an error by making string formatting fail # Simulate exception via property - original_entity = trace_instance.entity trace_instance.entity = None trace_instance.project_name = None url = trace_instance.get_project_url() diff --git a/api/providers/vdb/vdb-alibabacloud-mysql/tests/unit_tests/test_alibabacloud_mysql_vector.py b/api/providers/vdb/vdb-alibabacloud-mysql/tests/unit_tests/test_alibabacloud_mysql_vector.py index b1c31a93787d68..eaef59e8dea3f5 100644 --- a/api/providers/vdb/vdb-alibabacloud-mysql/tests/unit_tests/test_alibabacloud_mysql_vector.py +++ b/api/providers/vdb/vdb-alibabacloud-mysql/tests/unit_tests/test_alibabacloud_mysql_vector.py @@ -456,7 +456,7 @@ def test_search_by_vector_with_filter(self, mock_pool_class): vector_store = AlibabaCloudMySQLVector(self.collection_name, self.config) query_vector = [0.1, 0.2, 0.3, 0.4] - docs = vector_store.search_by_vector(query_vector, top_k=5, document_ids_filter=["dataset1"]) + vector_store.search_by_vector(query_vector, top_k=5, document_ids_filter=["dataset1"]) # Verify the SQL contains the WHERE clause for filtering execute_calls = mock_cursor.execute.call_args_list @@ -566,7 +566,7 @@ def test_search_by_full_text_with_filter(self, mock_pool_class): mock_cursor.__iter__ = lambda self: iter([]) vector_store = AlibabaCloudMySQLVector(self.collection_name, self.config) - docs = vector_store.search_by_full_text("machine learning", top_k=5, document_ids_filter=["dataset1"]) + vector_store.search_by_full_text("machine learning", top_k=5, document_ids_filter=["dataset1"]) # Verify the SQL contains the AND clause for filtering execute_calls = mock_cursor.execute.call_args_list diff --git a/api/providers/vdb/vdb-baidu/src/dify_vdb_baidu/baidu_vector.py b/api/providers/vdb/vdb-baidu/src/dify_vdb_baidu/baidu_vector.py index c11b92e97949ec..5d16c5162fafcb 100644 --- a/api/providers/vdb/vdb-baidu/src/dify_vdb_baidu/baidu_vector.py +++ b/api/providers/vdb/vdb-baidu/src/dify_vdb_baidu/baidu_vector.py @@ -236,7 +236,7 @@ def _init_database(self) -> Database: def _table_existed(self) -> bool: try: - table = self._db.table(self._collection_name) + self._db.table(self._collection_name) except ServerError as e: if e.code == ServerErrCode.TABLE_NOT_EXIST: return False diff --git a/api/providers/vdb/vdb-clickzetta/src/dify_vdb_clickzetta/clickzetta_vector.py b/api/providers/vdb/vdb-clickzetta/src/dify_vdb_clickzetta/clickzetta_vector.py index c4caf7672ed218..42d835a4e34c98 100644 --- a/api/providers/vdb/vdb-clickzetta/src/dify_vdb_clickzetta/clickzetta_vector.py +++ b/api/providers/vdb/vdb-clickzetta/src/dify_vdb_clickzetta/clickzetta_vector.py @@ -421,7 +421,7 @@ def _write_worker(cls): break except queue.Empty: continue - except (RuntimeError, ValueError, TypeError, ConnectionError) as e: + except (RuntimeError, ValueError, TypeError, ConnectionError): logger.exception("Write worker error") def _execute_write(self, func, *args, **kwargs): diff --git a/api/providers/vdb/vdb-opengauss/tests/integration_tests/test_opengauss.py b/api/providers/vdb/vdb-opengauss/tests/integration_tests/test_opengauss.py index 8b444527d7ae5b..b957e51890617f 100644 --- a/api/providers/vdb/vdb-opengauss/tests/integration_tests/test_opengauss.py +++ b/api/providers/vdb/vdb-opengauss/tests/integration_tests/test_opengauss.py @@ -26,7 +26,7 @@ def __init__(self): max_connection=5, ) break - except psycopg2.OperationalError as e: + except psycopg2.OperationalError: retry_count += 1 if retry_count < max_retries: time.sleep(retry_delay) diff --git a/api/providers/vdb/vdb-weaviate/src/dify_vdb_weaviate/weaviate_vector.py b/api/providers/vdb/vdb-weaviate/src/dify_vdb_weaviate/weaviate_vector.py index dba9b4bbedf6e4..ef75697b24069c 100644 --- a/api/providers/vdb/vdb-weaviate/src/dify_vdb_weaviate/weaviate_vector.py +++ b/api/providers/vdb/vdb-weaviate/src/dify_vdb_weaviate/weaviate_vector.py @@ -287,7 +287,7 @@ def _create_collection(self): self._ensure_properties() redis_client.set(cache_key, 1, ex=3600) - except Exception as e: + except Exception: logger.exception("Error creating collection %s", self._collection_name) raise diff --git a/api/repositories/knowledge/dataset_read_repository.py b/api/repositories/knowledge/dataset_read_repository.py index 6a0b837bcb75b7..81a072790fa891 100644 --- a/api/repositories/knowledge/dataset_read_repository.py +++ b/api/repositories/knowledge/dataset_read_repository.py @@ -605,7 +605,6 @@ def build_dataset_detail_prefetch(datasets: Sequence[Dataset], *, session: Sessi if not dataset_ids: return DatasetDetailPrefetch() - tenant_ids = {dataset.tenant_id for dataset in datasets} dataset_owners = [(dataset.tenant_id, dataset.id) for dataset in datasets] app_counts = dict( diff --git a/api/services/web_app_runtime_query_service.py b/api/services/web_app_runtime_query_service.py index a8bf2ce3b68502..ad730200d1b2fc 100644 --- a/api/services/web_app_runtime_query_service.py +++ b/api/services/web_app_runtime_query_service.py @@ -77,7 +77,7 @@ def get_bootstrap(self, app_id: str) -> WebAppBootstrap: if record.site.icon_type == "image" and record.site.icon else None ) - except FileNotExistsError as exc: + except FileNotExistsError: logger.warning( "Web app site icon is unavailable: app_id=%s tenant_id=%s file_id=%s", record.app_id, diff --git a/api/tasks/ops_trace_task.py b/api/tasks/ops_trace_task.py index 49fe68ad7ed3ac..acfa59df3f28ba 100644 --- a/api/tasks/ops_trace_task.py +++ b/api/tasks/ops_trace_task.py @@ -124,7 +124,7 @@ def process_trace_tasks(self, file_info): logger.exception("Failed to schedule trace dispatch retry, app_id: %s", app_id) failed_key = f"{OPS_TRACE_FAILED_KEY}_{app_id}" redis_client.incr(failed_key) - except Exception as e: + except Exception: logger.exception("Processing trace tasks failed, app_id: %s", app_id) failed_key = f"{OPS_TRACE_FAILED_KEY}_{app_id}" redis_client.incr(failed_key) diff --git a/api/tests/integration_tests/tasks/test_remove_app_and_related_data_task.py b/api/tests/integration_tests/tasks/test_remove_app_and_related_data_task.py index 4f444598b12036..d9aafbea54362b 100644 --- a/api/tests/integration_tests/tasks/test_remove_app_and_related_data_task.py +++ b/api/tests/integration_tests/tasks/test_remove_app_and_related_data_task.py @@ -19,7 +19,6 @@ @pytest.fixture def app_and_tenant(flask_req_ctx): - tenant_id = uuid.uuid4() with session_factory.create_session() as session: tenant = Tenant(name="test_tenant") session.add(tenant) diff --git a/api/tests/integration_tests/workflow/nodes/test_http.py b/api/tests/integration_tests/workflow/nodes/test_http.py index 86b0cd0fd71c0f..d580388e5e439b 100644 --- a/api/tests/integration_tests/workflow/nodes/test_http.py +++ b/api/tests/integration_tests/workflow/nodes/test_http.py @@ -72,7 +72,7 @@ def init_http_node(config: dict): graph_runtime_state=graph_runtime_state, ) - graph = Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") + Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") node = HttpRequestNode( node_id=str(uuid.uuid4()), @@ -719,7 +719,7 @@ def test_nested_object_variable_selector(setup_http_mock): graph_runtime_state=graph_runtime_state, ) - graph = Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") + Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") node = HttpRequestNode( node_id=str(uuid.uuid4()), diff --git a/api/tests/test_containers_integration_tests/commands/test_legacy_model_type_migration.py b/api/tests/test_containers_integration_tests/commands/test_legacy_model_type_migration.py index 3229ab0568578d..69ffc70dbdad91 100644 --- a/api/tests/test_containers_integration_tests/commands/test_legacy_model_type_migration.py +++ b/api/tests/test_containers_integration_tests/commands/test_legacy_model_type_migration.py @@ -141,7 +141,7 @@ def _insert_load_balancing_model_config( def migration_module(): try: return importlib.import_module("services.legacy_model_type_migration") - except ModuleNotFoundError as exc: # pragma: no cover - explicit TDD failure path + except ModuleNotFoundError: # pragma: no cover - explicit TDD failure path pytest.fail( "services.legacy_model_type_migration is missing. " "Implement LegacyModelTypeMigrationService before running these tests." diff --git a/api/tests/test_containers_integration_tests/services/test_advanced_prompt_template_service.py b/api/tests/test_containers_integration_tests/services/test_advanced_prompt_template_service.py index 144cba280f477f..2c80269e6e680a 100644 --- a/api/tests/test_containers_integration_tests/services/test_advanced_prompt_template_service.py +++ b/api/tests/test_containers_integration_tests/services/test_advanced_prompt_template_service.py @@ -1,7 +1,6 @@ import copy import pytest -from faker import Faker from sqlalchemy.orm import Session from core.prompt.prompt_templates.advanced_prompt_templates import ( @@ -33,7 +32,6 @@ def test_get_prompt_success(self, db_session_with_containers: Session, mock_exte - Proper prompt generation - Appropriate prompt template selection """ - fake = Faker() args = { "app_mode": AppMode.CHAT, @@ -68,7 +66,6 @@ def test_get_prompt_chat_app_completion_mode( - Proper context integration - Template structure validation """ - fake = Faker() # Act: Execute the method under test result = AdvancedPromptTemplateService.get_prompt( @@ -101,7 +98,6 @@ def test_get_prompt_chat_app_chat_mode( - Proper context integration - Template structure validation """ - fake = Faker() # Act: Execute the method under test result = AdvancedPromptTemplateService.get_prompt(app_mode=AppMode.CHAT, model_mode="chat", has_context="true") @@ -130,7 +126,6 @@ def test_get_prompt_completion_app_completion_mode( - Proper context integration - Template structure validation """ - fake = Faker() # Act: Execute the method under test result = AdvancedPromptTemplateService.get_prompt( @@ -160,7 +155,6 @@ def test_get_prompt_completion_app_chat_mode( - Proper context integration - Template structure validation """ - fake = Faker() # Act: Execute the method under test result = AdvancedPromptTemplateService.get_prompt( @@ -189,7 +183,6 @@ def test_get_prompt_no_context(self, db_session_with_containers: Session, mock_e - Context is not included in prompt - Template structure remains intact """ - fake = Faker() # Act: Execute the method under test result = AdvancedPromptTemplateService.get_prompt( @@ -219,7 +212,6 @@ def test_get_prompt_unsupported_app_mode( - Proper handling of unsupported app modes - Default empty dict return """ - fake = Faker() # Act: Execute the method under test result = AdvancedPromptTemplateService.get_prompt( @@ -239,7 +231,6 @@ def test_get_prompt_unsupported_model_mode( - Proper handling of unsupported model modes - Default empty dict return """ - fake = Faker() # Act: Execute the method under test result = AdvancedPromptTemplateService.get_prompt( @@ -260,7 +251,6 @@ def test_get_completion_prompt_with_context( - Template structure preservation - Context placement at the beginning """ - fake = Faker() # Create test prompt template prompt_template = copy.deepcopy(CHAT_APP_COMPLETION_PROMPT_CONFIG) @@ -291,7 +281,6 @@ def test_get_completion_prompt_without_context( - Original template is preserved when no context - No modification to prompt text """ - fake = Faker() # Create test prompt template prompt_template = copy.deepcopy(CHAT_APP_COMPLETION_PROMPT_CONFIG) @@ -322,7 +311,6 @@ def test_get_chat_prompt_with_context( - Template structure preservation - Context placement at the beginning of first message """ - fake = Faker() # Create test prompt template prompt_template = copy.deepcopy(CHAT_APP_CHAT_PROMPT_CONFIG) @@ -354,7 +342,6 @@ def test_get_chat_prompt_without_context( - Original template is preserved when no context - No modification to prompt text """ - fake = Faker() # Create test prompt template prompt_template = copy.deepcopy(CHAT_APP_CHAT_PROMPT_CONFIG) @@ -383,7 +370,6 @@ def test_get_prompt_all_app_modes(self, db_session_with_containers: Session, moc - All app modes work correctly - Proper template selection for each combination """ - fake = Faker() # Test all app modes app_modes = [AppMode.CHAT, AppMode.COMPLETION] @@ -413,7 +399,6 @@ def test_get_prompt_edge_cases(self, db_session_with_containers: Session, mock_e - Proper error handling - Consistent behavior with unusual inputs """ - fake = Faker() # Test edge cases edge_cases = [ @@ -443,7 +428,6 @@ def test_template_immutability(self, db_session_with_containers: Session, mock_e - Deep copy is used properly - Template immutability is maintained """ - fake = Faker() # Store original templates original_chat_completion = copy.deepcopy(CHAT_APP_COMPLETION_PROMPT_CONFIG) @@ -459,7 +443,7 @@ def test_template_immutability(self, db_session_with_containers: Session, mock_e } # Act: Execute the method under test - result = AdvancedPromptTemplateService.get_prompt(**args) + AdvancedPromptTemplateService.get_prompt(**args) # Assert: Verify original templates are unchanged assert original_chat_completion == CHAT_APP_COMPLETION_PROMPT_CONFIG @@ -478,7 +462,6 @@ def test_context_integration_consistency( - Context integration is consistent across different templates - No context duplication or corruption """ - fake = Faker() # Test different scenarios test_scenarios = [ diff --git a/api/tests/test_containers_integration_tests/services/test_agent_service.py b/api/tests/test_containers_integration_tests/services/test_agent_service.py index ab7c658be0803f..42e040f01542d3 100644 --- a/api/tests/test_containers_integration_tests/services/test_agent_service.py +++ b/api/tests/test_containers_integration_tests/services/test_agent_service.py @@ -224,7 +224,6 @@ def _create_test_agent_thoughts(self, db_session_with_containers: Session, messa Returns: list: Created agent thoughts """ - fake = Faker() agent_thoughts = [] @@ -288,12 +287,11 @@ def test_get_agent_logs_success(self, db_session_with_containers: Session, mock_ """ Test successful retrieval of agent logs with complete data. """ - fake = Faker() # Create test data app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) conversation, message = self._create_test_conversation_and_message(db_session_with_containers, app, account) - agent_thoughts = self._create_test_agent_thoughts(db_session_with_containers, message) + self._create_test_agent_thoughts(db_session_with_containers, message) # Execute the method under test result = AgentService.get_agent_logs(app, conversation.id, message.id, db_session_with_containers) @@ -537,7 +535,6 @@ def test_get_agent_logs_with_tool_error( """ Test agent logs retrieval with tool errors. """ - fake = Faker() # Create test data app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) @@ -587,7 +584,6 @@ def test_get_agent_logs_without_agent_thoughts( """ Test agent logs retrieval when message has no agent thoughts. """ - fake = Faker() # Create test data app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) @@ -664,7 +660,6 @@ def test_get_agent_logs_agent_config_not_found( """ Test error handling when agent config is not found. """ - fake = Faker() # Create test data app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) @@ -683,7 +678,6 @@ def test_list_agent_providers_success( """ Test successful listing of agent providers. """ - fake = Faker() # Create test data app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) @@ -704,7 +698,6 @@ def test_get_agent_provider_success(self, db_session_with_containers: Session, m """ Test successful retrieval of specific agent provider. """ - fake = Faker() # Create test data app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) @@ -728,7 +721,6 @@ def test_get_agent_provider_plugin_error( """ Test error handling when plugin daemon client raises an error. """ - fake = Faker() # Create test data app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) @@ -750,7 +742,6 @@ def test_get_agent_logs_with_complex_tool_data( """ Test agent logs retrieval with complex tool data and multiple tools. """ - fake = Faker() # Create test data app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) @@ -837,7 +828,6 @@ def test_get_agent_logs_with_files(self, db_session_with_containers: Session, mo """ Test agent logs retrieval with message files and agent thought files. """ - fake = Faker() # Create test data app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) @@ -917,7 +907,6 @@ def test_get_agent_logs_with_different_timezone( """ Test agent logs retrieval with different timezone settings. """ - fake = Faker() # Create test data app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) @@ -944,7 +933,6 @@ def test_get_agent_logs_with_empty_tool_data( """ Test agent logs retrieval with empty tool data. """ - fake = Faker() # Create test data app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) @@ -985,7 +973,6 @@ def test_get_agent_logs_with_malformed_json( """ Test agent logs retrieval with malformed JSON data in tool fields. """ - fake = Faker() # Create test data app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) diff --git a/api/tests/test_containers_integration_tests/services/test_annotation_service.py b/api/tests/test_containers_integration_tests/services/test_annotation_service.py index ddf1fe25c97ed4..4cc08949ee3d55 100644 --- a/api/tests/test_containers_integration_tests/services/test_annotation_service.py +++ b/api/tests/test_containers_integration_tests/services/test_annotation_service.py @@ -497,7 +497,7 @@ def test_get_annotation_list_by_app_id_with_special_characters_in_keyword( - Search treats special characters as literal characters, not wildcards - SQL injection via LIKE wildcards is prevented """ - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create annotations with special characters in content @@ -657,7 +657,7 @@ def test_enable_app_annotation_success( """ Test successful enabling of app annotation. """ - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Setup enable arguments @@ -685,7 +685,7 @@ def test_disable_app_annotation_success( """ Test successful disabling of app annotation. """ - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Disable annotation @@ -887,7 +887,7 @@ def test_batch_import_app_annotations_success( """ Test successful batch import of app annotations. """ - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create CSV content @@ -929,7 +929,7 @@ def test_batch_import_app_annotations_empty_file( """ Test batch import with empty CSV file. """ - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create empty CSV content @@ -965,7 +965,7 @@ def test_batch_import_app_annotations_quota_exceeded( """ Test batch import when quota is exceeded. """ - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create CSV content @@ -1055,7 +1055,7 @@ def test_get_app_annotation_setting_by_app_id_disabled( """ Test getting disabled app annotation setting by app ID. """ - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Get annotation setting (no setting exists) diff --git a/api/tests/test_containers_integration_tests/services/test_app_generate_service.py b/api/tests/test_containers_integration_tests/services/test_app_generate_service.py index a7eec53a182d33..67101526fa8aa6 100644 --- a/api/tests/test_containers_integration_tests/services/test_app_generate_service.py +++ b/api/tests/test_containers_integration_tests/services/test_app_generate_service.py @@ -983,7 +983,7 @@ def test_get_max_active_requests_with_app_limit( """ Test getting max active requests with app-specific limit. """ - fake = Faker() + app, account = self._create_test_app_and_account( db_session_with_containers, mock_external_service_dependencies, mode="completion" ) @@ -1003,7 +1003,7 @@ def test_get_max_active_requests_with_config_limit( """ Test getting max active requests with config limit being smaller. """ - fake = Faker() + app, account = self._create_test_app_and_account( db_session_with_containers, mock_external_service_dependencies, mode="completion" ) @@ -1024,7 +1024,7 @@ def test_get_max_active_requests_with_zero_limits( """ Test getting max active requests with zero limits (infinite). """ - fake = Faker() + app, account = self._create_test_app_and_account( db_session_with_containers, mock_external_service_dependencies, mode="completion" ) diff --git a/api/tests/test_containers_integration_tests/services/test_app_service.py b/api/tests/test_containers_integration_tests/services/test_app_service.py index 72cb9314a44af1..6cc2ecb94a48f6 100644 --- a/api/tests/test_containers_integration_tests/services/test_app_service.py +++ b/api/tests/test_containers_integration_tests/services/test_app_service.py @@ -497,10 +497,8 @@ def test_get_paginate_apps_with_filters( icon_background="#4ECDC4", ) - chat_app = app_service.create_app(tenant.id, chat_app_params, account, session=db_session_with_containers) - completion_app = app_service.create_app( - tenant.id, completion_app_params, account, session=db_session_with_containers - ) + app_service.create_app(tenant.id, chat_app_params, account, session=db_session_with_containers) + app_service.create_app(tenant.id, completion_app_params, account, session=db_session_with_containers) # Test filter by mode chat_apps = app_service.get_paginate_apps( @@ -682,11 +680,6 @@ def test_update_app_success(self, db_session_with_containers: Session, mock_exte app = app_service.create_app(tenant.id, app_params, account, session=db_session_with_containers) # Store original values - original_name = app.name - original_description = app.description - original_icon = app.icon - original_icon_background = app.icon_background - original_use_icon_as_answer_icon = app.use_icon_as_answer_icon # Update app update_args = { @@ -862,7 +855,6 @@ def test_update_app_api_status_success( app = app_service.create_app(tenant.id, app_args, account, session=db_session_with_containers) # Store original API status - original_api_status = app.enable_api # Update API status to disabled mock_current_user = create_autospec(Account, instance=True) @@ -1057,7 +1049,7 @@ def test_get_apps_with_special_characters_in_name( app_service = AppService() # Create apps with special characters in names - app_with_percent = app_service.create_app( + app_service.create_app( tenant.id, CreateAppParams( name="App with 50% discount", @@ -1073,7 +1065,7 @@ def test_get_apps_with_special_characters_in_name( session=db_session_with_containers, ) - app_with_underscore = app_service.create_app( + app_service.create_app( tenant.id, CreateAppParams( name="test_data_app", @@ -1089,7 +1081,7 @@ def test_get_apps_with_special_characters_in_name( session=db_session_with_containers, ) - app_with_backslash = app_service.create_app( + app_service.create_app( tenant.id, CreateAppParams( name="path\\to\\app", @@ -1106,7 +1098,7 @@ def test_get_apps_with_special_characters_in_name( ) # Create app that should NOT match - app_no_match = app_service.create_app( + app_service.create_app( tenant.id, CreateAppParams( name="100% different", diff --git a/api/tests/test_containers_integration_tests/services/test_conversation_service.py b/api/tests/test_containers_integration_tests/services/test_conversation_service.py index 69407cb039b4af..33cc75edac75bf 100644 --- a/api/tests/test_containers_integration_tests/services/test_conversation_service.py +++ b/api/tests/test_containers_integration_tests/services/test_conversation_service.py @@ -552,7 +552,7 @@ def test_auto_generate_name_success(self, mock_llm_generator, db_session_with_co mock_llm_generator.return_value = generated_name # Act - result = ConversationService.auto_generate_name(app_model, conversation, session=db_session_with_containers) + ConversationService.auto_generate_name(app_model, conversation, session=db_session_with_containers) # Assert assert conversation.name == generated_name # Name updated on conversation object @@ -609,7 +609,7 @@ def test_auto_generate_name_handles_llm_failure_gracefully( mock_llm_generator.side_effect = Exception("LLM service unavailable") # Act - result = ConversationService.auto_generate_name(app_model, conversation, session=db_session_with_containers) + ConversationService.auto_generate_name(app_model, conversation, session=db_session_with_containers) # Assert assert conversation.name == original_name # Name remains unchanged @@ -636,7 +636,7 @@ def test_rename_with_manual_name(self, mock_naive_utc_now, db_session_with_conta mock_naive_utc_now.return_value = mock_time # Act - result = ConversationService.rename( + ConversationService.rename( app_model=app_model, conversation_id=conversation.id, user=user, diff --git a/api/tests/test_containers_integration_tests/services/test_end_user_service.py b/api/tests/test_containers_integration_tests/services/test_end_user_service.py index 2864f135ca1222..b82a0a227e2588 100644 --- a/api/tests/test_containers_integration_tests/services/test_end_user_service.py +++ b/api/tests/test_containers_integration_tests/services/test_end_user_service.py @@ -421,7 +421,6 @@ def _create_multiple_apps( """Create multiple apps under the same tenant.""" first_app = factory.create_app_and_account(db_session_with_containers) tenant_id = first_app.tenant_id - apps = [first_app] for _ in range(count - 1): app = App( tenant_id=tenant_id, diff --git a/api/tests/test_containers_integration_tests/services/test_feature_service.py b/api/tests/test_containers_integration_tests/services/test_feature_service.py index bc939bbab9fcb5..a5796361e8d739 100644 --- a/api/tests/test_containers_integration_tests/services/test_feature_service.py +++ b/api/tests/test_containers_integration_tests/services/test_feature_service.py @@ -260,7 +260,7 @@ def test_get_system_features_success(self, db_session_with_containers: Session, - Return value correctness and structure """ # Arrange: Setup test data with proper config - tenant_id = self._create_test_tenant_id() + self._create_test_tenant_id() with patch("services.system_feature_service.dify_config") as mock_config: mock_config.DEPLOYMENT_EDITION = DeploymentEdition.ENTERPRISE diff --git a/api/tests/test_containers_integration_tests/services/test_file_service.py b/api/tests/test_containers_integration_tests/services/test_file_service.py index dc91e29085fb5b..0f3016ba81c303 100644 --- a/api/tests/test_containers_integration_tests/services/test_file_service.py +++ b/api/tests/test_containers_integration_tests/services/test_file_service.py @@ -163,7 +163,7 @@ def test_upload_file_success(self, db_session_with_containers: Session, engine, """ Test successful file upload with valid parameters. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) filename = "test_document.pdf" @@ -198,7 +198,7 @@ def test_upload_file_with_end_user( """ Test file upload with end user instead of account. """ - fake = Faker() + end_user = self._create_test_end_user(db_session_with_containers, mock_external_service_dependencies) filename = "test_image.jpg" @@ -222,7 +222,7 @@ def test_upload_file_with_datasets_source( """ Test file upload with datasets source parameter. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) filename = "test_document.pdf" @@ -247,7 +247,7 @@ def test_upload_file_invalid_filename_characters( """ Test file upload with invalid filename characters. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) filename = "test/file.txt" @@ -289,7 +289,7 @@ def test_upload_file_filename_too_long( """ Test file upload with filename that exceeds length limit. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) # Create a filename longer than 200 characters @@ -319,7 +319,7 @@ def test_upload_file_datasets_unsupported_type( """ Test file upload for datasets with unsupported file type. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) filename = "test_image.jpg" @@ -341,7 +341,7 @@ def test_upload_file_too_large( """ Test file upload with file size exceeding limit. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) filename = "large_image.jpg" @@ -501,7 +501,7 @@ def test_get_file_preview_success( """ Test successful file preview generation. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) upload_file = self._create_test_upload_file( db_session_with_containers, mock_external_service_dependencies, account @@ -535,7 +535,7 @@ def test_get_file_preview_unsupported_file_type( """ Test file preview with unsupported file type. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) upload_file = self._create_test_upload_file( db_session_with_containers, mock_external_service_dependencies, account @@ -555,7 +555,7 @@ def test_get_file_preview_text_truncation( """ Test file preview with text that exceeds preview limit. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) upload_file = self._create_test_upload_file( db_session_with_containers, mock_external_service_dependencies, account @@ -582,7 +582,7 @@ def test_upload_file_empty_content( """ Test file upload with empty content. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) filename = "empty.txt" @@ -605,7 +605,7 @@ def test_upload_file_special_characters_in_name( """ Test file upload with special characters in filename (but valid ones). """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) filename = "test-file_with_underscores_and.dots.txt" @@ -628,7 +628,7 @@ def test_upload_file_different_case_extensions( """ Test file upload with different case extensions. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) filename = "test.PDF" @@ -698,7 +698,7 @@ def test_upload_file_with_source_url( """ Test file upload with source URL that gets overridden by signed URL. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) filename = "test.pdf" @@ -737,7 +737,7 @@ def test_upload_file_blocked_extension( """ Test file upload with blocked extension. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) # Mock blacklist configuration by patching the inner field @@ -760,7 +760,7 @@ def test_upload_file_blocked_extension_case_insensitive( """ Test file upload with blocked extension (case insensitive). """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) # Mock blacklist configuration by patching the inner field @@ -784,7 +784,7 @@ def test_upload_file_not_in_blacklist( """ Test file upload with extension not in blacklist. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) # Mock blacklist configuration by patching the inner field @@ -810,7 +810,7 @@ def test_upload_file_empty_blacklist( """ Test file upload with empty blacklist (default behavior). """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) # Mock empty blacklist configuration by patching the inner field @@ -836,7 +836,7 @@ def test_upload_file_multiple_blocked_extensions( """ Test file upload with multiple blocked extensions. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) # Mock blacklist with multiple extensions by patching the inner field @@ -861,7 +861,7 @@ def test_upload_file_no_extension_with_blacklist( """ Test file upload with no extension when blacklist is configured. """ - fake = Faker() + account = self._create_test_account(db_session_with_containers, mock_external_service_dependencies) # Mock blacklist configuration by patching the inner field diff --git a/api/tests/test_containers_integration_tests/services/test_message_service.py b/api/tests/test_containers_integration_tests/services/test_message_service.py index d26ee1c530f8fe..cc4d8bc641bf9e 100644 --- a/api/tests/test_containers_integration_tests/services/test_message_service.py +++ b/api/tests/test_containers_integration_tests/services/test_message_service.py @@ -260,7 +260,7 @@ def test_pagination_by_first_id_no_conversation_id( """ Test pagination by first ID when no conversation ID is provided. """ - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Test pagination with no conversation ID @@ -376,7 +376,7 @@ def test_pagination_by_last_id_no_user( """ Test pagination by last ID when no user is provided. """ - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Test pagination with no user, diff --git a/api/tests/test_containers_integration_tests/services/test_metadata_service.py b/api/tests/test_containers_integration_tests/services/test_metadata_service.py index 6caa5fd757d5c4..6db0af706168b8 100644 --- a/api/tests/test_containers_integration_tests/services/test_metadata_service.py +++ b/api/tests/test_containers_integration_tests/services/test_metadata_service.py @@ -234,7 +234,7 @@ def test_update_metadata_name_already_exists(self, db_session_with_containers: S ) db_session_with_containers.expire_all() second_metadata_args = MetadataArgs(type="number", name="second_metadata") - second_metadata = _metadata_service(db_session_with_containers).create_metadata( + _metadata_service(db_session_with_containers).create_metadata( DatasetRef(tenant.id, dataset.id), second_metadata_args, actor_id=account.id ) db_session_with_containers.expire_all() @@ -408,7 +408,7 @@ def test_enable_built_in_field_success(self, db_session_with_containers: Session """ account, tenant = self._create_test_account_and_tenant(db_session_with_containers) dataset = self._create_test_dataset(db_session_with_containers, account, tenant) - document = self._create_test_document(db_session_with_containers, dataset, account) + self._create_test_document(db_session_with_containers, dataset, account) assert dataset.built_in_field_enabled is False _metadata_service(db_session_with_containers).enable_built_in_field(DatasetRef(dataset.tenant_id, dataset.id)) db_session_with_containers.expire_all() @@ -660,7 +660,7 @@ def test_get_dataset_metadatas_with_built_in_fields_enabled(self, db_session_wit db_session_with_containers.add(dataset) db_session_with_containers.commit() metadata_args = MetadataArgs(type="string", name="test_metadata") - metadata = _metadata_service(db_session_with_containers).create_metadata( + _metadata_service(db_session_with_containers).create_metadata( DatasetRef(tenant.id, dataset.id), metadata_args, actor_id=account.id ) db_session_with_containers.expire_all() diff --git a/api/tests/test_containers_integration_tests/services/test_model_load_balancing_service.py b/api/tests/test_containers_integration_tests/services/test_model_load_balancing_service.py index c435af52a06fee..27a142d6220080 100644 --- a/api/tests/test_containers_integration_tests/services/test_model_load_balancing_service.py +++ b/api/tests/test_containers_integration_tests/services/test_model_load_balancing_service.py @@ -124,7 +124,6 @@ def _create_test_provider_and_setting( Returns: tuple: (provider, provider_model_setting) - Created provider and setting instances """ - fake = Faker() # Create provider provider = Provider( @@ -162,7 +161,7 @@ def test_enable_model_load_balancing_success( - Correct method calls to provider configuration """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -205,7 +204,7 @@ def test_disable_model_load_balancing_success( - Correct method calls to provider configuration """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -248,7 +247,7 @@ def test_enable_model_load_balancing_provider_not_found( - No database state changes """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -284,7 +283,7 @@ def test_get_load_balancing_configs_success( - Correct return format and data structure """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -371,7 +370,7 @@ def test_get_load_balancing_configs_provider_not_found( - No database state changes """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -411,7 +410,7 @@ def test_get_load_balancing_configs_with_inherit_config( - Inherit config initialization when needed """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) diff --git a/api/tests/test_containers_integration_tests/services/test_model_provider_service.py b/api/tests/test_containers_integration_tests/services/test_model_provider_service.py index 356bf77dbd213b..7f5391c6dd0a4b 100644 --- a/api/tests/test_containers_integration_tests/services/test_model_provider_service.py +++ b/api/tests/test_containers_integration_tests/services/test_model_provider_service.py @@ -100,7 +100,6 @@ def _create_test_provider( Returns: Provider: Created provider instance """ - fake = Faker() provider = Provider( tenant_id=tenant_id, @@ -140,7 +139,6 @@ def _create_test_provider_model( Returns: ProviderModel: Created provider model instance """ - fake = Faker() provider_model = ProviderModel( tenant_id=tenant_id, @@ -178,7 +176,6 @@ def _create_test_provider_model_setting( Returns: ProviderModelSetting: Created provider model setting instance """ - fake = Faker() provider_model_setting = ProviderModelSetting( tenant_id=tenant_id, @@ -205,15 +202,13 @@ def test_get_provider_list_success(self, db_session_with_containers: Session, mo - Mock interactions with ProviderManager """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic configuration mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -283,7 +278,7 @@ def test_get_provider_list_with_model_type_filter( - Correct handling of unsupported model types """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -383,21 +378,19 @@ def test_get_models_by_provider_success( - Mock interactions with ProviderManager """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider and models - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") - provider_model_1 = self._create_test_provider_model( + self._create_test_provider_model( db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai", "gpt-3.5-turbo", "llm" ) - provider_model_2 = self._create_test_provider_model( + self._create_test_provider_model( db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai", "gpt-4", "llm" ) @@ -496,15 +489,13 @@ def test_get_provider_credentials_success( - Mock interactions with ProviderManager """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic configuration mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -555,15 +546,13 @@ def test_provider_credentials_validate_success( - Mock interactions with ProviderManager """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic configuration mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -597,7 +586,7 @@ def test_provider_credentials_validate_invalid_provider( - Mock interactions with ProviderManager """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -629,15 +618,13 @@ def test_get_default_model_of_model_type_success( - Mock interactions with ProviderManager """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic default model mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -685,15 +672,13 @@ def test_update_default_model_of_model_type_success( - Database state management """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic configuration mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -719,15 +704,13 @@ def test_get_model_provider_icon_success( - Mock interactions with ModelProviderFactory """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ModelProviderFactory to return realistic icon data mock_model_provider_factory = mock_external_service_dependencies["model_provider_factory"].return_value @@ -758,15 +741,13 @@ def test_switch_preferred_provider_success( - Provider configuration management """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic configuration mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -794,15 +775,13 @@ def test_enable_model_success(self, db_session_with_containers: Session, mock_ex - Model configuration management """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic configuration mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -832,15 +811,13 @@ def test_get_model_credentials_success( - Mock interactions with ProviderManager """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic configuration mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -891,15 +868,13 @@ def test_model_credentials_validate_success( - Model credential validation process """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic configuration mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -935,15 +910,13 @@ def test_save_model_credentials_success( - Model credential management """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic configuration mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -978,15 +951,13 @@ def test_remove_model_credentials_success( - Model credential cleanup """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic configuration mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -1018,15 +989,13 @@ def test_get_models_by_model_type_success( - Mock interactions with ProviderManager """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic configuration mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -1097,15 +1066,13 @@ def test_get_model_parameter_rules_success( - Model schema handling """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic configuration mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -1165,15 +1132,13 @@ def test_get_model_parameter_rules_no_credentials( - Mock interactions with ProviderManager """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) # Create test provider - provider = self._create_test_provider( - db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai" - ) + self._create_test_provider(db_session_with_containers, mock_external_service_dependencies, tenant.id, "openai") # Mock ProviderManager to return realistic configuration mock_provider_manager = mock_external_service_dependencies["provider_manager"].return_value @@ -1209,7 +1174,7 @@ def test_get_model_parameter_rules_provider_not_found( - Mock interactions with ProviderManager """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) diff --git a/api/tests/test_containers_integration_tests/services/test_trigger_provider_service.py b/api/tests/test_containers_integration_tests/services/test_trigger_provider_service.py index 93e23dcd26895c..f6a90934a9225d 100644 --- a/api/tests/test_containers_integration_tests/services/test_trigger_provider_service.py +++ b/api/tests/test_containers_integration_tests/services/test_trigger_provider_service.py @@ -163,7 +163,7 @@ def test_rebuild_trigger_subscription_success_with_merged_credentials( - Merged credentials are used for subscribe and update - Database state is correctly updated """ - fake = Faker() + account, tenant = self._create_test_account_and_tenant( mock_external_service_dependencies, db_session_with_containers ) @@ -263,7 +263,7 @@ def test_rebuild_trigger_subscription_with_all_new_credentials( - All new credentials are used when no HIDDEN_VALUE is present - Merged credentials contain only new values """ - fake = Faker() + account, tenant = self._create_test_account_and_tenant( mock_external_service_dependencies, db_session_with_containers ) @@ -323,7 +323,7 @@ def test_rebuild_trigger_subscription_with_all_hidden_values( - All HIDDEN_VALUE credentials are replaced with existing values - Original credentials are preserved """ - fake = Faker() + account, tenant = self._create_test_account_and_tenant( mock_external_service_dependencies, db_session_with_containers ) @@ -381,7 +381,7 @@ def test_rebuild_trigger_subscription_with_missing_key_uses_unknown_value( This test verifies: - UNKNOWN_VALUE is used when HIDDEN_VALUE key doesn't exist in original credentials """ - fake = Faker() + account, tenant = self._create_test_account_and_tenant( mock_external_service_dependencies, db_session_with_containers ) @@ -441,7 +441,7 @@ def test_rebuild_trigger_subscription_rollback_on_error( - Database transaction is rolled back when an error occurs - Original subscription state is preserved """ - fake = Faker() + account, tenant = self._create_test_account_and_tenant( mock_external_service_dependencies, db_session_with_containers ) @@ -519,7 +519,7 @@ def test_rebuild_trigger_subscription_name_uniqueness_check( This test verifies: - Error is raised when new name conflicts with existing subscription """ - fake = Faker() + account, tenant = self._create_test_account_and_tenant( mock_external_service_dependencies, db_session_with_containers ) diff --git a/api/tests/test_containers_integration_tests/services/test_web_conversation_service.py b/api/tests/test_containers_integration_tests/services/test_web_conversation_service.py index 76dc411451ae8a..f231661e725a9e 100644 --- a/api/tests/test_containers_integration_tests/services/test_web_conversation_service.py +++ b/api/tests/test_containers_integration_tests/services/test_web_conversation_service.py @@ -480,7 +480,7 @@ def test_pagination_by_last_id_user_required_error( """ Test that pagination_by_last_id raises ValueError when user is None. """ - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Test with None user diff --git a/api/tests/test_containers_integration_tests/services/test_workflow_app_service.py b/api/tests/test_containers_integration_tests/services/test_workflow_app_service.py index caaa7ea54c6d66..5b0cccb375030d 100644 --- a/api/tests/test_containers_integration_tests/services/test_workflow_app_service.py +++ b/api/tests/test_containers_integration_tests/services/test_workflow_app_service.py @@ -201,7 +201,6 @@ def _create_test_workflow_data(self, db_session_with_containers: Session, app, a Returns: tuple: (workflow, workflow_run, workflow_app_log) - Created workflow entities """ - fake = Faker() # Create workflow workflow = Workflow( @@ -266,7 +265,7 @@ def test_get_paginate_workflow_app_logs_basic_success( Test successful pagination of workflow app logs with basic parameters. """ # Arrange: Create test data - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) workflow, workflow_run, workflow_app_log = self._create_test_workflow_data( db_session_with_containers, app, account @@ -304,7 +303,7 @@ def test_get_paginate_workflow_app_logs_with_keyword_search( Test workflow app logs pagination with keyword search functionality. """ # Arrange: Create test data - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) workflow, workflow_run, workflow_app_log = self._create_test_workflow_data( db_session_with_containers, app, account @@ -351,7 +350,7 @@ def test_get_paginate_workflow_app_logs_with_special_characters_in_keyword( - SQL injection via LIKE wildcards is prevented """ # Arrange: Create test data - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) workflow, _, _ = self._create_test_workflow_data(db_session_with_containers, app, account) @@ -494,7 +493,7 @@ def test_get_paginate_workflow_app_logs_with_status_filter( Test workflow app logs pagination with status filtering. """ # Arrange: Create test data with different statuses - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create workflow @@ -593,7 +592,7 @@ def test_get_paginate_workflow_app_logs_with_time_filtering( Test workflow app logs pagination with time-based filtering. """ # Arrange: Create test data with different timestamps - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create workflow @@ -705,7 +704,7 @@ def test_get_paginate_workflow_app_logs_with_pagination( Test workflow app logs pagination with different page sizes and limits. """ # Arrange: Create test data with multiple logs - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create workflow @@ -819,7 +818,7 @@ def test_get_paginate_workflow_app_logs_with_user_role_filtering( Test workflow app logs pagination with user role and session filtering. """ # Arrange: Create test data with different user roles - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create workflow @@ -1013,7 +1012,7 @@ def test_get_paginate_workflow_app_logs_with_uuid_keyword_search( Test workflow app logs pagination with UUID keyword search functionality. """ # Arrange: Create test data - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create workflow @@ -1102,7 +1101,7 @@ def test_get_paginate_workflow_app_logs_with_edge_cases( Test workflow app logs pagination with edge cases and boundary conditions. """ # Arrange: Create test data - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create workflow @@ -1200,7 +1199,7 @@ def test_get_paginate_workflow_app_logs_with_empty_results( Test workflow app logs pagination with empty results and no data scenarios. """ # Arrange: Create test data - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Act & Assert: Test empty results @@ -1267,7 +1266,7 @@ def test_get_paginate_workflow_app_logs_with_complex_query_combinations( Test workflow app logs pagination with complex query combinations. """ # Arrange: Create test data with various combinations - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) workflow, _, _ = self._create_test_workflow_data(db_session_with_containers, app, account) @@ -1367,7 +1366,7 @@ def test_get_paginate_workflow_app_logs_with_large_dataset_performance( Test workflow app logs pagination with large dataset for performance validation. """ # Arrange: Create a larger dataset - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) workflow, _, _ = self._create_test_workflow_data(db_session_with_containers, app, account) @@ -1459,7 +1458,6 @@ def test_get_paginate_workflow_app_logs_with_tenant_isolation( Test workflow app logs pagination with proper tenant isolation. """ # Arrange: Create multiple tenants and apps - fake = Faker() # Create first tenant and app tenant1, account1 = self._create_test_tenant_and_account( diff --git a/api/tests/test_containers_integration_tests/services/test_workflow_draft_variable_service.py b/api/tests/test_containers_integration_tests/services/test_workflow_draft_variable_service.py index 4cef1d30ffa5af..21da6f6d6d82e2 100644 --- a/api/tests/test_containers_integration_tests/services/test_workflow_draft_variable_service.py +++ b/api/tests/test_containers_integration_tests/services/test_workflow_draft_variable_service.py @@ -245,13 +245,13 @@ def test_get_draft_variables_by_selectors_success( var1_value = StringSegment(value=fake.word()) var2_value = StringSegment(value=fake.word()) var3_value = StringSegment(value=fake.word()) - var1 = self._create_test_variable( + self._create_test_variable( db_session_with_containers, app.id, CONVERSATION_VARIABLE_NODE_ID, "var1", var1_value, fake=fake ) - var2 = self._create_test_variable( + self._create_test_variable( db_session_with_containers, app.id, CONVERSATION_VARIABLE_NODE_ID, "var2", var2_value, fake=fake ) - var3 = self._create_test_variable( + self._create_test_variable( db_session_with_containers, app.id, "test_node_1", @@ -380,10 +380,10 @@ def test_list_conversation_variables_success( app = self._create_test_app(db_session_with_containers, mock_external_service_dependencies, fake=fake) conv_var1_value = StringSegment(value=fake.word()) conv_var2_value = StringSegment(value=fake.word()) - conv_var1 = self._create_test_variable( + self._create_test_variable( db_session_with_containers, app.id, CONVERSATION_VARIABLE_NODE_ID, "conv_var1", conv_var1_value, fake=fake ) - conv_var2 = self._create_test_variable( + self._create_test_variable( db_session_with_containers, app.id, CONVERSATION_VARIABLE_NODE_ID, "conv_var2", conv_var2_value, fake=fake ) sys_var_value = StringSegment(value=fake.word()) @@ -828,7 +828,7 @@ def test_list_system_variables_success( app = self._create_test_app(db_session_with_containers, mock_external_service_dependencies, fake=fake) sys_var1_value = StringSegment(value=fake.word()) sys_var2_value = StringSegment(value=fake.word()) - sys_var1 = self._create_test_variable( + self._create_test_variable( db_session_with_containers, app.id, SYSTEM_VARIABLE_NODE_ID, @@ -837,7 +837,7 @@ def test_list_system_variables_success( variable_type=DraftVariableType.SYS, fake=fake, ) - sys_var2 = self._create_test_variable( + self._create_test_variable( db_session_with_containers, app.id, SYSTEM_VARIABLE_NODE_ID, @@ -876,10 +876,10 @@ def test_get_variable_by_name_success( fake = Faker() app = self._create_test_app(db_session_with_containers, mock_external_service_dependencies, fake=fake) test_value = StringSegment(value=fake.word()) - conv_var = self._create_test_variable( + self._create_test_variable( db_session_with_containers, app.id, CONVERSATION_VARIABLE_NODE_ID, "test_conv_var", test_value, fake=fake ) - sys_var = self._create_test_variable( + self._create_test_variable( db_session_with_containers, app.id, SYSTEM_VARIABLE_NODE_ID, @@ -888,7 +888,7 @@ def test_get_variable_by_name_success( variable_type=DraftVariableType.SYS, fake=fake, ) - node_var = self._create_test_variable( + self._create_test_variable( db_session_with_containers, app.id, "test_node", diff --git a/api/tests/test_containers_integration_tests/services/test_workflow_run_service.py b/api/tests/test_containers_integration_tests/services/test_workflow_run_service.py index 18d204998c5849..b37b1a558ea87b 100644 --- a/api/tests/test_containers_integration_tests/services/test_workflow_run_service.py +++ b/api/tests/test_containers_integration_tests/services/test_workflow_run_service.py @@ -135,7 +135,6 @@ def _create_test_workflow_run( Returns: WorkflowRun: Created workflow run instance """ - fake = Faker() # Create workflow run with offset timestamp base_time = datetime.now(UTC) @@ -237,7 +236,7 @@ def test_get_paginate_workflow_runs_success( - Repository method calls """ # Arrange: Create test data - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create multiple workflow runs @@ -284,7 +283,7 @@ def test_get_paginate_workflow_runs_with_last_id( - Repository method calls with proper parameters """ # Arrange: Create test data - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create multiple workflow runs with different timestamps @@ -333,11 +332,11 @@ def test_get_paginate_workflow_runs_default_limit( - Repository method calls with default values """ # Arrange: Create test data - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create workflow runs - workflow_run = self._create_test_workflow_run(db_session_with_containers, app, account, "debugging") + self._create_test_workflow_run(db_session_with_containers, app, account, "debugging") # Act: Execute the method under test without limit args = {} # No limit specified @@ -378,7 +377,7 @@ def test_get_paginate_advanced_chat_workflow_runs_success( - WorkflowWithMessage wrapper functionality """ # Arrange: Create test data - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create workflow runs with messages @@ -387,7 +386,7 @@ def test_get_paginate_advanced_chat_workflow_runs_success( workflow_run = self._create_test_workflow_run( db_session_with_containers, app, account, "debugging", offset_minutes=i ) - message = self._create_test_message(db_session_with_containers, app, account, workflow_run) + self._create_test_message(db_session_with_containers, app, account, workflow_run) workflow_runs.append(workflow_run) # Act: Execute the method under test @@ -429,7 +428,7 @@ def test_get_workflow_run_success( - Repository method calls with proper parameters """ # Arrange: Create test data - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create workflow run @@ -467,7 +466,7 @@ def test_get_workflow_run_not_found( - Return value for missing records """ # Arrange: Create test data - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Use a non-existent UUID @@ -499,7 +498,7 @@ def test_get_workflow_run_node_executions_success( - Context setup for plugin tool providers """ # Arrange: Create test data - fake = Faker() + app, account = self._create_test_app_and_account(db_session_with_containers, mock_external_service_dependencies) # Create workflow run diff --git a/api/tests/test_containers_integration_tests/services/test_workflow_service.py b/api/tests/test_containers_integration_tests/services/test_workflow_service.py index 4c47037dfca01b..d9034162d77ffd 100644 --- a/api/tests/test_containers_integration_tests/services/test_workflow_service.py +++ b/api/tests/test_containers_integration_tests/services/test_workflow_service.py @@ -234,7 +234,7 @@ def test_is_workflow_exist_true(self, db_session_with_containers: Session): fake = Faker() account = self._create_test_account(db_session_with_containers, fake) app = self._create_test_app(db_session_with_containers, fake) - workflow = self._create_test_workflow(db_session_with_containers, app, account, fake) + self._create_test_workflow(db_session_with_containers, app, account, fake) workflow_service = WorkflowService() @@ -820,9 +820,8 @@ def test_sync_draft_workflow_hash_mismatch_error(self, db_session_with_container app = self._create_test_app(db_session_with_containers, fake) # Create existing draft workflow - existing_workflow = self._create_test_workflow(db_session_with_containers, app, account, fake) + self._create_test_workflow(db_session_with_containers, app, account, fake) # Get the actual hash that was generated - original_hash = existing_workflow.unique_hash new_graph = { "nodes": [ @@ -1391,7 +1390,6 @@ def test_update_workflow_ignores_disallowed_fields(self, db_session_with_contain account = self._create_test_account(db_session_with_containers, fake) app = self._create_test_app(db_session_with_containers, fake) workflow = self._create_test_workflow(db_session_with_containers, app, account, fake) - original_name = workflow.marked_name db_session_with_containers.commit() diff --git a/api/tests/test_containers_integration_tests/services/tools/test_api_tools_manage_service.py b/api/tests/test_containers_integration_tests/services/tools/test_api_tools_manage_service.py index 5039875d62ee97..1e71b49838f5d6 100644 --- a/api/tests/test_containers_integration_tests/services/tools/test_api_tools_manage_service.py +++ b/api/tests/test_containers_integration_tests/services/tools/test_api_tools_manage_service.py @@ -457,14 +457,9 @@ def test_create_api_tool_provider_invalid_schema_type( db_session_with_containers, mock_external_service_dependencies ) - provider_name = fake.company() - icon = {"content": "🔧", "background": "#FFF"} - credentials = {"auth_type": "none"} + fake.company() schema_type = "invalid_type" - schema = self._create_test_openapi_schema() - privacy_policy = "https://example.com/privacy" - custom_disclaimer = "Custom disclaimer text" - labels = ["test"] + self._create_test_openapi_schema() # Act & Assert: Try to create provider with invalid schema type with pytest.raises(ValidationError) as exc_info: @@ -630,7 +625,7 @@ def test_delete_api_tool_provider_not_found( self, db_session_with_containers: Session, mock_external_service_dependencies: MockDependencies ) -> None: """Test deletion raises ValueError when provider not found.""" - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -644,8 +639,6 @@ def test_update_api_tool_provider_success( db_session_with_containers: Session, mock_external_service_dependencies: MockDependencies, ) -> None: - fake = Faker() - # Firmware fix for cache.delete() in update flow mock_encrypter = mock_external_service_dependencies["encrypter"] mock_cache = MagicMock() @@ -884,7 +877,7 @@ def test_list_api_tool_provider_tools_not_found( self, db_session_with_containers: Session, mock_external_service_dependencies: MockDependencies ) -> None: """Test listing tools raises ValueError when provider not found.""" - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -896,7 +889,7 @@ def test_test_api_tool_preview_invalid_schema_type( self, db_session_with_containers: Session, mock_external_service_dependencies: MockDependencies ) -> None: """Test preview raises ValueError for invalid schema type.""" - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) diff --git a/api/tests/test_containers_integration_tests/services/tools/test_mcp_tools_manage_service.py b/api/tests/test_containers_integration_tests/services/tools/test_mcp_tools_manage_service.py index ba2ae62a053743..a32127b9d9c005 100644 --- a/api/tests/test_containers_integration_tests/services/tools/test_mcp_tools_manage_service.py +++ b/api/tests/test_containers_integration_tests/services/tools/test_mcp_tools_manage_service.py @@ -140,7 +140,7 @@ def test_get_mcp_provider_by_provider_id_success( - Proper error handling for non-existent providers """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -203,7 +203,7 @@ def test_get_mcp_provider_by_provider_id_tenant_isolation( - Security boundaries are maintained """ # Arrange: Create test data for two tenants - fake = Faker() + account1, tenant1 = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -235,7 +235,7 @@ def test_get_mcp_provider_by_server_identifier_success( - Proper error handling for non-existent server identifiers """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -300,7 +300,7 @@ def test_get_mcp_provider_by_server_identifier_tenant_isolation( - Security boundaries are maintained """ # Arrange: Create test data for two tenants - fake = Faker() + account1, tenant1 = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -334,7 +334,7 @@ def test_create_mcp_provider_success(self, db_session_with_containers: Session, - Return value correctness """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -415,7 +415,7 @@ def test_create_mcp_provider_duplicate_name( - Database integrity constraints """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -468,7 +468,7 @@ def test_create_mcp_provider_duplicate_server_url( - URL hash uniqueness enforcement """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -521,7 +521,7 @@ def test_create_mcp_provider_duplicate_server_identifier( - Server identifier uniqueness enforcement """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -573,7 +573,7 @@ def test_retrieve_mcp_tools_success(self, db_session_with_containers: Session, m - Empty list handling for tenants with no providers """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -667,7 +667,7 @@ def test_retrieve_mcp_tools_empty_list( - No transformation service calls for empty lists """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -699,7 +699,7 @@ def test_retrieve_mcp_tools_tenant_isolation( - Security boundaries are maintained """ # Arrange: Create test data for two tenants - fake = Faker() + account1, tenant1 = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -772,7 +772,7 @@ def test_list_mcp_tool_from_remote_server_success( - Return value correctness """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -843,7 +843,7 @@ def test_list_mcp_tool_from_remote_server_auth_error( - Database state remains unchanged """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -895,7 +895,7 @@ def test_list_mcp_tool_from_remote_server_connection_error( - Database state remains unchanged """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -945,7 +945,7 @@ def test_delete_mcp_tool_success(self, db_session_with_containers: Session, mock - Database state after deletion """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -1003,7 +1003,7 @@ def test_delete_mcp_tool_tenant_isolation( - Security boundaries are maintained """ # Arrange: Create test data for two tenants - fake = Faker() + account1, tenant1 = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -1038,7 +1038,7 @@ def test_update_mcp_provider_success(self, db_session_with_containers: Session, - External service integration """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -1047,8 +1047,6 @@ def test_update_mcp_provider_success(self, db_session_with_containers: Session, mcp_provider = self._create_test_mcp_provider( db_session_with_containers, mock_external_service_dependencies, tenant.id, account.id ) - original_name = mcp_provider.name - original_icon = mcp_provider.icon db_session_with_containers.commit() @@ -1098,7 +1096,7 @@ def test_update_mcp_provider_duplicate_name( - Database integrity constraints """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -1149,7 +1147,7 @@ def test_update_mcp_provider_credentials_success( - External service integration """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -1210,7 +1208,7 @@ def test_update_mcp_provider_credentials_not_authed( - Credentials are still updated """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -1265,7 +1263,7 @@ def test_re_connect_mcp_provider_success( - Proper error handling for authentication errors """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -1328,7 +1326,7 @@ def test_re_connect_mcp_provider_auth_error( - Tools list is cleared """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -1370,7 +1368,7 @@ def test_re_connect_mcp_provider_connection_error( - Correct exception type and message """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) diff --git a/api/tests/test_containers_integration_tests/services/tools/test_workflow_tools_manage_service.py b/api/tests/test_containers_integration_tests/services/tools/test_workflow_tools_manage_service.py index 80dc32ec3faa36..9469f9dbd7b649 100644 --- a/api/tests/test_containers_integration_tests/services/tools/test_workflow_tools_manage_service.py +++ b/api/tests/test_containers_integration_tests/services/tools/test_workflow_tools_manage_service.py @@ -1037,7 +1037,7 @@ def test_create_workflow_tool_db_commit_before_validation( # Verify the tool was NOT created in database # This is the expected behavior (no pollution) - tool_count = ( + ( db_session_with_containers.query(WorkflowToolProvider) .where( WorkflowToolProvider.tenant_id == account.current_tenant.id, @@ -1092,7 +1092,7 @@ def test_list_tenant_workflow_tools_empty( self, db_session_with_containers: Session, mock_external_service_dependencies ): """Test listing workflow tools when none exist returns empty list.""" - fake = Faker() + app, account, workflow = self._create_test_app_and_account( db_session_with_containers, mock_external_service_dependencies ) diff --git a/api/tests/test_containers_integration_tests/services/workflow/test_workflow_converter.py b/api/tests/test_containers_integration_tests/services/workflow/test_workflow_converter.py index dfddf26ddf6dbb..63e2b94d8308c8 100644 --- a/api/tests/test_containers_integration_tests/services/workflow/test_workflow_converter.py +++ b/api/tests/test_containers_integration_tests/services/workflow/test_workflow_converter.py @@ -202,7 +202,7 @@ def test_convert_to_workflow_success(self, db_session_with_containers: Session, - Workflow creation with correct configuration """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -315,7 +315,7 @@ def test_convert_app_model_config_to_workflow_success( - Database state management """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -429,7 +429,7 @@ def test_convert_to_http_request_node_success( - External data variable mapping """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) @@ -508,7 +508,7 @@ def test_convert_to_knowledge_retrieval_node_success( - Query variable selector setup """ # Arrange: Create test data - fake = Faker() + account, tenant = self._create_test_account_and_tenant( db_session_with_containers, mock_external_service_dependencies ) diff --git a/api/tests/test_containers_integration_tests/tasks/test_batch_clean_document_task.py b/api/tests/test_containers_integration_tests/tasks/test_batch_clean_document_task.py index 9476bd9a0c0243..d325867a391f3e 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_batch_clean_document_task.py +++ b/api/tests/test_containers_integration_tests/tasks/test_batch_clean_document_task.py @@ -590,7 +590,7 @@ def test_batch_clean_document_task_different_doc_forms( ) assert deleted_segment is None - except Exception as e: + except Exception: # If the task fails due to external service issues (e.g., plugin daemon), # we should still verify that the database state is consistent # This is a common scenario in test environments where external services may not be available diff --git a/api/tests/test_containers_integration_tests/tasks/test_clean_dataset_task.py b/api/tests/test_containers_integration_tests/tasks/test_clean_dataset_task.py index d311cbfc4c8d89..ba8ab523f9c0b7 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_clean_dataset_task.py +++ b/api/tests/test_containers_integration_tests/tasks/test_clean_dataset_task.py @@ -480,7 +480,7 @@ def test_clean_dataset_task_success_with_invalid_doc_form( # Create a document and segment document = self._create_test_document(db_session_with_containers, account, tenant, dataset) - segment = self._create_test_segment(db_session_with_containers, account, tenant, dataset, document) + self._create_test_segment(db_session_with_containers, account, tenant, dataset, document) # Execute the task with invalid doc_form values test_cases = [None, "", " ", "\t\n"] @@ -516,7 +516,7 @@ def test_clean_dataset_task_success_with_invalid_doc_form( # Recreate data for next test case document = self._create_test_document(db_session_with_containers, account, tenant, dataset) - segment = self._create_test_segment(db_session_with_containers, account, tenant, dataset, document) + self._create_test_segment(db_session_with_containers, account, tenant, dataset, document) # Verify that IndexProcessorFactory was called with default type mock_factory = mock_external_service_dependencies["index_processor_factory"] @@ -540,7 +540,7 @@ def test_clean_dataset_task_error_handling_and_rollback( account, tenant = self._create_test_account_and_tenant(db_session_with_containers) dataset = self._create_test_dataset(db_session_with_containers, account, tenant) document = self._create_test_document(db_session_with_containers, account, tenant, dataset) - segment = self._create_test_segment(db_session_with_containers, account, tenant, dataset, document) + self._create_test_segment(db_session_with_containers, account, tenant, dataset, document) # Mock IndexProcessorFactory to raise an exception mock_index_processor = mock_external_service_dependencies["index_processor"] @@ -826,7 +826,7 @@ def test_clean_dataset_task_storage_exception_handling( account, tenant = self._create_test_account_and_tenant(db_session_with_containers) dataset = self._create_test_dataset(db_session_with_containers, account, tenant) document = self._create_test_document(db_session_with_containers, account, tenant, dataset) - segment = self._create_test_segment(db_session_with_containers, account, tenant, dataset, document) + self._create_test_segment(db_session_with_containers, account, tenant, dataset, document) upload_file = self._create_test_upload_file(db_session_with_containers, account, tenant) # Update document with file reference diff --git a/api/tests/test_containers_integration_tests/tasks/test_clean_notion_document_task.py b/api/tests/test_containers_integration_tests/tasks/test_clean_notion_document_task.py index bcd57495825dd8..ac43b65acdf0e6 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_clean_notion_document_task.py +++ b/api/tests/test_containers_integration_tests/tasks/test_clean_notion_document_task.py @@ -167,7 +167,7 @@ def test_clean_notion_document_task_dataset_not_found( This test verifies that the task properly handles the case where the specified dataset does not exist in the database. """ - fake = Faker() + non_existent_dataset_id = str(uuid.uuid4()) document_ids = [str(uuid.uuid4()), str(uuid.uuid4())] @@ -475,7 +475,7 @@ def test_clean_notion_document_task_partial_document_cleanup( # Clean up only first 3 documents documents_to_clean = [doc.id for doc in documents[:3]] segments_to_clean = [seg for seg in all_segments if seg.document_id in documents_to_clean] - index_node_ids_to_clean = [seg.index_node_id for seg in segments_to_clean] + [seg.index_node_id for seg in segments_to_clean] clean_notion_document_task(documents_to_clean, dataset.id) @@ -885,7 +885,7 @@ def test_clean_notion_document_task_with_documents_from_different_tenants( target_dataset = datasets[0] target_document = all_documents[0] target_segments = [seg for seg in all_segments if seg.dataset_id == target_dataset.id] - target_index_node_ids = [seg.index_node_id for seg in target_segments] + [seg.index_node_id for seg in target_segments] clean_notion_document_task([target_document.id], target_dataset.id) diff --git a/api/tests/test_containers_integration_tests/tasks/test_dataset_indexing_task.py b/api/tests/test_containers_integration_tests/tasks/test_dataset_indexing_task.py index 0e18308b391987..fa5496ee03c99b 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_dataset_indexing_task.py +++ b/api/tests/test_containers_integration_tests/tasks/test_dataset_indexing_task.py @@ -602,7 +602,7 @@ def test_billing_disabled_skips_limit_checks( db_session_with_containers, document_ids=large_document_ids, ) - features = patched_external_dependencies["features"] + patched_external_dependencies["features"] # Act _document_indexing(dataset.id, large_document_ids) diff --git a/api/tests/test_containers_integration_tests/tasks/test_delete_segment_from_index_task.py b/api/tests/test_containers_integration_tests/tasks/test_delete_segment_from_index_task.py index edd23ca2b684be..9ab88957de0122 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_delete_segment_from_index_task.py +++ b/api/tests/test_containers_integration_tests/tasks/test_delete_segment_from_index_task.py @@ -210,7 +210,7 @@ def _create_test_document_segments( segments = [] for i in range(count): - created_at = fake.date_time_this_year() + fake.date_time_this_year() segment = DocumentSegment( tenant_id=document.tenant_id, dataset_id=document.dataset_id, diff --git a/api/tests/test_containers_integration_tests/tasks/test_document_indexing_task.py b/api/tests/test_containers_integration_tests/tasks/test_document_indexing_task.py index 613bb04e012dfe..c48929bb83c828 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_document_indexing_task.py +++ b/api/tests/test_containers_integration_tests/tasks/test_document_indexing_task.py @@ -881,9 +881,8 @@ def test_document_indexing_with_tenant_queue_tenant_isolation( tenant1_id = dataset1.tenant_id tenant2_id = dataset2.tenant_id dataset1_id = dataset1.id - dataset2_id = dataset2.id document_ids1 = [doc.id for doc in documents1] - document_ids2 = [doc.id for doc in documents2] + [doc.id for doc in documents2] # Mock the task function from unittest.mock import MagicMock diff --git a/api/tests/test_containers_integration_tests/tasks/test_mail_change_mail_task.py b/api/tests/test_containers_integration_tests/tasks/test_mail_change_mail_task.py index a697878bb6092f..4fdf367d7164c4 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_mail_change_mail_task.py +++ b/api/tests/test_containers_integration_tests/tasks/test_mail_change_mail_task.py @@ -115,7 +115,7 @@ def test_send_change_mail_task_success_new_email_phase( - Successful task completion """ # Arrange: Create test data - account = self._create_test_account(db_session_with_containers) + self._create_test_account(db_session_with_containers) test_language = "zh-Hans" test_email = "new@example.com" test_code = "789012" diff --git a/api/tests/test_containers_integration_tests/tasks/test_mail_email_code_login_task.py b/api/tests/test_containers_integration_tests/tasks/test_mail_email_code_login_task.py index 567bd44b930b33..dfbfd467bfe8e1 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_mail_email_code_login_task.py +++ b/api/tests/test_containers_integration_tests/tasks/test_mail_email_code_login_task.py @@ -403,7 +403,7 @@ def test_send_email_code_login_mail_task_edge_cases( 4. Process extreme language codes """ # Arrange: Setup test data - fake = Faker() + test_language = "en-US" # Edge case test data diff --git a/api/tests/test_containers_integration_tests/tasks/test_rag_pipeline_run_tasks.py b/api/tests/test_containers_integration_tests/tasks/test_rag_pipeline_run_tasks.py index 8311ce967367ac..545391e4e7a5ea 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_rag_pipeline_run_tasks.py +++ b/api/tests/test_containers_integration_tests/tasks/test_rag_pipeline_run_tasks.py @@ -613,7 +613,7 @@ def test_priority_rag_pipeline_run_task_tenant_isolation( # Mock file service file_id1 = str(uuid.uuid4()) - file_id2 = str(uuid.uuid4()) + str(uuid.uuid4()) mock_file_service["get_content"].side_effect = [file_content1, file_content2] # Use real Redis for TenantIsolatedTaskQueue @@ -680,7 +680,7 @@ def test_rag_pipeline_run_task_tenant_isolation( # Mock file service file_id1 = str(uuid.uuid4()) - file_id2 = str(uuid.uuid4()) + str(uuid.uuid4()) mock_file_service["get_content"].side_effect = [file_content1, file_content2] # Use real Redis for TenantIsolatedTaskQueue @@ -772,7 +772,7 @@ def test_run_single_rag_pipeline_task_entity_validation_error( - Function raises ValueError for missing entities """ # Arrange: Create entity data with valid UUIDs but non-existent entities - fake = Faker() + invalid_entity_data = { "pipeline_id": str(uuid.uuid4()), "application_generate_entity": { @@ -817,7 +817,7 @@ def test_run_single_rag_pipeline_task_database_entity_not_found( - Function raises ValueError for missing entities """ # Arrange: Create test data with non-existent IDs - fake = Faker() + entity_data = { "pipeline_id": str(uuid.uuid4()), "application_generate_entity": { diff --git a/api/tests/test_containers_integration_tests/test_workflow_pause_integration.py b/api/tests/test_containers_integration_tests/test_workflow_pause_integration.py index d9bbf54150cc01..6e4ac8c0aef6dd 100644 --- a/api/tests/test_containers_integration_tests/test_workflow_pause_integration.py +++ b/api/tests/test_containers_integration_tests/test_workflow_pause_integration.py @@ -858,7 +858,7 @@ def test_file_cleanup_on_pause_deletion(self): assert deleted_pause is None try: - content = storage.load(file_key).decode() + storage.load(file_key).decode() pytest.fail("File should be deleted from storage after pause deletion") except FileNotFoundError: # This is expected - file should be deleted from storage diff --git a/api/tests/unit_tests/clients/agent_backend/test_request_builder.py b/api/tests/unit_tests/clients/agent_backend/test_request_builder.py index 4c86737cba0069..c6f2b7724a3235 100644 --- a/api/tests/unit_tests/clients/agent_backend/test_request_builder.py +++ b/api/tests/unit_tests/clients/agent_backend/test_request_builder.py @@ -89,7 +89,7 @@ def test_request_builder_outputs_dify_agent_create_run_request() -> None: def test_request_builder_separates_agent_soul_and_workflow_job_prompt() -> None: request = AgentBackendRunRequestBuilder().build_for_workflow_node(_run_input()) - layers = {layer.name: layer for layer in request.composition.layers} + {layer.name: layer for layer in request.composition.layers} dumped = request.model_dump(mode="json") assert dumped["composition"]["layers"][0]["config"]["prefix"] == "You are a careful reviewer." diff --git a/api/tests/unit_tests/commands/test_legacy_model_type_migration.py b/api/tests/unit_tests/commands/test_legacy_model_type_migration.py index 6ebac69bcbaf7e..70e5774d92d1ab 100644 --- a/api/tests/unit_tests/commands/test_legacy_model_type_migration.py +++ b/api/tests/unit_tests/commands/test_legacy_model_type_migration.py @@ -63,7 +63,7 @@ def dirty_fixture(sqlite_engine: sa.Engine) -> DirtyDataFixture: def command_module() -> ModuleType: try: return importlib.import_module("commands.data_migration") - except ModuleNotFoundError as exc: # pragma: no cover - explicit TDD failure path + except ModuleNotFoundError: # pragma: no cover - explicit TDD failure path pytest.fail( "commands.data_migration is missing. " "Implement the `flask data-migrate legacy-model-types` command group before running these tests." diff --git a/api/tests/unit_tests/controllers/console/app/test_annotation_security.py b/api/tests/unit_tests/controllers/console/app/test_annotation_security.py index 9d0f6c33cc5dc8..3bddfc2100baa8 100644 --- a/api/tests/unit_tests/controllers/console/app/test_annotation_security.py +++ b/api/tests/unit_tests/controllers/console/app/test_annotation_security.py @@ -189,21 +189,21 @@ def test_file_size_limit_enforced(self): max_size = dify_config.ANNOTATION_IMPORT_FILE_SIZE_LIMIT * 1024 * 1024 large_content = b"x" * (max_size + 1024) # Exceed by 1KB - file = FileStorage(stream=io.BytesIO(large_content), filename="test.csv", content_type="text/csv") + FileStorage(stream=io.BytesIO(large_content), filename="test.csv", content_type="text/csv") # Should be rejected in controller # This would be tested in integration tests with actual endpoint def test_empty_file_rejected(self): """Test that empty files are rejected.""" - file = FileStorage(stream=io.BytesIO(b""), filename="test.csv", content_type="text/csv") + FileStorage(stream=io.BytesIO(b""), filename="test.csv", content_type="text/csv") # Should be rejected # This would be tested in integration tests def test_non_csv_file_rejected(self): """Test that non-CSV files are rejected.""" - file = FileStorage(stream=io.BytesIO(b"test"), filename="test.txt", content_type="text/plain") + FileStorage(stream=io.BytesIO(b"test"), filename="test.txt", content_type="text/plain") # Should be rejected based on extension # This would be tested in integration tests @@ -229,7 +229,7 @@ def test_max_records_limit_enforced(self, sqlite_session: Session): with patch("services.annotation_service.current_account_with_tenant") as mock_auth: mock_auth.return_value = (_account(), "tenant_id") - with patch("services.annotation_service.FeatureService") as mock_features: + with patch("services.annotation_service.FeatureService"): result = AppAnnotationService.batch_import_app_annotations("app_id", file, sqlite_session) # Should return error about too many records @@ -286,8 +286,8 @@ def test_valid_import_succeeds(self, sqlite_session: Session): with patch("services.annotation_service.current_account_with_tenant") as mock_auth: mock_auth.return_value = (_account(), "tenant_id") - with patch("services.annotation_service.FeatureService") as mock_features: - with patch("services.annotation_service.batch_import_annotations_task") as mock_task: + with patch("services.annotation_service.FeatureService"): + with patch("services.annotation_service.batch_import_annotations_task"): with patch("services.annotation_service.redis_client"): result = AppAnnotationService.batch_import_app_annotations("app_id", file, sqlite_session) diff --git a/api/tests/unit_tests/controllers/console/app/test_generator_api.py b/api/tests/unit_tests/controllers/console/app/test_generator_api.py index 94371295601385..f9305dfaeed78a 100644 --- a/api/tests/unit_tests/controllers/console/app/test_generator_api.py +++ b/api/tests/unit_tests/controllers/console/app/test_generator_api.py @@ -129,7 +129,7 @@ def test_instruction_generate_workflow_not_found( api = generator_module.InstructionGenerateApi() method = unwrap(api.post) - app_model = _persist_app(sqlite_session) + _persist_app(sqlite_session) _install_workflow_service(monkeypatch, workflow=None) with app.test_request_context( @@ -157,7 +157,7 @@ def test_instruction_generate_node_missing( api = generator_module.InstructionGenerateApi() method = unwrap(api.post) - app_model = _persist_app(sqlite_session) + _persist_app(sqlite_session) workflow = _workflow({"nodes": []}) _install_workflow_service(monkeypatch, workflow=workflow) diff --git a/api/tests/unit_tests/controllers/console/app/workflow_draft_variables_test.py b/api/tests/unit_tests/controllers/console/app/workflow_draft_variables_test.py index 709ae1e72a4d62..0c62e2b4c00839 100644 --- a/api/tests/unit_tests/controllers/console/app/workflow_draft_variables_test.py +++ b/api/tests/unit_tests/controllers/console/app/workflow_draft_variables_test.py @@ -74,7 +74,7 @@ def test_serialize_full_content_should_raises_when_file_id_exists_but_file_is_no draft_var.file_id = str(uuid.uuid4()) draft_var.variable_file = None with pytest.raises(AssertionError): - result = _serialize_full_content(draft_var) + _serialize_full_content(draft_var) def test_conversation_variable(self): conv_var = WorkflowDraftVariable.new_conversation_variable( diff --git a/api/tests/unit_tests/controllers/openapi/test_auth_matrix.py b/api/tests/unit_tests/controllers/openapi/test_auth_matrix.py index a43cd441f64f92..6eafdd198f5e92 100644 --- a/api/tests/unit_tests/controllers/openapi/test_auth_matrix.py +++ b/api/tests/unit_tests/controllers/openapi/test_auth_matrix.py @@ -1756,7 +1756,6 @@ def _run_case( token_rows: dict[str, ResolvedRow], monkeypatch: pytest.MonkeyPatch, ) -> TestResponse: - edition = scenario.edition or ( DeploymentEdition.ENTERPRISE if Trait.ENTERPRISE_ONLY in route.traits else DeploymentEdition.COMMUNITY ) diff --git a/api/tests/unit_tests/controllers/service_api/app/test_annotation.py b/api/tests/unit_tests/controllers/service_api/app/test_annotation.py index 71aa6e222b8381..aac8c6ec626d52 100644 --- a/api/tests/unit_tests/controllers/service_api/app/test_annotation.py +++ b/api/tests/unit_tests/controllers/service_api/app/test_annotation.py @@ -228,7 +228,6 @@ def test_missing_job(self, monkeypatch: pytest.MonkeyPatch) -> None: handler(api, app_model=app_model, job_id="j1", action="enable") def test_error(self, monkeypatch: pytest.MonkeyPatch) -> None: - def _get(key): if "error" in key: return b"oops" diff --git a/api/tests/unit_tests/controllers/service_api/app/test_audio.py b/api/tests/unit_tests/controllers/service_api/app/test_audio.py index ece7d3381b5f7d..40afc2e4e66557 100644 --- a/api/tests/unit_tests/controllers/service_api/app/test_audio.py +++ b/api/tests/unit_tests/controllers/service_api/app/test_audio.py @@ -323,10 +323,22 @@ def fake_transcript_tts(**kwargs): assert calls["message_ref"] == MessageRef(AppRef("tenant-1", "a1"), "message-1", end_user_id="end-user-1") assert calls["session"] is sqlite_session - def test_error_mapping(self, app: Flask, monkeypatch: pytest.MonkeyPatch, sqlite_session: Session) -> None: - monkeypatch.setattr( - AudioService, "transcript_tts", lambda **_kwargs: (_ for _ in ()).throw(QuotaExceededError()) - ) + @pytest.mark.parametrize( + ("exc", "expected"), + [ + (QuotaExceededError(), ProviderQuotaExceededError), + (RuntimeError("internal provider failure"), InternalServerError), + ], + ) + def test_error_mapping( + self, + app: Flask, + monkeypatch: pytest.MonkeyPatch, + sqlite_session: Session, + exc: Exception, + expected: type[Exception], + ) -> None: + monkeypatch.setattr(AudioService, "transcript_tts", Mock(side_effect=exc)) api = TextApi() handler = unwrap(api.post) @@ -335,5 +347,5 @@ def test_error_mapping(self, app: Flask, monkeypatch: pytest.MonkeyPatch, sqlite with app.test_request_context("/text-to-audio", method="POST", json={"text": "hello"}): payload = TextToAudioPayload.model_validate(request.get_json() or {}) - with pytest.raises(ProviderQuotaExceededError): + with pytest.raises(expected): handler(api, payload, sqlite_session, app_model=app_model, end_user=end_user) diff --git a/api/tests/unit_tests/controllers/service_api/app/test_completion.py b/api/tests/unit_tests/controllers/service_api/app/test_completion.py index 1042fab9f05b75..3885c56259f59d 100644 --- a/api/tests/unit_tests/controllers/service_api/app/test_completion.py +++ b/api/tests/unit_tests/controllers/service_api/app/test_completion.py @@ -596,7 +596,7 @@ def test_maps_rate_limits_by_source( def test_rejects_sandbox_plan_workflow_version( self, app: Flask, monkeypatch: pytest.MonkeyPatch, orm_session: Session ) -> None: - completion_module = sys.modules["controllers.service_api.app.completion"] + sys.modules["controllers.service_api.app.completion"] apply_config_overrides(monkeypatch, DEPLOYMENT_EDITION=DeploymentEdition.CLOUD) billing_get_info = Mock(return_value={"subscription": {"plan": CloudPlan.SANDBOX}}) diff --git a/api/tests/unit_tests/controllers/service_api/app/test_workflow.py b/api/tests/unit_tests/controllers/service_api/app/test_workflow.py index 1f8e56a348f2e2..c0bb353fa4fbab 100644 --- a/api/tests/unit_tests/controllers/service_api/app/test_workflow.py +++ b/api/tests/unit_tests/controllers/service_api/app/test_workflow.py @@ -523,7 +523,7 @@ def test_sandbox_billing_does_not_gate_default_workflow_run( config_overrides: Callable[..., None], ) -> None: config_overrides(DEPLOYMENT_EDITION=DeploymentEdition.CLOUD) - workflow_module = sys.modules["controllers.service_api.app.workflow"] + sys.modules["controllers.service_api.app.workflow"] billing_get_info = Mock(return_value={"subscription": {"plan": CloudPlan.SANDBOX}}) generate = Mock(return_value={"result": "ok"}) @@ -582,7 +582,7 @@ def test_rejects_sandbox_plan_with_upgrade_error( config_overrides: Callable[..., None], ) -> None: config_overrides(DEPLOYMENT_EDITION=DeploymentEdition.CLOUD) - workflow_module = sys.modules["controllers.service_api.app.workflow"] + sys.modules["controllers.service_api.app.workflow"] billing_get_info = Mock(return_value={"subscription": {"plan": CloudPlan.SANDBOX}}) generate = Mock() @@ -669,7 +669,7 @@ def test_not_found( config_overrides: Callable[..., None], ) -> None: config_overrides(DEPLOYMENT_EDITION=DeploymentEdition.COMMUNITY) - workflow_module = sys.modules["controllers.service_api.app.workflow"] + sys.modules["controllers.service_api.app.workflow"] monkeypatch.setattr( AppGenerateService, "generate", @@ -694,7 +694,7 @@ def test_draft_workflow( config_overrides: Callable[..., None], ) -> None: config_overrides(DEPLOYMENT_EDITION=DeploymentEdition.COMMUNITY) - workflow_module = sys.modules["controllers.service_api.app.workflow"] + sys.modules["controllers.service_api.app.workflow"] monkeypatch.setattr( AppGenerateService, "generate", diff --git a/api/tests/unit_tests/controllers/web/test_audio.py b/api/tests/unit_tests/controllers/web/test_audio.py index 79c7ecc8589c9a..3163c106836da6 100644 --- a/api/tests/unit_tests/controllers/web/test_audio.py +++ b/api/tests/unit_tests/controllers/web/test_audio.py @@ -8,6 +8,7 @@ import pytest from flask import Flask, Response from sqlalchemy.orm import Session +from werkzeug.exceptions import InternalServerError from controllers.web.audio import AudioApi, TextApi, TextToAudioPayload from controllers.web.error import ( @@ -132,6 +133,7 @@ def test_invalid_upload_or_disabled_feature( (ProviderTokenNotInitError(description="no token"), ProviderNotInitializeError), (QuotaExceededError(), ProviderQuotaExceededError), (ModelCurrentlyNotSupportError(), ProviderModelCurrentlyNotSupportError), + (RuntimeError("internal provider failure"), InternalServerError), ], ) def test_provider_failure_mapping( @@ -241,8 +243,22 @@ def test_owned_message_ref( if owner != "current": assert audio_runtime.resolutions == [] - def test_invoke_error_mapped(self, app: Flask, web_app: App, audio_runtime: AudioRuntimeObservations) -> None: - audio_runtime.lookup_error = InvokeError(description="invoke failed") + @pytest.mark.parametrize( + ("provider_error", "expected_error"), + [ + (InvokeError(description="invoke failed"), CompletionRequestError), + (RuntimeError("internal provider failure"), InternalServerError), + ], + ) + def test_provider_failure_mapping( + self, + provider_error: Exception, + expected_error: type[Exception], + app: Flask, + web_app: App, + audio_runtime: AudioRuntimeObservations, + ) -> None: + audio_runtime.lookup_error = provider_error with app.test_request_context("/text-to-audio", method="POST", json={"text": "hello"}): - with pytest.raises(CompletionRequestError): + with pytest.raises(expected_error): TextApi().post(web_app, _end_user()) diff --git a/api/tests/unit_tests/controllers/web/test_completion.py b/api/tests/unit_tests/controllers/web/test_completion.py index 73f2ce6d20c53e..a9e8c595ea3f34 100644 --- a/api/tests/unit_tests/controllers/web/test_completion.py +++ b/api/tests/unit_tests/controllers/web/test_completion.py @@ -9,6 +9,7 @@ import pytest from flask import Flask from sqlalchemy.orm import Session +from werkzeug.exceptions import InternalServerError from controllers.web.completion import ChatApi, ChatStopApi, CompletionApi, CompletionStopApi from controllers.web.error import ( @@ -43,6 +44,32 @@ def _end_user() -> EndUser: return make_end_user(end_user_id="eu-1", app_id="app-1", name="Web User") +@pytest.mark.parametrize( + ("resource", "mode", "path"), + [ + (CompletionApi, AppMode.COMPLETION, "/completion-messages"), + (ChatApi, AppMode.CHAT, "/chat-messages"), + ], +) +def test_unexpected_generation_error_hides_internal_details( + app: Flask, + resource: type[CompletionApi | ChatApi], + mode: AppMode, + path: str, +) -> None: + error = RuntimeError("internal provider failure") + with ( + patch("controllers.web.completion.AppGenerateService.generate", side_effect=error), + app.test_request_context(path, method="POST", json={"inputs": {}, "query": "hello"}), + pytest.raises(InternalServerError) as exc_info, + ): + resource().post(_app(mode), _end_user()) + + assert exc_info.value.code == 500 + assert "internal provider failure" not in str(exc_info.value) + assert exc_info.value.__context__ is error + + # --------------------------------------------------------------------------- # CompletionApi # --------------------------------------------------------------------------- diff --git a/api/tests/unit_tests/core/app/apps/pipeline/test_pipeline_generator.py b/api/tests/unit_tests/core/app/apps/pipeline/test_pipeline_generator.py index de16f2dc540069..62452031061400 100644 --- a/api/tests/unit_tests/core/app/apps/pipeline/test_pipeline_generator.py +++ b/api/tests/unit_tests/core/app/apps/pipeline/test_pipeline_generator.py @@ -628,7 +628,7 @@ def test_single_loop_generate_success( def test_handle_response_value_error_triggers_generate_task_stopped(generator, mocker: MockerFixture): - pipeline = _build_pipeline() + _build_pipeline() workflow = _build_workflow() app_entity = FakeRagPipelineGenerateEntity(task_id="t") diff --git a/api/tests/unit_tests/core/app/features/rate_limiting/test_rate_limit.py b/api/tests/unit_tests/core/app/features/rate_limiting/test_rate_limit.py index 538b130cace2b7..220f695f4bc9ac 100644 --- a/api/tests/unit_tests/core/app/features/rate_limiting/test_rate_limit.py +++ b/api/tests/unit_tests/core/app/features/rate_limiting/test_rate_limit.py @@ -131,7 +131,7 @@ def test_should_set_redis_keys_on_first_flush(self, redis_patch): } ) - rate_limit = RateLimit("test_client", 5) + RateLimit("test_client", 5) expected_max_key = "dify:rate_limit:test_client:max_active_requests" redis_patch.setex.assert_called_with(expected_max_key, timedelta(days=1), 5) @@ -565,7 +565,6 @@ def _create_mock_redis(self): import threading lock = threading.Lock() - data = {} hashes = {} def mock_hlen(key): diff --git a/api/tests/unit_tests/core/callback_handler/test_index_tool_callback_handler.py b/api/tests/unit_tests/core/callback_handler/test_index_tool_callback_handler.py index 2808da27236ab4..90def3492fca4e 100644 --- a/api/tests/unit_tests/core/callback_handler/test_index_tool_callback_handler.py +++ b/api/tests/unit_tests/core/callback_handler/test_index_tool_callback_handler.py @@ -266,7 +266,7 @@ def test_on_tool_end_empty_documents( class TestReturnRetrieverResourceInfo: def test_publish_called(self, handler: DatasetIndexToolCallbackHandler, mock_queue_manager, mocker: MockerFixture): - mock_event = mocker.patch("core.callback_handler.index_tool_callback_handler.QueueRetrieverResourcesEvent") + mocker.patch("core.callback_handler.index_tool_callback_handler.QueueRetrieverResourcesEvent") resources = [mocker.Mock()] handler.return_retriever_resource_info(resources) diff --git a/api/tests/unit_tests/core/datasource/test_file_upload.py b/api/tests/unit_tests/core/datasource/test_file_upload.py index 130036b249e294..1dd5ddd568047b 100644 --- a/api/tests/unit_tests/core/datasource/test_file_upload.py +++ b/api/tests/unit_tests/core/datasource/test_file_upload.py @@ -359,7 +359,6 @@ def test_no_virus_scanning_currently_implemented(self) -> None: # When virus scanning is added, this test should be updated # Arrange - content = b"This could be any content" # Act - No virus scanning function exists yet # This is a placeholder for future implementation diff --git a/api/tests/unit_tests/core/datasource/test_notion_provider.py b/api/tests/unit_tests/core/datasource/test_notion_provider.py index 6a137a1b7ca032..141c801fcf003b 100644 --- a/api/tests/unit_tests/core/datasource/test_notion_provider.py +++ b/api/tests/unit_tests/core/datasource/test_notion_provider.py @@ -1119,7 +1119,7 @@ def test_read_block_skip_child_page(self, mock_request: Mock, extractor: NotionE mock_request.return_value = httpx.Response(200, json=mock_data) # Act - result = extractor._read_block("block-parent") + extractor._read_block("block-parent") # Assert # Should only be called once (no recursion for child_page) diff --git a/api/tests/unit_tests/core/datasource/test_website_crawl.py b/api/tests/unit_tests/core/datasource/test_website_crawl.py index ed99d4896731d9..20b8fd320894e1 100644 --- a/api/tests/unit_tests/core/datasource/test_website_crawl.py +++ b/api/tests/unit_tests/core/datasource/test_website_crawl.py @@ -195,7 +195,7 @@ def test_get_website_crawl(self, mock_datasource_entity: DatasourceEntity, mocke datasource_params = {"url": "https://example.com", "max_depth": 2} - result = plugin.get_website_crawl( + plugin.get_website_crawl( user_id="test_user", datasource_parameters=datasource_params, provider_type="watercrawl" ) @@ -576,7 +576,7 @@ def test_crawl_url_jinareader( } mock_response = httpx.Response(200, json={"code": 200, "data": {"taskId": "task-789"}}) - mock_httpx_post = mocker.patch( + mocker.patch( "services.data_source.website_service._adaptive_http_client.post", return_value=mock_response, ) @@ -724,7 +724,6 @@ def test_watercrawl_provider_respects_robots_txt(self, mocker: MockerFixture) -> This test verifies the provider is initialized correctly. """ mock_client = mocker.patch("core.rag.extractor.watercrawl.provider.WaterCrawlAPIClient") - mock_instance = mock_client.return_value provider = WaterCrawlProvider(api_key="test_key", base_url="https://app.watercrawl.dev/") @@ -779,7 +778,7 @@ class TestContentExtraction: def test_structure_data_with_metadata(self, mocker: MockerFixture) -> None: """Test that content is properly structured with metadata.""" - mock_client = mocker.patch("core.rag.extractor.watercrawl.provider.WaterCrawlAPIClient") + mocker.patch("core.rag.extractor.watercrawl.provider.WaterCrawlAPIClient") provider = WaterCrawlProvider(api_key="test_key") @@ -804,7 +803,7 @@ def test_structure_data_with_metadata(self, mocker: MockerFixture) -> None: def test_structure_data_fallback_title(self, mocker: MockerFixture) -> None: """Test that fallback title is used when og:title is not available.""" - mock_client = mocker.patch("core.rag.extractor.watercrawl.provider.WaterCrawlAPIClient") + mocker.patch("core.rag.extractor.watercrawl.provider.WaterCrawlAPIClient") provider = WaterCrawlProvider(api_key="test_key") @@ -819,7 +818,7 @@ def test_structure_data_fallback_title(self, mocker: MockerFixture) -> None: def test_structure_data_invalid_result(self, mocker: MockerFixture) -> None: """Test that ValueError is raised for invalid result objects.""" - mock_client = mocker.patch("core.rag.extractor.watercrawl.provider.WaterCrawlAPIClient") + mocker.patch("core.rag.extractor.watercrawl.provider.WaterCrawlAPIClient") provider = WaterCrawlProvider(api_key="test_key") @@ -903,10 +902,9 @@ def test_missing_api_key_error(self, mocker: MockerFixture) -> None: """Test that missing API key is handled properly at the httpx client level.""" # Mock the client to avoid actual httpx initialization mock_client = mocker.patch("core.rag.extractor.watercrawl.provider.WaterCrawlAPIClient") - mock_instance = mock_client.return_value # Create provider with mocked client - should work with mock - provider = WaterCrawlProvider(api_key="test_key") + WaterCrawlProvider(api_key="test_key") # Verify the client was initialized with the API key mock_client.assert_called_once_with("test_key", None) @@ -1462,7 +1460,7 @@ def test_watercrawl_base_url_default(self, mocker: MockerFixture) -> None: mock_client = mocker.patch("core.rag.extractor.watercrawl.provider.WaterCrawlAPIClient") # Create provider without specifying base_url - provider = WaterCrawlProvider(api_key="test_key") + WaterCrawlProvider(api_key="test_key") # Verify default base URL is used mock_client.assert_called_once_with("test_key", None) @@ -1734,7 +1732,7 @@ def test_structure_data_with_missing_metadata_fields(self, mocker: MockerFixture Not all pages have complete metadata, so extraction should handle missing fields gracefully. """ - mock_client = mocker.patch("core.rag.extractor.watercrawl.provider.WaterCrawlAPIClient") + mocker.patch("core.rag.extractor.watercrawl.provider.WaterCrawlAPIClient") provider = WaterCrawlProvider(api_key="test_key") diff --git a/api/tests/unit_tests/core/external_data_tool/test_factory.py b/api/tests/unit_tests/core/external_data_tool/test_factory.py index 6bb384b0ac97b4..273a4e75d39ab2 100644 --- a/api/tests/unit_tests/core/external_data_tool/test_factory.py +++ b/api/tests/unit_tests/core/external_data_tool/test_factory.py @@ -15,7 +15,7 @@ def test_external_data_tool_factory_init(): variable = "var_v" config = {"key": "value"} - factory = ExternalDataToolFactory(name, tenant_id, app_id, variable, config) + ExternalDataToolFactory(name, tenant_id, app_id, variable, config) mock_code_based_extension.extension_class.assert_called_once_with(ExtensionModule.EXTERNAL_DATA_TOOL, name) mock_extension_class.assert_called_once_with( diff --git a/api/tests/unit_tests/core/mcp/client/test_streamable_http.py b/api/tests/unit_tests/core/mcp/client/test_streamable_http.py index 6dfc2c7c1feb65..c8c22fd17fe99c 100644 --- a/api/tests/unit_tests/core/mcp/client/test_streamable_http.py +++ b/api/tests/unit_tests/core/mcp/client/test_streamable_http.py @@ -206,17 +206,13 @@ def test_streamablehttp_client_queue_cleanup(): """Test that StreamableHTTP client properly cleans up queues on exit.""" test_url = "http://test.example/mcp" - read_queue = None - write_queue = None - with patch("core.mcp.client.streamable_client.create_ssrf_proxy_mcp_http_client") as mock_client_factory: # Mock connection that raises an exception mock_client_factory.side_effect = Exception("Connection failed") try: with streamablehttp_client(test_url) as (rq, wq, get_session_id): - read_queue = rq - write_queue = wq + pass except Exception: pass # Expected to fail @@ -252,7 +248,7 @@ def create_client(*, headers: dict[str, str], timeout: httpx.Timeout) -> httpx.C def test_streamablehttp_client_concurrent_access(): """Test StreamableHTTP client behavior with concurrent queue access.""" test_read_queue: queue.Queue = queue.Queue() - test_write_queue: queue.Queue = queue.Queue() + queue.Queue() # Simulate concurrent producers and consumers def producer(): diff --git a/api/tests/unit_tests/core/mcp/session/test_base_session.py b/api/tests/unit_tests/core/mcp/session/test_base_session.py index c4f57e60e99e76..bf1d85d93a7bc2 100644 --- a/api/tests/unit_tests/core/mcp/session/test_base_session.py +++ b/api/tests/unit_tests/core/mcp/session/test_base_session.py @@ -295,8 +295,7 @@ def test_send_request_http_status_auth_error(streams): def mock_error(): try: - msg = write_stream.get(timeout=2) - req_id = msg.message.root.id + write_stream.get(timeout=2) response = Response(status_code=401, request=Request("GET", "http://test")) error = HTTPStatusError("Unauthorized", request=response.request, response=response) read_stream.put(error) diff --git a/api/tests/unit_tests/core/repositories/test_human_input_repository.py b/api/tests/unit_tests/core/repositories/test_human_input_repository.py index 6aaa0596152c6a..c53b5b88fac6df 100644 --- a/api/tests/unit_tests/core/repositories/test_human_input_repository.py +++ b/api/tests/unit_tests/core/repositories/test_human_input_repository.py @@ -361,7 +361,7 @@ def test_get_form_returns_entity_and_none_when_missing(repository_session: Sessi form = _persist_form(repository_session, form_id="f1") _persist_form(repository_session, form_id="other-tenant-form", tenant_id="other-tenant") - recipient = _persist_recipient(repository_session, form_id=form.id, recipient_id="r1", access_token="tok") + _persist_recipient(repository_session, form_id=form.id, recipient_id="r1", access_token="tok") repo = HumanInputFormRepositoryImpl(tenant_id="tenant", workflow_execution_id="run") entity = repo.get_form("node") assert entity is not None @@ -462,7 +462,7 @@ def test_submission_repository_init_no_args() -> None: def test_submission_get_by_token_and_get_by_form_id_success_paths(repository_session: Session) -> None: form = _persist_form(repository_session, form_id="f1", workflow_run_id=None) - recipient = _persist_recipient(repository_session, form_id=form.id, recipient_id="r1", access_token="tok") + _persist_recipient(repository_session, form_id=form.id, recipient_id="r1", access_token="tok") repo = HumanInputFormSubmissionRepository() record = repo.get_by_token("tok") assert record is not None diff --git a/api/tests/unit_tests/core/schemas/test_resolver.py b/api/tests/unit_tests/core/schemas/test_resolver.py index ed819457798b48..a642d5fe480ba4 100644 --- a/api/tests/unit_tests/core/schemas/test_resolver.py +++ b/api/tests/unit_tests/core/schemas/test_resolver.py @@ -559,7 +559,7 @@ def test_fast_path_performance_no_refs(self) -> None: for _ in range(10): SchemaResolver.clear_cache() start = time.perf_counter() - result_slow = resolve_dify_schema_refs(with_refs_schema, max_depth=50) + resolve_dify_schema_refs(with_refs_schema, max_depth=50) elapsed = time.perf_counter() - start slow_times.append(elapsed) diff --git a/api/tests/unit_tests/core/tools/test_signature.py b/api/tests/unit_tests/core/tools/test_signature.py index 1214d8a4caf240..f568b867ee6afe 100644 --- a/api/tests/unit_tests/core/tools/test_signature.py +++ b/api/tests/unit_tests/core/tools/test_signature.py @@ -107,7 +107,7 @@ def test_verify_tool_file_signature_rejects_invalid_sign( query = parse_qs(parsed.query) timestamp = query["timestamp"][0] nonce = query["nonce"][0] - sign = query["sign"][0] + query["sign"][0] assert verify_tool_file_signature("tool-file-id", timestamp, nonce, "bad-signature") is False diff --git a/api/tests/unit_tests/core/workflow/generator/test_runner_missing.py b/api/tests/unit_tests/core/workflow/generator/test_runner_missing.py index b39828044f058f..57d9a3245110f3 100644 --- a/api/tests/unit_tests/core/workflow/generator/test_runner_missing.py +++ b/api/tests/unit_tests/core/workflow/generator/test_runner_missing.py @@ -64,7 +64,6 @@ def test_declares_variable(): def test_collect_container_errors(): - # Not a container error nodes = [{"id": "n1", "data": {"type": "llm"}}, {"id": "n2", "data": {"type": "code", "parentId": "n1"}}] errors = WorkflowGenerator._collect_container_errors(nodes=nodes) @@ -75,12 +74,10 @@ def test_collect_container_errors(): nodes = [ {"id": "n1", "data": {"type": "llm"}}, ] - edges = [] # Test would go here but we need to see what _validate_structure calls def test_collect_unknown_tools(): - # Missing tool/provider info nodes = [ {"id": "n1", "data": {"type": "tool", "provider_id": "", "tool_name": ""}}, @@ -95,7 +92,6 @@ def test_collect_unknown_tools(): def test_collect_unresolved_refs(): - # Missing node ref nodes = [{"id": "n1", "data": {"type": "llm", "prompt_template": [{"text": "{#unknown.var#}"}]}}] # To trigger the parsing we need to mock _collect_refs_in_data behavior or let it parse naturally @@ -118,7 +114,6 @@ def _collect_refs_in_data(cls, data, refs): def test_collect_edge_cycle_errors(): - # Self-loop graph = {"nodes": [{"id": "n1"}], "edges": [{"source": "n1", "target": "n1"}]} errors = WorkflowGenerator._collect_edge_cycle_errors(graph=graph, known_ids={"n1"}) @@ -127,7 +122,6 @@ def test_collect_edge_cycle_errors(): def test_collect_container_errors_empty_container(): - # Empty container nodes = [ {"id": "n1", "data": {"type": "iteration"}}, @@ -138,7 +132,6 @@ def test_collect_container_errors_empty_container(): def test_collect_container_errors_cycle(): - # Ancestor cycle nodes = [ {"id": "n1", "data": {"type": "iteration", "parentId": "n2"}}, @@ -150,7 +143,6 @@ def test_collect_container_errors_cycle(): def test_postprocess_graph_edges(): - # Try calling _postprocess_graph directly to trigger _sanitize_node_ids graph = { "nodes": [{"id": "sys", "data": {"type": "start"}}, {"id": "bad id", "data": {"type": "llm"}}], @@ -177,10 +169,9 @@ def test_document_extractor_start_vars(): def test_missing_terminal_mode_auto(): - # Empty graph, should get MISSING_TERMINAL graph = {"nodes": [{"id": "n1", "data": {"type": "start"}}], "edges": []} # Missing terminal check happens inside _validate_structure - errors = WorkflowGenerator._validate_structure(graph=graph, mode="workflow", installed_tools=set()) + WorkflowGenerator._validate_structure(graph=graph, mode="workflow", installed_tools=set()) # Mocking this deeply is hard, but we can verify it doesn't fail diff --git a/api/tests/unit_tests/core/workflow/graph_engine/test_mock_nodes.py b/api/tests/unit_tests/core/workflow/graph_engine/test_mock_nodes.py index b307a26c28fa64..664a547eef6268 100644 --- a/api/tests/unit_tests/core/workflow/graph_engine/test_mock_nodes.py +++ b/api/tests/unit_tests/core/workflow/graph_engine/test_mock_nodes.py @@ -686,7 +686,7 @@ def _run(self) -> NodeRunResult: return NodeRunResult( status=WorkflowNodeExecutionStatus.SUCCEEDED, inputs=variables, outputs={"output": result_text} ) - except Exception as e: + except Exception: # If direct Jinja2 fails, try CodeExecutor as fallback try: from core.helper.code_executor.code_executor import CodeExecutor, CodeLanguage diff --git a/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_runtime_request_builder.py b/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_runtime_request_builder.py index 2678610cb80bf6..afaeadd5e3d661 100644 --- a/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_runtime_request_builder.py +++ b/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_runtime_request_builder.py @@ -1251,7 +1251,7 @@ def test_stale_previous_node_refs_are_ignored_when_workflow_prompt_has_no_fronte def test_previous_node_file_array_uses_agent_stub_download_mappings_in_workflow_context(): first_reference = build_file_reference(record_id="tool-file-1") - second_reference = build_file_reference(record_id="tool-file-2") + build_file_reference(record_id="tool-file-2") class FileArrayVariablePool(FakeVariablePool): def get(self, selector): diff --git a/api/tests/unit_tests/core/workflow/nodes/human_input/test_entities.py b/api/tests/unit_tests/core/workflow/nodes/human_input/test_entities.py index feb04a4a38aafa..a3d555c0d60cbe 100644 --- a/api/tests/unit_tests/core/workflow/nodes/human_input/test_entities.py +++ b/api/tests/unit_tests/core/workflow/nodes/human_input/test_entities.py @@ -596,7 +596,7 @@ def test_debugger_falls_back_to_recipient_token_when_webapp_disabled(self, mocke workflow_execution_id_getter=lambda: "exec-2", ) repository = runtime.build_form_repository() - create = mocker.spy(repository, "create_form") + mocker.spy(repository, "create_form") runtime = runtime.with_form_repository(repository) node = _build_human_input_node( node_id=config["id"], diff --git a/api/tests/unit_tests/core/workflow/nodes/test_base_node.py b/api/tests/unit_tests/core/workflow/nodes/test_base_node.py index a05151f79b0164..27b495cc820ac6 100644 --- a/api/tests/unit_tests/core/workflow/nodes/test_base_node.py +++ b/api/tests/unit_tests/core/workflow/nodes/test_base_node.py @@ -108,8 +108,6 @@ def test_node_accepts_invoke_from_enum(): def test_missing_generic_argument_raises_type_error(): - graph_config: dict[str, object] = {} - with pytest.raises(TypeError): class _InvalidNode(Node): # type: ignore[type-abstract] diff --git a/api/tests/unit_tests/core/workflow/nodes/test_if_else.py b/api/tests/unit_tests/core/workflow/nodes/test_if_else.py index 38d1e94bbc9abb..20d4e40cf2380c 100644 --- a/api/tests/unit_tests/core/workflow/nodes/test_if_else.py +++ b/api/tests/unit_tests/core/workflow/nodes/test_if_else.py @@ -75,7 +75,7 @@ def test_execute_if_else_result_true(): graph_init_params=init_params, graph_runtime_state=graph_runtime_state, ) - graph = Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") + Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") node = _build_if_else_node( node_data={ @@ -160,7 +160,7 @@ def test_execute_if_else_result_false(): graph_init_params=init_params, graph_runtime_state=graph_runtime_state, ) - graph = Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") + Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") node = _build_if_else_node( node_data={ @@ -314,7 +314,7 @@ def test_execute_if_else_boolean_conditions(condition: Condition): graph_init_params=init_params, graph_runtime_state=graph_runtime_state, ) - graph = Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") + Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") node_data = { "title": "Boolean Test", @@ -364,7 +364,7 @@ def test_execute_if_else_boolean_false_conditions(): graph_init_params=init_params, graph_runtime_state=graph_runtime_state, ) - graph = Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") + Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") node_data = { "title": "Boolean False Test", @@ -425,7 +425,7 @@ def test_execute_if_else_boolean_cases_structure(): graph_init_params=init_params, graph_runtime_state=graph_runtime_state, ) - graph = Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") + Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") node_data = { "title": "Boolean Cases Test", diff --git a/api/tests/unit_tests/core/workflow/nodes/tool/test_tool_node_invocation_behavior.py b/api/tests/unit_tests/core/workflow/nodes/tool/test_tool_node_invocation_behavior.py index 911bfd7fa007a2..987ef88696d9ae 100644 --- a/api/tests/unit_tests/core/workflow/nodes/tool/test_tool_node_invocation_behavior.py +++ b/api/tests/unit_tests/core/workflow/nodes/tool/test_tool_node_invocation_behavior.py @@ -57,7 +57,7 @@ def init_tool_node(config: dict[str, object]) -> ToolNode: graph_runtime_state=graph_runtime_state, ) - graph = Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") + Graph.init(graph_config=graph_config, node_factory=node_factory, root_node_id="start") tool_file_manager = DifyToolFileManager(init_params.run_context) diff --git a/api/tests/unit_tests/core/workflow/test_variable_pool.py b/api/tests/unit_tests/core/workflow/test_variable_pool.py index 215933b021b336..4fbc87a7e68256 100644 --- a/api/tests/unit_tests/core/workflow/test_variable_pool.py +++ b/api/tests/unit_tests/core/workflow/test_variable_pool.py @@ -270,12 +270,6 @@ def _create_pool_without_file(self) -> VariablePool: ] # Create comprehensive user inputs - user_inputs = { - "string_input": "test_value", - "number_input": 42, - "object_input": {"nested": {"key": "value"}}, - "array_input": ["item1", "item2", "item3"], - } # Create VariablePool pool = VariablePool() diff --git a/api/tests/unit_tests/core/workflow/test_workflow_entry_redis_channel.py b/api/tests/unit_tests/core/workflow/test_workflow_entry_redis_channel.py index 4e8140c144d895..5df526d1750260 100644 --- a/api/tests/unit_tests/core/workflow/test_workflow_entry_redis_channel.py +++ b/api/tests/unit_tests/core/workflow/test_workflow_entry_redis_channel.py @@ -25,7 +25,7 @@ def test_workflow_entry_uses_provided_redis_channel(self): # Patch GraphEngine to verify it receives the Redis channel with patch("core.workflow.workflow_entry.GraphEngine", autospec=True) as mock_graph_engine_type: - mock_graph_engine = mock_graph_engine_type.return_value # Create WorkflowEntry with Redis channel + # Create WorkflowEntry with Redis channel workflow_entry = WorkflowEntry( tenant_id="test-tenant", app_id="test-app", @@ -60,10 +60,8 @@ def test_workflow_entry_defaults_to_inmemory_channel(self): patch("core.workflow.workflow_entry.GraphEngine", autospec=True) as mock_graph_engine_type, patch("core.workflow.workflow_entry.InMemoryChannel", autospec=True) as mock_in_memory_channel, ): - mock_graph_engine = mock_graph_engine_type.return_value - mock_inmemory_channel = ( - mock_in_memory_channel.return_value - ) # Create WorkflowEntry without providing a channel + mock_inmemory_channel = mock_in_memory_channel.return_value + # Create WorkflowEntry without providing a channel workflow_entry = WorkflowEntry( tenant_id="test-tenant", app_id="test-app", diff --git a/api/tests/unit_tests/enterprise/telemetry/test_enterprise_trace.py b/api/tests/unit_tests/enterprise/telemetry/test_enterprise_trace.py index 5b7fb4acc1e42a..2181738b181a6c 100644 --- a/api/tests/unit_tests/enterprise/telemetry/test_enterprise_trace.py +++ b/api/tests/unit_tests/enterprise/telemetry/test_enterprise_trace.py @@ -453,7 +453,7 @@ def test_draft_node_dispatched_before_node(self, trace_handler: EnterpriseOtelTr class TestWorkflowTrace: def test_emits_correct_span_attributes(self, trace_handler: EnterpriseOtelTrace, mock_exporter): - with patch("enterprise.telemetry.enterprise_trace.emit_telemetry_log") as mock_log: + with patch("enterprise.telemetry.enterprise_trace.emit_telemetry_log"): info = make_workflow_info() trace_handler._workflow_trace(info) diff --git a/api/tests/unit_tests/enterprise/telemetry/test_id_generator.py b/api/tests/unit_tests/enterprise/telemetry/test_id_generator.py index dc2be14ebf3b8c..9bf51736934f14 100644 --- a/api/tests/unit_tests/enterprise/telemetry/test_id_generator.py +++ b/api/tests/unit_tests/enterprise/telemetry/test_id_generator.py @@ -177,7 +177,7 @@ def test_returns_random_when_source_is_invalid_uuid(self) -> None: set_span_id_source("not-a-uuid") gen = CorrelationIdGenerator() - with patch("enterprise.telemetry.id_generator.random.getrandbits", return_value=7) as mock_rng: + with patch("enterprise.telemetry.id_generator.random.getrandbits", return_value=7): span_id = gen.generate_span_id() assert span_id == 7 diff --git a/api/tests/unit_tests/libs/test_time_parser.py b/api/tests/unit_tests/libs/test_time_parser.py index 83ff251272ad08..8319cb1cc67af8 100644 --- a/api/tests/unit_tests/libs/test_time_parser.py +++ b/api/tests/unit_tests/libs/test_time_parser.py @@ -62,7 +62,6 @@ def test_get_threshold_days(self): """Test getting threshold for days.""" before = datetime.now(UTC) result = get_time_threshold("7d") - after = datetime.now(UTC) assert result is not None # Result should be approximately 7 days ago @@ -74,7 +73,6 @@ def test_get_threshold_hours(self): """Test getting threshold for hours.""" before = datetime.now(UTC) result = get_time_threshold("4h") - after = datetime.now(UTC) assert result is not None expected = before - timedelta(hours=4) diff --git a/api/tests/unit_tests/models/test_account_models.py b/api/tests/unit_tests/models/test_account_models.py index 14677e13c71460..61987cad94a85a 100644 --- a/api/tests/unit_tests/models/test_account_models.py +++ b/api/tests/unit_tests/models/test_account_models.py @@ -648,7 +648,6 @@ def test_tenant_custom_config_dict_property(self): """Test custom_config_dict property getter.""" # Arrange tenant = Tenant(name="Test Workspace") - config = {"feature1": True, "feature2": "value"} tenant.custom_config = '{"feature1": true, "feature2": "value"}' # Act diff --git a/api/tests/unit_tests/models/test_workflow.py b/api/tests/unit_tests/models/test_workflow.py index a7f5cf5bf9f347..111be8880a9e28 100644 --- a/api/tests/unit_tests/models/test_workflow.py +++ b/api/tests/unit_tests/models/test_workflow.py @@ -308,8 +308,6 @@ class TestCase: name: str value: Segment - tenant_id = "test_tenant_id" - test_file = File( file_type=FileType.IMAGE, transfer_method=FileTransferMethod.REMOTE_URL, @@ -378,7 +376,6 @@ class TestCase: def test_file_variable_preserves_all_fields(self): """Test that File type variables preserve all fields during encoding/decoding.""" - tenant_id = "test_tenant_id" # Create a File with specific field values test_file = File( diff --git a/api/tests/unit_tests/repositories/workspace/test_workspace_repository.py b/api/tests/unit_tests/repositories/workspace/test_workspace_repository.py index d9b339f8c9cc42..1975efe619fe6a 100644 --- a/api/tests/unit_tests/repositories/workspace/test_workspace_repository.py +++ b/api/tests/unit_tests/repositories/workspace/test_workspace_repository.py @@ -134,7 +134,6 @@ def test_writes_commit_and_other_accounts_cannot_mutate( def test_write_rolls_back_on_commit_failure( seeded: WorkspaceRepository, sqlite_session_factory: sessionmaker[Session] ) -> None: - def fail_flush(_session: Session, _flush_context: object, _instances: object) -> None: raise RuntimeError("write failed") diff --git a/api/tests/unit_tests/services/account/test_email_registration_service.py b/api/tests/unit_tests/services/account/test_email_registration_service.py index 118fc32b656ee6..384930ffdd92cf 100644 --- a/api/tests/unit_tests/services/account/test_email_registration_service.py +++ b/api/tests/unit_tests/services/account/test_email_registration_service.py @@ -103,7 +103,6 @@ def test_send_code_normalizes_new_account_email_and_language( service: AccountEmailRegistrationService, boundaries: dict[str, MagicMock], ) -> None: - service.send_code( remote_ip="127.0.0.1", requested_email="New@Example.com", @@ -260,7 +259,6 @@ def test_register_rejects_password_mismatch_before_reading_token( service: AccountEmailRegistrationService, boundaries: dict[str, MagicMock], ) -> None: - with pytest.raises(EmailRegistrationPasswordMismatchError): service.register( remote_ip="127.0.0.1", diff --git a/api/tests/unit_tests/services/controller_api.py b/api/tests/unit_tests/services/controller_api.py index 3ef2a15c3ca2d8..a8fb6ad4c54a68 100644 --- a/api/tests/unit_tests/services/controller_api.py +++ b/api/tests/unit_tests/services/controller_api.py @@ -355,9 +355,7 @@ def test_get_datasets_success(self, client: FlaskClient, mock_current_user): for i in range(3) ] - paginated_response = ControllerApiTestDataFactory.create_paginated_response( - items=datasets, total=3, page=1, per_page=20 - ) + ControllerApiTestDataFactory.create_paginated_response(items=datasets, total=3, page=1, per_page=20) with patch("controllers.console.datasets.datasets.DatasetService.get_datasets") as mock_get_datasets: mock_get_datasets.return_value = (datasets, 3) @@ -546,7 +544,7 @@ def test_get_dataset_not_found(self, client: FlaskClient, mock_current_user): with ( patch("controllers.console.datasets.datasets.DatasetService.get_dataset") as mock_get_dataset, - patch("controllers.console.datasets.datasets.DatasetService.check_dataset_permission") as mock_check_perm, + patch("controllers.console.datasets.datasets.DatasetService.check_dataset_permission"), ): mock_get_dataset.return_value = None # Dataset not found diff --git a/api/tests/unit_tests/services/data_migration/test_import_service.py b/api/tests/unit_tests/services/data_migration/test_import_service.py index 512d2f10e666aa..28e9d81d19a130 100644 --- a/api/tests/unit_tests/services/data_migration/test_import_service.py +++ b/api/tests/unit_tests/services/data_migration/test_import_service.py @@ -602,7 +602,7 @@ def _ensure_workflow_app_is_published(self, target, account, app_id, session): def test_api_tool_existing_provider_records_id_mapping( monkeypatch: pytest.MonkeyPatch, database: Database, conflict_strategy: ConflictStrategy ): - target_provider = _persist_api_provider(database.session, provider_id="target-api-provider-id") + _persist_api_provider(database.session, provider_id="target-api-provider-id") _persist_api_provider(database.session, provider_id="other-tenant-provider-id", tenant_id="tenant-2") id_mapping = {} id_mapping_details = [] @@ -731,7 +731,7 @@ def update_provider(self, **kwargs): def test_mcp_tool_existing_provider_records_id_mapping( monkeypatch: pytest.MonkeyPatch, database: Database, conflict_strategy: ConflictStrategy ): - provider = _persist_mcp_provider(database.session, provider_id="target-mcp-provider-id") + _persist_mcp_provider(database.session, provider_id="target-mcp-provider-id") _persist_mcp_provider( database.session, provider_id="other-mcp-provider-id", diff --git a/api/tests/unit_tests/services/knowledge/test_indexing_estimate_application_service.py b/api/tests/unit_tests/services/knowledge/test_indexing_estimate_application_service.py index 0ee5acbc6b5472..9cb7cc05066a5a 100644 --- a/api/tests/unit_tests/services/knowledge/test_indexing_estimate_application_service.py +++ b/api/tests/unit_tests/services/knowledge/test_indexing_estimate_application_service.py @@ -147,7 +147,6 @@ def fixture() -> ServiceFixture: def test_estimate_new_sources_resolves_each_variant_and_normalizes_rule(fixture: ServiceFixture) -> None: - result = fixture.service.estimate_new_sources( _context(), NewSourcesEstimateCommand( @@ -258,7 +257,6 @@ def test_estimate_new_notion_source_maps_actor_credential_failure_without_runnin def test_estimate_empty_new_sources_returns_zero_without_runner_call(fixture: ServiceFixture) -> None: - result = fixture.service.estimate_new_sources( _context(), NewSourcesEstimateCommand(sources=(), process_rule={"mode": "automatic"}), @@ -309,7 +307,6 @@ def test_estimate_rejects_missing_saved_process_rule(fixture: ServiceFixture) -> def test_estimate_empty_batch_raises_not_found_without_runner_call(fixture: ServiceFixture) -> None: - with pytest.raises(EstimateDocumentNotFoundError): fixture.service.estimate_batch(_context(), dataset_id="dataset-1", batch="batch-1") diff --git a/api/tests/unit_tests/services/knowledge/test_segment_adapters.py b/api/tests/unit_tests/services/knowledge/test_segment_adapters.py index 0f6739f510f5c3..89a6b491316862 100644 --- a/api/tests/unit_tests/services/knowledge/test_segment_adapters.py +++ b/api/tests/unit_tests/services/knowledge/test_segment_adapters.py @@ -292,7 +292,6 @@ def _application( def test_mutations_use_request_actor_without_a_flask_request( sqlite_session_factory: sessionmaker[Session], ) -> None: - with sqlite_session_factory.begin() as session: session.add(_dataset("dataset-1", "workspace-1")) session.add(_document("document-1", "workspace-1", "dataset-1")) @@ -389,7 +388,6 @@ def test_redis_state_uses_existing_keys_and_decodes_status() -> None: def test_child_chunk_mutations_preserve_explicit_actors( sqlite_session_factory: sessionmaker[Session], ) -> None: - with sqlite_session_factory.begin() as session: session.add(_dataset("dataset-1", "workspace-1")) document = _document("document-1", "workspace-1", "dataset-1") diff --git a/api/tests/unit_tests/services/rag_pipeline/test_pipeline_generate_service.py b/api/tests/unit_tests/services/rag_pipeline/test_pipeline_generate_service.py index 939b54b1559511..84970c38c1e10a 100644 --- a/api/tests/unit_tests/services/rag_pipeline/test_pipeline_generate_service.py +++ b/api/tests/unit_tests/services/rag_pipeline/test_pipeline_generate_service.py @@ -204,7 +204,7 @@ def test_generate_rejects_original_document_outside_pipeline_dataset_before_disp sqlite_session.add_all([dataset, pipeline, outside_document]) sqlite_session.commit() mocker.patch.object(PipelineGenerateService, "_get_workflow", return_value=_make_workflow()) - generator_cls = mocker.patch("services.rag_pipeline.pipeline_generate_service.PipelineGenerator") + mocker.patch("services.rag_pipeline.pipeline_generate_service.PipelineGenerator") with pytest.raises(ValueError, match="Pipeline document not found"): PipelineGenerateService.generate( diff --git a/api/tests/unit_tests/services/rag_pipeline/test_rag_pipeline_service.py b/api/tests/unit_tests/services/rag_pipeline/test_rag_pipeline_service.py index 20104e3c9cb14f..53ae094ceaa462 100644 --- a/api/tests/unit_tests/services/rag_pipeline/test_rag_pipeline_service.py +++ b/api/tests/unit_tests/services/rag_pipeline/test_rag_pipeline_service.py @@ -1151,7 +1151,6 @@ def test_get_default_block_configs_success(rag_pipeline_service: RagPipelineServ def test_get_default_block_config_success(rag_pipeline_service: RagPipelineServiceTestContext) -> None: - result = rag_pipeline_service.service.get_default_block_config(BuiltinNodeTypes.LLM) assert result is not None assert result["type"] == "llm" @@ -1172,7 +1171,6 @@ def test_publish_workflow_raises_when_draft_workflow_missing( def test_get_default_block_config_returns_none_when_mapped_type_missing( mocker: MockerFixture, rag_pipeline_service: RagPipelineServiceTestContext ) -> None: - mocker.patch("services.rag_pipeline.rag_pipeline.get_node_type_classes_mapping", return_value={}) assert rag_pipeline_service.service.get_default_block_config(BuiltinNodeTypes.START) is None @@ -1181,7 +1179,6 @@ def test_get_default_block_config_returns_none_when_mapped_type_missing( def test_get_default_block_config_injects_http_request_filter( mocker: MockerFixture, rag_pipeline_service: RagPipelineServiceTestContext ) -> None: - fake_node_cls = mocker.Mock() fake_node_cls.get_default_config.return_value = {"type": "http-request"} mocker.patch( @@ -1613,7 +1610,6 @@ def test_set_datasource_variables_raises_when_node_id_missing( def test_get_default_block_configs_skips_empty_configs( mocker: MockerFixture, rag_pipeline_service: RagPipelineServiceTestContext ) -> None: - http_node = mocker.Mock() http_node.get_default_config.return_value = {"type": "http-request"} empty_node = mocker.Mock() @@ -2076,7 +2072,6 @@ def test_publish_workflow_skips_dataset_update_for_non_knowledge_nodes( def test_get_default_block_config_returns_none_when_default_empty( mocker: MockerFixture, rag_pipeline_service: RagPipelineServiceTestContext ) -> None: - node_cls = mocker.Mock() node_cls.get_default_config.return_value = None mocker.patch( diff --git a/api/tests/unit_tests/services/retention/workflow_run/test_restore_archived_workflow_run.py b/api/tests/unit_tests/services/retention/workflow_run/test_restore_archived_workflow_run.py index 8d30ca231c78d4..4dbc7bc0bd7d55 100644 --- a/api/tests/unit_tests/services/retention/workflow_run/test_restore_archived_workflow_run.py +++ b/api/tests/unit_tests/services/retention/workflow_run/test_restore_archived_workflow_run.py @@ -636,7 +636,7 @@ def test_archive_storage_not_configured(self, mock_get_storage, database: Databa run = WorkflowRunRestoreTestDataFactory.create_workflow_run() - with patch("services.retention.workflow_run.restore_archived_workflow_run.click") as mock_click: + with patch("services.retention.workflow_run.restore_archived_workflow_run.click"): result = restore._restore_from_run(run, session_maker=database.session_maker) assert result.success is False @@ -653,7 +653,7 @@ def test_archive_bundle_not_found(self, mock_get_storage, database: Database): run = WorkflowRunRestoreTestDataFactory.create_workflow_run() - with patch("services.retention.workflow_run.restore_archived_workflow_run.click") as mock_click: + with patch("services.retention.workflow_run.restore_archived_workflow_run.click"): result = restore._restore_from_run(run, session_maker=database.session_maker) assert result.success is False @@ -702,7 +702,7 @@ def test_successful_restore(self, mock_get_storage, database: Database): ) mock_get_repo.return_value = mock_repo - with patch("services.retention.workflow_run.restore_archived_workflow_run.click") as mock_click: + with patch("services.retention.workflow_run.restore_archived_workflow_run.click"): result = restore._restore_from_run(run, session_maker=database.session_maker) assert result.success is True @@ -750,7 +750,7 @@ def test_invalid_archive_bundle(self, mock_get_storage, database: Database): run = WorkflowRunRestoreTestDataFactory.create_workflow_run() - with patch("services.retention.workflow_run.restore_archived_workflow_run.click") as mock_click: + with patch("services.retention.workflow_run.restore_archived_workflow_run.click"): result = restore._restore_from_run(run, session_maker=database.session_maker) assert result.success is False @@ -825,7 +825,7 @@ def test_successful_batch_restore(self, mock_executor, database: Database): with patch.object(restore, "_get_workflow_run_repo", return_value=mock_repo): with patch.object(restore, "_restore_from_run", side_effect=[result1, result2]): - with patch("services.retention.workflow_run.restore_archived_workflow_run.click") as mock_click: + with patch("services.retention.workflow_run.restore_archived_workflow_run.click"): results = restore.restore_batch( tenant_ids=["tenant-1"], start_date=datetime(2024, 1, 1), @@ -858,7 +858,7 @@ def test_dry_run_batch_restore(self, mock_executor, database: Database): with patch.object(restore, "_get_workflow_run_repo", return_value=mock_repo): with patch.object(restore, "_restore_from_run", return_value=result): - with patch("services.retention.workflow_run.restore_archived_workflow_run.click") as mock_click: + with patch("services.retention.workflow_run.restore_archived_workflow_run.click"): results = restore.restore_batch( tenant_ids=["tenant-1"], start_date=datetime(2024, 1, 1), @@ -885,7 +885,7 @@ def test_archive_log_not_found(self): mock_repo.get_archived_log_by_run_id.return_value = None with patch.object(restore, "_get_workflow_run_repo", return_value=mock_repo): - with patch("services.retention.workflow_run.restore_archived_workflow_run.click") as mock_click: + with patch("services.retention.workflow_run.restore_archived_workflow_run.click"): result = restore.restore_by_run_id("nonexistent-run") assert result.success is False @@ -906,7 +906,7 @@ def test_successful_restore_by_id(self, database: Database): with patch.object(restore, "_get_workflow_run_repo", return_value=mock_repo): with patch.object(restore, "_restore_from_run", return_value=result): - with patch("services.retention.workflow_run.restore_archived_workflow_run.click") as mock_click: + with patch("services.retention.workflow_run.restore_archived_workflow_run.click"): actual_result = restore.restore_by_run_id("run-1") assert actual_result.success is True @@ -926,7 +926,7 @@ def test_dry_run_restore_by_id(self, database: Database): with patch.object(restore, "_get_workflow_run_repo", return_value=mock_repo): with patch.object(restore, "_restore_from_run", return_value=result): - with patch("services.retention.workflow_run.restore_archived_workflow_run.click") as mock_click: + with patch("services.retention.workflow_run.restore_archived_workflow_run.click"): actual_result = restore.restore_by_run_id("run-1") assert actual_result.success is True diff --git a/api/tests/unit_tests/services/test_account_change_email_service.py b/api/tests/unit_tests/services/test_account_change_email_service.py index 847fa31b96ed23..eb3d7e24380c9e 100644 --- a/api/tests/unit_tests/services/test_account_change_email_service.py +++ b/api/tests/unit_tests/services/test_account_change_email_service.py @@ -101,7 +101,6 @@ def test_send_old_email_code_coerces_unexpected_phase_to_initial_state( service: AccountChangeEmailService, boundaries: dict[str, MagicMock], ) -> None: - token = service.send_code( _context(), requested_email="OLD@example.com", diff --git a/api/tests/unit_tests/services/test_app_dsl_service.py b/api/tests/unit_tests/services/test_app_dsl_service.py index 03e91bf174e527..034a0c91fec97e 100644 --- a/api/tests/unit_tests/services/test_app_dsl_service.py +++ b/api/tests/unit_tests/services/test_app_dsl_service.py @@ -1235,7 +1235,7 @@ def test_import_creation_marker_tracks_persisted_app( sqlite_session: Session, monkeypatch: pytest.MonkeyPatch, confirmed: bool, overwrite: bool ) -> None: account = _account(account_id=_CALLER_ID, tenant_id=_TENANT_ID) - target = _persist_overwrite_target(sqlite_session) if overwrite else None + _persist_overwrite_target(sqlite_session) if overwrite else None data = yaml.safe_dump( { "version": CURRENT_APP_DSL_VERSION, diff --git a/api/tests/unit_tests/services/test_app_generate_service.py b/api/tests/unit_tests/services/test_app_generate_service.py index 5b20675c9c83b1..55fa8da4f60fd6 100644 --- a/api/tests/unit_tests/services/test_app_generate_service.py +++ b/api/tests/unit_tests/services/test_app_generate_service.py @@ -485,7 +485,7 @@ def test_advanced_chat_streaming(self, mocker: MockerFixture, config_overrides: return_value=gen_instance, ) - result = AppGenerateService.generate( + AppGenerateService.generate( app_model=_make_app(AppMode.ADVANCED_CHAT), user=_make_user(), args={"workflow_id": None, "query": "hi", "inputs": {}}, @@ -625,7 +625,7 @@ def test_workflow_streaming(self, mocker: MockerFixture, config_overrides: Calla side_effect=lambda x: x, ) - result = AppGenerateService.generate( + AppGenerateService.generate( app_model=_make_app(AppMode.WORKFLOW), user=_make_user(), args={"inputs": {}}, @@ -938,7 +938,7 @@ class TestGenerateSingleIteration(_RealSessionTest): def test_advanced_chat_mode(self, mocker: MockerFixture): workflow = _make_workflow() mocker.patch.object(AppGenerateService, "_get_workflow", return_value=workflow) - gen_spy = mocker.patch( + mocker.patch( "services.app_generate_service.AdvancedChatAppGenerator.convert_to_event_stream", side_effect=lambda x: x, ) @@ -1091,7 +1091,7 @@ def test_non_ended_workflow_run(self, mocker: MockerFixture): return_value=gen_instance, ) - result = AppGenerateService.get_response_generator(app_model=app, workflow_run=workflow_run) + AppGenerateService.get_response_generator(app_model=app, workflow_run=workflow_run) gen_instance.retrieve_events.assert_called_once() def test_ended_workflow_run_still_returns_generator(self, mocker: MockerFixture): @@ -1107,6 +1107,6 @@ def test_ended_workflow_run_still_returns_generator(self, mocker: MockerFixture) return_value=gen_instance, ) - result = AppGenerateService.get_response_generator(app_model=app, workflow_run=workflow_run) + AppGenerateService.get_response_generator(app_model=app, workflow_run=workflow_run) # current impl falls through the TODO and still creates a generator gen_instance.retrieve_events.assert_called_once() diff --git a/api/tests/unit_tests/services/test_human_input_service.py b/api/tests/unit_tests/services/test_human_input_service.py index 840ac115c646bc..9af7f4f1216475 100644 --- a/api/tests/unit_tests/services/test_human_input_service.py +++ b/api/tests/unit_tests/services/test_human_input_service.py @@ -444,7 +444,6 @@ def test_submit_form_by_token_missing_inputs( sample_form_record: HumanInputFormRecord, unbound_session_factory: sessionmaker[Session], ) -> None: - definition_with_input = FormDefinition( form_content="hello", inputs=[ParagraphInputConfig(output_variable_name="content")], diff --git a/api/tests/unit_tests/services/test_variable_truncator.py b/api/tests/unit_tests/services/test_variable_truncator.py index f2ba1784a2863a..97f3ba66d52948 100644 --- a/api/tests/unit_tests/services/test_variable_truncator.py +++ b/api/tests/unit_tests/services/test_variable_truncator.py @@ -493,13 +493,13 @@ def test_zero_and_negative_limits(self): """Test truncator behavior with zero or very small limits.""" # Zero string limit with pytest.raises(ValueError): - truncator = VariableTruncator(string_length_limit=3) + VariableTruncator(string_length_limit=3) with pytest.raises(ValueError): - truncator = VariableTruncator(array_element_limit=0) + VariableTruncator(array_element_limit=0) with pytest.raises(ValueError): - truncator = VariableTruncator(max_size_bytes=0) + VariableTruncator(max_size_bytes=0) def test_unicode_and_special_characters(self): """Test truncator with unicode and special characters.""" diff --git a/api/tests/unit_tests/services/test_workflow_service.py b/api/tests/unit_tests/services/test_workflow_service.py index 9fc63e780e66fc..89b27a2c634c43 100644 --- a/api/tests/unit_tests/services/test_workflow_service.py +++ b/api/tests/unit_tests/services/test_workflow_service.py @@ -3256,7 +3256,7 @@ def test_run_draft_workflow_node_should_execute_start_node_successfully( with ( patch("services.workflow_service.db", SimpleNamespace(engine=sqlite_engine)), patch("services.workflow_service.WorkflowDraftVariableService"), - patch("services.workflow_service.StartNodeData") as mock_start_data, + patch("services.workflow_service.StartNodeData"), patch( "services.workflow_service._rebuild_file_for_user_inputs_in_start_node", side_effect=lambda **kwargs: kwargs["user_inputs"], diff --git a/api/tests/unit_tests/tasks/test_dataset_indexing_task.py b/api/tests/unit_tests/tasks/test_dataset_indexing_task.py index 3b9b5103947320..51c61f45e9d06f 100644 --- a/api/tests/unit_tests/tasks/test_dataset_indexing_task.py +++ b/api/tests/unit_tests/tasks/test_dataset_indexing_task.py @@ -183,7 +183,7 @@ def test_self_hosted_dispatches_directly_to_priority_task( self, tenant_id: str, dataset_id: str, document_ids: list[str], mock_redis: MagicMock ) -> None: with ( - patch.object(DocumentIndexingTaskProxy, "features") as features, + patch.object(DocumentIndexingTaskProxy, "features"), patch.object(DocumentIndexingTaskProxy, "PRIORITY_TASK_FUNC", Mock()) as task, ): DocumentIndexingTaskProxy(tenant_id, dataset_id, document_ids).delay() diff --git a/api/tests/unit_tests/tasks/test_segment_index_cleanup_tasks.py b/api/tests/unit_tests/tasks/test_segment_index_cleanup_tasks.py index 910cf8abf34d2b..1c680bdfb47820 100644 --- a/api/tests/unit_tests/tasks/test_segment_index_cleanup_tasks.py +++ b/api/tests/unit_tests/tasks/test_segment_index_cleanup_tasks.py @@ -190,7 +190,7 @@ def test_delete_segment_removes_attachment_blobs_from_storage( binding_id = binding.id with ( - patch("tasks.delete_segment_from_index_task.IndexProcessorFactory") as processor_factory, + patch("tasks.delete_segment_from_index_task.IndexProcessorFactory"), patch("tasks.delete_segment_from_index_task.storage.delete") as storage_delete, ): delete_segment_from_index_task.run(["node-1"], dataset.id, document.id, [segment.id]) @@ -305,7 +305,7 @@ def test_delete_segment_keeps_database_cleanup_when_attachment_storage_delete_fa binding_id = binding.id with ( - patch("tasks.delete_segment_from_index_task.IndexProcessorFactory") as processor_factory, + patch("tasks.delete_segment_from_index_task.IndexProcessorFactory"), patch( "tasks.delete_segment_from_index_task.storage.delete", side_effect=RuntimeError("storage unavailable"),