Files
dify-plugin-sdks/python/tests/servers/test_session.py
Maries c6f83a63e1 feat[0.4.2]: Tool OAuth (#179)
* chore: fix ruff issue

* feat(oauth): implement OAuth

* feat(invoke-message): refactor message handling and introduce InvokeMessage class

* feat(plugin-oauth): add credential_id and credential_type to tool parameters

* feat(plugin-oauth): add credential_id and credential_type to tool parameters

* chore: update dify_plugin version to 0.5.0b4 and clean up github.yaml

* chore: update plugin version to 0.1.2 in manifest.yaml

* feat(session): session context and tool backwards invocation credential support

* feat(oauth): session context and tool backwards invocation credential support

* feat: update README and requirements for OAuth support in version 0.4.2

* feat: add .gitignore to exclude IDE files and secret keys

* chore: apply ruff

* feat: bump version to 0.4.2b1

* feat: update GitHub plugin configuration for OAuth support and improve credential handling

* feat: update .gitignore to exclude dify plugin files and public keys

* feat: fix credential validation for GitHub API and bump version to 0.2.1

* feat: update GitHub plugin to support multiple access tokens and bump version to 0.2.5

* chore: apply ruff

* feat: add ToolProviderOAuthError for improved OAuth error handling in GitHub plugin

* chore: apply ruff

* chore: bump version to 0.4.2

* chore: update examples sdk version to 0.4.2

* fix: thread deadlock in PluginRunner when running tests without gevent monkey patching

* feat: add support for refreshing OAuth credentials in Plugin and GitHub provider

* feat: refactor OAuth credential handling to return structured OAuthCredentials object

* apply ruff

* feat: refactor OAuth credential handling to use ToolOAuthCredentials for improved structure

* feat: reorganize imports in __init__.py for improved clarity and structure

* feat: add Microsoft To Do plugin for refresh token example

* chore: apply ruff

* fix: update author in GitHub configuration and clean up Microsoft To Do schema

* chore: bump version to 0.4.2b2 in pyproject.toml

* feat: update Microsoft To Do plugin to handle OAuth token encoding and version bump

* feat:remove inelegant example

* chore: update dify_plugin version to 0.4.2

* chore: bump version to 0.4.2 in pyproject.toml

---------

Co-authored-by: Yeuoly <admin@srmxy.cn>
2025-07-23 13:49:01 +08:00

76 lines
2.7 KiB
Python

from concurrent.futures import ThreadPoolExecutor
from unittest.mock import patch
from dify_plugin.core.runtime import Session
from dify_plugin.core.server.stdio.request_reader import StdioRequestReader
from dify_plugin.core.server.stdio.response_writer import StdioResponseWriter
from dify_plugin.entities.tool import ToolInvokeMessage, ToolProviderType
def test_session_context_tool_credentials():
"""
Test the SessionContext tool credentials with mocked backwards invoke
"""
def mock_backwards_invoke(invoke_type, data_type, data):
mock_response = ToolInvokeMessage(
type=ToolInvokeMessage.MessageType.TEXT,
message=ToolInvokeMessage.TextMessage(text=data.get("credential_id", "no_credential_id")),
meta={"mock": True},
)
yield mock_response
session = Session(
session_id="test",
executor=ThreadPoolExecutor(max_workers=1),
reader=StdioRequestReader(),
writer=StdioResponseWriter(),
context={
"credentials": {
"tool_credentials": {
"test": "credential_id_test",
}
}
},
)
with patch.object(session.tool, "_backwards_invoke", side_effect=mock_backwards_invoke):
invoker_specialized_result = list(
session.tool.invoke(
provider_type=ToolProviderType.BUILT_IN,
provider="test",
tool_name="test",
parameters={"test": "test"},
credential_id="special_credential_id",
)
)
no_credential_id_result = list(
session.tool.invoke(
provider_type=ToolProviderType.BUILT_IN,
provider="test",
tool_name="test",
parameters={"test": "test"},
)
)
no_context_result = list(
session.tool.invoke(
provider_type=ToolProviderType.BUILT_IN,
provider="no_context_tool",
tool_name="no_context_tool",
parameters={"test": "test"},
)
)
assert len(invoker_specialized_result) == 1
assert isinstance(invoker_specialized_result[0].message, ToolInvokeMessage.TextMessage)
assert invoker_specialized_result[0].message.text == "special_credential_id"
assert len(no_credential_id_result) == 1
assert isinstance(no_credential_id_result[0].message, ToolInvokeMessage.TextMessage)
assert no_credential_id_result[0].message.text == "credential_id_test"
assert len(no_context_result) == 1
assert isinstance(no_context_result[0].message, ToolInvokeMessage.TextMessage)
assert no_context_result[0].message.text == "no_credential_id"