From 103beea7a693611cd375b944df1752e723956646 Mon Sep 17 00:00:00 2001 From: WideLee Date: Fri, 17 Apr 2026 20:42:41 +0800 Subject: [PATCH] fix(qqbot): fix test failures after package refactor - Re-export _ssrf_redirect_guard from __init__.py - Fix _parse_json @staticmethod using self._log_tag - Update test_detect_message_type to call as instance method - Fix mock.patch path for httpx.AsyncClient in adapter submodule --- gateway/platforms/qqbot/__init__.py | 2 ++ gateway/platforms/qqbot/adapter.py | 2 +- tests/gateway/test_qqbot.py | 5 +++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/gateway/platforms/qqbot/__init__.py b/gateway/platforms/qqbot/__init__.py index 4877baa5..7119dd97 100644 --- a/gateway/platforms/qqbot/__init__.py +++ b/gateway/platforms/qqbot/__init__.py @@ -20,6 +20,7 @@ from .adapter import ( # noqa: F401 QQCloseError, check_qq_requirements, _coerce_list, + _ssrf_redirect_guard, ) # -- Onboard (QR-code scan-to-configure) ----------------------------------- @@ -40,6 +41,7 @@ __all__ = [ "QQCloseError", "check_qq_requirements", "_coerce_list", + "_ssrf_redirect_guard", # onboard "BindStatus", "create_bind_task", diff --git a/gateway/platforms/qqbot/adapter.py b/gateway/platforms/qqbot/adapter.py index 286d8347..5a048345 100644 --- a/gateway/platforms/qqbot/adapter.py +++ b/gateway/platforms/qqbot/adapter.py @@ -766,7 +766,7 @@ class QQAdapter(BasePlatformAdapter): try: payload = json.loads(raw) except Exception: - logger.debug("[%s] Failed to parse JSON: %r", self._log_tag, raw) + logger.warning("[QQBot] Failed to parse JSON: %r", raw) return None return payload if isinstance(payload, dict) else None diff --git a/tests/gateway/test_qqbot.py b/tests/gateway/test_qqbot.py index 18b1b59b..6446762e 100644 --- a/tests/gateway/test_qqbot.py +++ b/tests/gateway/test_qqbot.py @@ -179,7 +179,7 @@ class TestVoiceAttachmentSSRFProtection: from gateway.platforms.qqbot import QQAdapter, _ssrf_redirect_guard client = mock.AsyncMock() - with mock.patch("gateway.platforms.qqbot.httpx.AsyncClient", return_value=client) as async_client_cls: + with mock.patch("gateway.platforms.qqbot.adapter.httpx.AsyncClient", return_value=client) as async_client_cls: adapter = QQAdapter(_make_config(app_id="a", client_secret="b")) adapter._ensure_token = mock.AsyncMock(side_effect=RuntimeError("stop after client creation")) @@ -316,7 +316,8 @@ class TestResolveSTTConfig: class TestDetectMessageType: def _fn(self, media_urls, media_types): from gateway.platforms.qqbot import QQAdapter - return QQAdapter._detect_message_type(media_urls, media_types) + adapter = QQAdapter(_make_config(app_id="a", client_secret="b")) + return adapter._detect_message_type(media_urls, media_types) def test_no_media(self): from gateway.platforms.base import MessageType