Files
dify-plugin-sdks/python/tests/interfaces/tool/test_costruct_tool.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

79 lines
2.8 KiB
Python

from collections.abc import Generator, Mapping
from concurrent.futures import ThreadPoolExecutor
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 import I18nObject, ParameterOption
from dify_plugin.entities.provider_config import CredentialType
from dify_plugin.entities.tool import ToolInvokeMessage, ToolRuntime
from dify_plugin.interfaces.tool import Tool
def test_construct_tool():
"""
Test the constructor of Tool
NOTE:
- This test is to ensure that the constructor of Tool is not overridden.
- And ensure a breaking change will be detected by CI.
"""
class ToolImpl(Tool):
def _invoke(self, tool_parameters: Mapping) -> Generator[ToolInvokeMessage, None, None]:
yield self.create_text_message("Hello, world!")
session = Session(
session_id="test",
executor=ThreadPoolExecutor(max_workers=1),
reader=StdioRequestReader(),
writer=StdioResponseWriter(),
)
tool = ToolImpl(runtime=ToolRuntime(credentials={}, user_id="test", session_id="test"), session=session)
assert tool is not None
def test_construct_tool_default_credential_type():
"""
Test the constructor of Tool with default credential type
"""
class ToolImpl(Tool):
def _invoke(self, tool_parameters: Mapping) -> Generator[ToolInvokeMessage, None, None]:
yield self.create_text_message("Hello, world!")
session = Session(
session_id="test",
executor=ThreadPoolExecutor(max_workers=1),
reader=StdioRequestReader(),
writer=StdioResponseWriter(),
)
tool = ToolImpl(runtime=ToolRuntime(credentials={}, user_id="test", session_id="test"), session=session)
assert tool is not None
assert tool.runtime.credential_type == CredentialType.API_KEY
def test_fetch_parameter_options():
"""
Test that the Tool can fetch the parameter options
"""
class ToolImpl(Tool):
def _invoke(self, tool_parameters: Mapping) -> Generator[ToolInvokeMessage, None, None]:
yield self.create_text_message("Hello, world!")
def _fetch_parameter_options(self, parameter: str) -> list[ParameterOption]:
return [ParameterOption(value="test", label=I18nObject(en_US="test"))]
session = Session(
session_id="test",
executor=ThreadPoolExecutor(max_workers=1),
reader=StdioRequestReader(),
writer=StdioResponseWriter(),
)
tool = ToolImpl(runtime=ToolRuntime(credentials={}, user_id="test", session_id="test"), session=session)
assert tool.fetch_parameter_options("test") == [ParameterOption(value="test", label=I18nObject(en_US="test"))]