Adds Feishu (ByteDance's enterprise messaging platform) as a gateway platform adapter with full feature parity: WebSocket + webhook transports, message batching, dedup, rate limiting, rich post/card content parsing, media handling (images/audio/files/video), group @mention gating, reaction routing, and interactive card button support. Cherry-picked from PR #1793 by penwyp with: - Moved to current main (PR was 458 commits behind) - Fixed _send_with_retry shadowing BasePlatformAdapter method (renamed to _feishu_send_with_retry to avoid signature mismatch crash) - Fixed import structure: aiohttp/websockets imported independently of lark_oapi so they remain available when SDK is missing - Fixed get_hermes_home import (hermes_constants, not hermes_cli.config) - Added skip decorators for tests requiring lark_oapi SDK - All 16 integration points added surgically to current main New dependency: lark-oapi>=1.5.3,<2 (optional, pip install hermes-agent[feishu]) Fixes #1788 Co-authored-by: penwyp <penwyp@users.noreply.github.com>
47 lines
2.0 KiB
Python
47 lines
2.0 KiB
Python
"""Tests for the startup allowlist warning check in gateway/run.py."""
|
|
|
|
import os
|
|
from unittest.mock import patch
|
|
|
|
|
|
def _would_warn():
|
|
"""Replicate the startup allowlist warning logic. Returns True if warning fires."""
|
|
_any_allowlist = any(
|
|
os.getenv(v)
|
|
for v in ("TELEGRAM_ALLOWED_USERS", "DISCORD_ALLOWED_USERS",
|
|
"WHATSAPP_ALLOWED_USERS", "SLACK_ALLOWED_USERS",
|
|
"SIGNAL_ALLOWED_USERS", "SIGNAL_GROUP_ALLOWED_USERS",
|
|
"EMAIL_ALLOWED_USERS",
|
|
"SMS_ALLOWED_USERS", "MATTERMOST_ALLOWED_USERS",
|
|
"MATRIX_ALLOWED_USERS", "DINGTALK_ALLOWED_USERS", "FEISHU_ALLOWED_USERS",
|
|
"GATEWAY_ALLOWED_USERS")
|
|
)
|
|
_allow_all = os.getenv("GATEWAY_ALLOW_ALL_USERS", "").lower() in ("true", "1", "yes") or any(
|
|
os.getenv(v, "").lower() in ("true", "1", "yes")
|
|
for v in ("TELEGRAM_ALLOW_ALL_USERS", "DISCORD_ALLOW_ALL_USERS",
|
|
"WHATSAPP_ALLOW_ALL_USERS", "SLACK_ALLOW_ALL_USERS",
|
|
"SIGNAL_ALLOW_ALL_USERS", "EMAIL_ALLOW_ALL_USERS",
|
|
"SMS_ALLOW_ALL_USERS", "MATTERMOST_ALLOW_ALL_USERS",
|
|
"MATRIX_ALLOW_ALL_USERS", "DINGTALK_ALLOW_ALL_USERS", "FEISHU_ALLOW_ALL_USERS")
|
|
)
|
|
return not _any_allowlist and not _allow_all
|
|
|
|
|
|
class TestAllowlistStartupCheck:
|
|
|
|
def test_no_config_emits_warning(self):
|
|
with patch.dict(os.environ, {}, clear=True):
|
|
assert _would_warn() is True
|
|
|
|
def test_signal_group_allowed_users_suppresses_warning(self):
|
|
with patch.dict(os.environ, {"SIGNAL_GROUP_ALLOWED_USERS": "user1"}, clear=True):
|
|
assert _would_warn() is False
|
|
|
|
def test_telegram_allow_all_users_suppresses_warning(self):
|
|
with patch.dict(os.environ, {"TELEGRAM_ALLOW_ALL_USERS": "true"}, clear=True):
|
|
assert _would_warn() is False
|
|
|
|
def test_gateway_allow_all_users_suppresses_warning(self):
|
|
with patch.dict(os.environ, {"GATEWAY_ALLOW_ALL_USERS": "yes"}, clear=True):
|
|
assert _would_warn() is False
|