2026-07-02 03:28:19 +08:00
|
|
|
|
"""channels plugins 层单元测试共享 fixture。
|
|
|
|
|
|
|
|
|
|
|
|
提供 ``fake_plugin_host`` 桩,模拟 ``PluginHost`` 协议
|
|
|
|
|
|
(``yuxi.channels.contract.plugin.entry.PluginHost``)。插件适配器测试
|
|
|
|
|
|
通过此桩获取被驱动端口与注册扩展点,不依赖真实宿主实现。
|
|
|
|
|
|
|
|
|
|
|
|
桩使用 ``MagicMock()``:所有 ``getXxxPort()`` 返回对应 ``MagicMock`` 桩
|
2026-07-04 00:18:04 +08:00
|
|
|
|
(调用方可按需覆盖为带 ``spec`` 的端口桩),``registerXxx()`` 返回 ``None``,
|
|
|
|
|
|
``publishEvent`` 为 ``AsyncMock``(可 ``await``)。单文件独有的 helper 应保留
|
|
|
|
|
|
在对应测试文件内(见 testing-guidelines.md)。
|
2026-07-02 03:28:19 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
|
|
from unittest.mock import AsyncMock, MagicMock
|
|
|
|
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
|
|
def fake_plugin_host() -> MagicMock:
|
|
|
|
|
|
"""PluginHost 桩。
|
|
|
|
|
|
|
|
|
|
|
|
``MagicMock()`` 模拟 ``PluginHost``:
|
|
|
|
|
|
- 所有 ``getXxxPort()`` 返回 ``MagicMock`` 桩(调用方可覆盖为带
|
|
|
|
|
|
``spec`` 的端口桩,如 ``host.getLoggerPort.return_value = fake_logger``);
|
|
|
|
|
|
- ``registerAdapter()`` / ``registerStageSlot()`` / ``registerEventSubscription()``
|
|
|
|
|
|
/ ``registerConfigSource()`` / ``registerMatchTier()`` / ``registerMatcher()``
|
2026-07-04 00:18:04 +08:00
|
|
|
|
返回 ``None``;
|
2026-07-02 03:28:19 +08:00
|
|
|
|
- ``publishEvent`` 为 ``AsyncMock``(可 ``await``),返回 ``None``。
|
|
|
|
|
|
"""
|
|
|
|
|
|
host = MagicMock()
|
|
|
|
|
|
# 端口获取:返回 MagicMock 桩,调用方可覆盖为带 spec 的端口桩
|
|
|
|
|
|
host.getConfigPort.return_value = MagicMock()
|
|
|
|
|
|
host.getLoggerPort.return_value = MagicMock()
|
|
|
|
|
|
host.getPersistencePort.return_value = MagicMock()
|
|
|
|
|
|
host.getCachePort.return_value = MagicMock()
|
|
|
|
|
|
host.getTracerPort.return_value = MagicMock()
|
|
|
|
|
|
host.getQueuePort.return_value = MagicMock()
|
|
|
|
|
|
host.getConversationPort.return_value = MagicMock()
|
|
|
|
|
|
host.getAgentRunPort.return_value = MagicMock()
|
|
|
|
|
|
host.getIdentityResolverPort.return_value = MagicMock()
|
|
|
|
|
|
host.getChannelAccountRepositoryPort.return_value = MagicMock()
|
|
|
|
|
|
host.getChannelSessionRepositoryPort.return_value = MagicMock()
|
|
|
|
|
|
host.getPairingRepositoryPort.return_value = MagicMock()
|
|
|
|
|
|
host.getAuditLogRepositoryPort.return_value = MagicMock()
|
|
|
|
|
|
host.getOutboxRepositoryPort.return_value = MagicMock()
|
|
|
|
|
|
host.getUserIdentityRepositoryPort.return_value = MagicMock()
|
|
|
|
|
|
host.getIdempotencyRepositoryPort.return_value = MagicMock()
|
|
|
|
|
|
host.getPersistenceHealthPort.return_value = MagicMock()
|
|
|
|
|
|
# 扩展点注册:返回 None
|
|
|
|
|
|
host.registerAdapter.return_value = None
|
|
|
|
|
|
host.registerStageSlot.return_value = None
|
|
|
|
|
|
host.registerEventSubscription.return_value = None
|
|
|
|
|
|
host.registerConfigSource.return_value = None
|
|
|
|
|
|
host.registerMatchTier.return_value = None
|
|
|
|
|
|
host.registerMatcher.return_value = None
|
|
|
|
|
|
# 事件发布:async def,使用 AsyncMock
|
|
|
|
|
|
host.publishEvent = AsyncMock(return_value=None)
|
|
|
|
|
|
return host
|