From 1242999888a2a75b9a36506a9ad09d4b5051882d Mon Sep 17 00:00:00 2001 From: Kris <2893855659@qq.com> Date: Wed, 13 May 2026 18:03:43 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E6=B7=BB=E5=8A=A0=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?=E6=B8=A0=E9=81=93=E9=80=82=E9=85=8D=E5=99=A8=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 本次提交新增了超过20个单元测试文件,覆盖Twitch、Telegram、WeChat、Discord、Slack、Mattermost等多个渠道适配器以及核心组件的测试: 1. 新增Twitch令牌工具、限流器、去重器相关测试 2. 新增Telegram分块、格式、安全策略、流媒体相关测试 3. 新增微信适配器、限流、会话、链接格式、监控等测试 4. 新增Discord命令、会话、格式化、Webhook相关测试 5. 新增Slack、Mattermost、Nostr、Signal、Zalo、NextcloudTalk等渠道的测试用例 6. 新增核心路由、会话路由、文本分块器的冒烟测试 --- .../bluebubbles_imessage}/test_channels_bluebubbles.py | 0 .../bluebubbles_imessage}/test_channels_bluebubbles_supplement.py | 0 .../{ => adapters/bluebubbles_imessage}/test_channels_imessage.py | 0 .../bluebubbles_imessage}/test_channels_imessage_adapter_edge.py | 0 .../bluebubbles_imessage}/test_channels_imessage_commands.py | 0 .../bluebubbles_imessage}/test_channels_imessage_config.py | 0 .../bluebubbles_imessage}/test_channels_imessage_exceptions.py | 0 .../bluebubbles_imessage}/test_channels_imessage_formatter.py | 0 .../bluebubbles_imessage}/test_channels_imessage_media.py | 0 .../bluebubbles_imessage}/test_channels_imessage_monitor.py | 0 .../bluebubbles_imessage}/test_channels_imessage_normalize.py | 0 .../bluebubbles_imessage}/test_channels_imessage_probe.py | 0 .../bluebubbles_imessage}/test_channels_imessage_sanitize.py | 0 .../bluebubbles_imessage}/test_channels_imessage_security.py | 0 .../bluebubbles_imessage}/test_channels_imessage_utils.py | 0 .../channels/{ => adapters/dingding}/test_channels_dingding.py | 0 .../{ => adapters/dingding}/test_dingding_adapter_fixes.py | 0 .../{ => adapters/dingding}/test_dingding_adapter_quick.py | 0 .../unit/channels/{ => adapters/discord}/test_discord_accounts.py | 0 .../channels/{ => adapters/discord}/test_discord_adapter_p0.py | 0 .../unit/channels/{ => adapters/discord}/test_discord_analysis.py | 0 .../channels/{ => adapters/discord}/test_discord_auto_presence.py | 0 .../unit/channels/{ => adapters/discord}/test_discord_chunker.py | 0 .../unit/channels/{ => adapters/discord}/test_discord_commands.py | 0 .../channels/{ => adapters/discord}/test_discord_components.py | 0 .../unit/channels/{ => adapters/discord}/test_discord_dedupe.py | 0 .../unit/channels/{ => adapters/discord}/test_discord_doctor.py | 0 .../channels/{ => adapters/discord}/test_discord_event_queue.py | 0 .../channels/{ => adapters/discord}/test_discord_formatter.py | 0 .../channels/{ => adapters/discord}/test_discord_normalizer.py | 0 .../unit/channels/{ => adapters/discord}/test_discord_poll.py | 0 .../{ => adapters/discord}/test_discord_rest_scheduler.py | 0 .../{ => adapters/discord}/test_discord_security_audit.py | 0 .../channels/{ => adapters/discord}/test_discord_security_full.py | 0 .../unit/channels/{ => adapters/discord}/test_discord_send.py | 0 .../unit/channels/{ => adapters/discord}/test_discord_session.py | 0 .../unit/channels/{ => adapters/discord}/test_discord_webhook.py | 0 .../unit/channels/{ => adapters/feishu}/test_channels_feishu.py | 0 .../{ => adapters/feishu}/test_channels_feishu_comprehensive.py | 0 .../{ => adapters/feishu}/test_channels_feishu_optimizations.py | 0 .../channels/{ => adapters/feishu}/test_channels_feishu_p0.py | 0 .../unit/channels/{ => adapters/googlechat}/test_googlechat.py | 0 .../channels/{ => adapters/googlechat}/test_googlechat_adapter.py | 0 .../channels/{ => adapters/googlechat}/test_googlechat_modules.py | 0 .../channels/{ => adapters/googlechat}/test_googlechat_send.py | 0 backend/test/unit/channels/{ => adapters/irc}/test_irc_adapter.py | 0 .../test/unit/channels/{ => adapters/irc}/test_irc_analysis.py | 0 .../unit/channels/{ => adapters/irc}/test_irc_comprehensive.py | 0 .../test/unit/channels/{ => adapters/irc}/test_irc_enhancement.py | 0 backend/test/unit/channels/{ => adapters/irc}/test_irc_fixes.py | 0 .../unit/channels/{ => adapters/irc}/test_irc_new_features.py | 0 .../test/unit/channels/{ => adapters/line}/test_line_adapter.py | 0 .../{ => adapters/line}/test_line_adapter_comprehensive.py | 0 .../unit/channels/{ => adapters/matrix}/test_channels_matrix.py | 0 .../{ => adapters/matrix}/test_channels_matrix_comprehensive.py | 0 .../mattermost}/test_channels_mattermost_normalizer.py | 0 .../{ => adapters/mattermost}/test_channels_mattermost_session.py | 0 .../channels/{ => adapters/mattermost}/test_mattermost_adapter.py | 0 .../{ => adapters/mattermost}/test_mattermost_adapter_fixes.py | 0 .../{ => adapters/mattermost}/test_mattermost_comprehensive.py | 0 .../{ => adapters/mattermost}/test_mattermost_normalizer.py | 0 .../{ => adapters/mattermost}/test_mattermost_optimization.py | 0 .../{ => adapters/mattermost}/test_mattermost_optimization_p0.py | 0 .../channels/{ => adapters/mattermost}/test_mattermost_send.py | 0 .../channels/{ => adapters/mattermost}/test_mattermost_session.py | 0 .../{ => adapters/msteams}/test_msteams_accounts_audit.py | 0 .../unit/channels/{ => adapters/msteams}/test_msteams_adapter.py | 0 .../unit/channels/{ => adapters/msteams}/test_msteams_analysis.py | 0 .../channels/{ => adapters/msteams}/test_msteams_auth_audio.py | 0 .../unit/channels/{ => adapters/msteams}/test_msteams_chunking.py | 0 .../unit/channels/{ => adapters/msteams}/test_msteams_config.py | 0 .../unit/channels/{ => adapters/msteams}/test_msteams_fixes.py | 0 .../unit/channels/{ => adapters/msteams}/test_msteams_helpers.py | 0 .../unit/channels/{ => adapters/msteams}/test_msteams_phase1.py | 0 .../{ => adapters/msteams}/test_msteams_runtime_presentation.py | 0 .../unit/channels/{ => adapters/msteams}/test_msteams_storage.py | 0 .../{ => adapters/nextcloudtalk}/test_nextcloudtalk_accounts.py | 0 .../{ => adapters/nextcloudtalk}/test_nextcloudtalk_adapter.py | 0 .../{ => adapters/nextcloudtalk}/test_nextcloudtalk_chunking.py | 0 .../nextcloudtalk}/test_nextcloudtalk_config_enhanced.py | 0 .../nextcloudtalk}/test_nextcloudtalk_credentials.py | 0 .../nextcloudtalk}/test_nextcloudtalk_dedup_enhanced.py | 0 .../nextcloudtalk}/test_nextcloudtalk_formatter_enhanced.py | 0 .../{ => adapters/nextcloudtalk}/test_nextcloudtalk_metrics.py | 0 .../{ => adapters/nextcloudtalk}/test_nextcloudtalk_normalize.py | 0 .../nextcloudtalk}/test_nextcloudtalk_setup_wizard.py | 0 .../nextcloudtalk}/test_nextcloudtalk_webhook_server.py | 0 .../channels/{ => adapters/nostr}/test_channels_nostr_analysis.py | 0 .../{ => adapters/nostr}/test_channels_nostr_optimizations.py | 0 .../test/unit/channels/{ => adapters/nostr}/test_nostr_adapter.py | 0 .../unit/channels/{ => adapters/nostr}/test_nostr_adapter_ext.py | 0 .../unit/channels/{ => adapters/nostr}/test_nostr_config_ext.py | 0 .../test/unit/channels/{ => adapters/nostr}/test_nostr_crypto.py | 0 .../test/unit/channels/{ => adapters/nostr}/test_nostr_fuzz.py | 0 .../unit/channels/{ => adapters/nostr}/test_nostr_guard_ext.py | 0 .../unit/channels/{ => adapters/nostr}/test_nostr_health_ext.py | 0 .../unit/channels/{ => adapters/nostr}/test_nostr_integration.py | 0 .../test/unit/channels/{ => adapters/nostr}/test_nostr_metrics.py | 0 .../test/unit/channels/{ => adapters/nostr}/test_nostr_models.py | 0 .../test/unit/channels/{ => adapters/nostr}/test_nostr_nip05.py | 0 .../test/unit/channels/{ => adapters/nostr}/test_nostr_pair.py | 0 .../test/unit/channels/{ => adapters/nostr}/test_nostr_relay.py | 0 .../test/unit/channels/{ => adapters/nostr}/test_nostr_send.py | 0 .../unit/channels/{ => adapters/nostr}/test_nostr_send_cache.py | 0 .../unit/channels/{ => adapters/nostr}/test_nostr_send_ext.py | 0 .../unit/channels/{ => adapters/nostr}/test_nostr_state_store.py | 0 .../test/unit/channels/{ => adapters/nostr}/test_nostr_target.py | 0 .../channels/{ => adapters/nostr}/test_nostr_thread_session.py | 0 backend/test/unit/channels/{ => adapters/nostr}/test_nostr_zap.py | 0 .../test/unit/channels/{ => adapters/qqbot}/test_qqbot_adapter.py | 0 .../unit/channels/{ => adapters/qqbot}/test_qqbot_analysis.py | 0 .../test/unit/channels/{ => adapters/qqbot}/test_qqbot_modules.py | 0 .../unit/channels/{ => adapters/signal}/test_channels_signal.py | 0 .../{ => adapters/signal}/test_channels_signal_comprehensive.py | 0 .../channels/{ => adapters/signal}/test_channels_signal_daemon.py | 0 .../{ => adapters/signal}/test_channels_signal_multi_account.py | 0 .../{ => adapters/signal}/test_channels_signal_streaming.py | 0 .../channels/{ => adapters/slack}/test_channels_slack_adapter.py | 0 .../{ => adapters/slack}/test_channels_slack_allowlist.py | 0 .../channels/{ => adapters/slack}/test_channels_slack_approval.py | 0 .../channels/{ => adapters/slack}/test_channels_slack_blocks.py | 0 .../channels/{ => adapters/slack}/test_channels_slack_chunker.py | 0 .../channels/{ => adapters/slack}/test_channels_slack_commands.py | 0 .../{ => adapters/slack}/test_channels_slack_normalizer.py | 0 .../channels/{ => adapters/slack}/test_channels_slack_pairing.py | 0 .../channels/{ => adapters/slack}/test_channels_slack_scopes.py | 0 .../channels/{ => adapters/slack}/test_channels_slack_security.py | 0 .../channels/{ => adapters/slack}/test_channels_slack_session.py | 0 .../{ => adapters/synologychat}/test_synologychat_adapter.py | 0 .../synologychat}/test_synologychat_comprehensive.py | 0 .../channels/{ => adapters/telegram}/test_telegram_adapter.py | 0 .../channels/{ => adapters/telegram}/test_telegram_chunking.py | 0 .../{ => adapters/telegram}/test_telegram_comprehensive.py | 0 .../unit/channels/{ => adapters/telegram}/test_telegram_format.py | 0 .../channels/{ => adapters/telegram}/test_telegram_format_new.py | 0 .../{ => adapters/telegram}/test_telegram_remaining_fixes.py | 0 .../channels/{ => adapters/telegram}/test_telegram_security.py | 0 .../{ => adapters/telegram}/test_telegram_security_new.py | 0 .../{ => adapters/telegram}/test_telegram_streaming_new.py | 0 .../unit/channels/{ => adapters/twitch}/test_twitch_actions.py | 0 .../unit/channels/{ => adapters/twitch}/test_twitch_adapter.py | 0 .../channels/{ => adapters/twitch}/test_twitch_auth_provider.py | 0 .../channels/{ => adapters/twitch}/test_twitch_config_schema.py | 0 .../channels/{ => adapters/twitch}/test_twitch_deduplicator.py | 0 .../unit/channels/{ => adapters/twitch}/test_twitch_eventsub.py | 0 .../test/unit/channels/{ => adapters/twitch}/test_twitch_helix.py | 0 .../unit/channels/{ => adapters/twitch}/test_twitch_irc_parser.py | 0 .../unit/channels/{ => adapters/twitch}/test_twitch_markdown.py | 0 .../unit/channels/{ => adapters/twitch}/test_twitch_normalizer.py | 0 .../channels/{ => adapters/twitch}/test_twitch_outbound_cache.py | 0 .../unit/channels/{ => adapters/twitch}/test_twitch_pairing.py | 0 .../channels/{ => adapters/twitch}/test_twitch_rate_limiter.py | 0 .../channels/{ => adapters/twitch}/test_twitch_send_formats.py | 0 .../unit/channels/{ => adapters/twitch}/test_twitch_session.py | 0 .../test/unit/channels/{ => adapters/twitch}/test_twitch_setup.py | 0 .../channels/{ => adapters/twitch}/test_twitch_token_utils.py | 0 .../test/unit/channels/{ => adapters/urbit}/test_urbit_adapter.py | 0 .../{ => adapters/urbit}/test_urbit_adapter_supplement.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_adapter.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_bridge.py | 0 .../channels/{ => adapters/wechat}/test_wechat_capabilities.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_chunker.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_client.py | 0 .../channels/{ => adapters/wechat}/test_wechat_config_ui_hints.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_crypto.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_debounce.py | 0 .../channels/{ => adapters/wechat}/test_wechat_dual_plugin.py | 0 .../channels/{ => adapters/wechat}/test_wechat_enhancements.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_errors.py | 0 .../test/unit/channels/{ => adapters/wechat}/test_wechat_fixes.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_format.py | 0 .../channels/{ => adapters/wechat}/test_wechat_group_admin.py | 0 .../channels/{ => adapters/wechat}/test_wechat_link_format.py | 0 .../test/unit/channels/{ => adapters/wechat}/test_wechat_media.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_monitor.py | 0 .../{ => adapters/wechat}/test_wechat_mp_passive_reply.py | 0 .../channels/{ => adapters/wechat}/test_wechat_optimization.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_pairing.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_rate_limit.py | 0 .../channels/{ => adapters/wechat}/test_wechat_rate_limiter.py | 0 .../test/unit/channels/{ => adapters/wechat}/test_wechat_retry.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_secrets.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_security.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_selector.py | 0 .../test/unit/channels/{ => adapters/wechat}/test_wechat_send.py | 0 .../channels/{ => adapters/wechat}/test_wechat_send_payloads.py | 0 .../unit/channels/{ => adapters/wechat}/test_wechat_session.py | 0 .../{ => adapters/whatsapp}/test_whatsapp_accounts_config.py | 0 .../channels/{ => adapters/whatsapp}/test_whatsapp_adapter.py | 0 .../channels/{ => adapters/whatsapp}/test_whatsapp_analysis.py | 0 .../{ => adapters/whatsapp}/test_whatsapp_caching_debounce.py | 0 .../{ => adapters/whatsapp}/test_whatsapp_io_credentials.py | 0 .../channels/{ => adapters/whatsapp}/test_whatsapp_poll_format.py | 0 .../{ => adapters/whatsapp}/test_whatsapp_reactions_markdown.py | 0 .../{ => adapters/whatsapp}/test_whatsapp_security_pairing.py | 0 .../unit/channels/{ => adapters/yuanbao}/test_yuanbao_adapter.py | 0 .../unit/channels/{ => adapters/yuanbao}/test_yuanbao_analysis.py | 0 .../channels/{ => adapters/yuanbao}/test_yuanbao_enhancements.py | 0 .../unit/channels/{ => adapters/yuanbao}/test_yuanbao_fixes.py | 0 .../channels/{ => adapters/yuanbao}/test_yuanbao_optimization.py | 0 .../unit/channels/{ => adapters/zalo}/test_channels_zalo_user.py | 0 .../unit/channels/{ => adapters/zalo}/test_zalo_oa_adapter.py | 0 .../channels/{ => adapters/zalo}/test_zalo_oa_comprehensive.py | 0 .../unit/channels/{ => adapters/zalo}/test_zalo_user_cards.py | 0 .../channels/{ => adapters/zalo}/test_zalo_user_comprehensive.py | 0 .../channels/{ => adapters/zalo}/test_zalo_user_config_schema.py | 0 .../channels/{ => adapters/zalo}/test_zalo_user_credentials.py | 0 .../unit/channels/{ => adapters/zalo}/test_zalo_user_directory.py | 0 .../unit/channels/{ => adapters/zalo}/test_zalo_user_gateway.py | 0 .../{ => adapters/zalo}/test_zalo_user_interactive_dispatch.py | 0 .../channels/{ => adapters/zalo}/test_zalo_user_normalize_new.py | 0 .../unit/channels/{ => adapters/zalo}/test_zalo_user_reaction.py | 0 .../unit/channels/{ => adapters/zalo}/test_zalo_user_sticker.py | 0 .../channels/{ => adapters/zalo}/test_zalo_user_text_styles.py | 0 backend/test/unit/channels/{ => core}/test_actions.py | 0 backend/test/unit/channels/{ => core}/test_auth_module.py | 0 backend/test/unit/channels/{ => core}/test_base.py | 0 backend/test/unit/channels/{ => core}/test_broadcast.py | 0 backend/test/unit/channels/{ => core}/test_capabilities.py | 0 backend/test/unit/channels/{ => core}/test_channels_accounts.py | 0 backend/test/unit/channels/{ => core}/test_channels_approval.py | 0 backend/test/unit/channels/{ => core}/test_channels_debounce.py | 0 backend/test/unit/channels/{ => core}/test_channels_directory.py | 0 backend/test/unit/channels/{ => core}/test_channels_policy.py | 0 backend/test/unit/channels/{ => core}/test_channels_snapshot.py | 0 backend/test/unit/channels/{ => core}/test_circuit_breaker.py | 0 backend/test/unit/channels/{ => core}/test_config_watcher.py | 0 backend/test/unit/channels/{ => core}/test_context.py | 0 backend/test/unit/channels/{ => core}/test_doctor.py | 0 .../unit/channels/{ => core}/test_framework_pairing_manager.py | 0 backend/test/unit/channels/{ => core}/test_framework_pipeline.py | 0 .../unit/channels/{ => core}/test_framework_security_policy.py | 0 backend/test/unit/channels/{ => core}/test_heartbeat.py | 0 backend/test/unit/channels/{ => core}/test_history_injector.py | 0 backend/test/unit/channels/{ => core}/test_manager.py | 0 backend/test/unit/channels/{ => core}/test_manager_phases.py | 0 backend/test/unit/channels/{ => core}/test_message_actions_v2.py | 0 backend/test/unit/channels/{ => core}/test_meta_snapshot.py | 0 backend/test/unit/channels/{ => core}/test_models.py | 0 backend/test/unit/channels/{ => core}/test_protocols_bridge.py | 0 backend/test/unit/channels/{ => core}/test_registry.py | 0 backend/test/unit/channels/{ => core}/test_router.py | 0 backend/test/unit/channels/{ => core}/test_router_runtime.py | 0 backend/test/unit/channels/{ => core}/test_runtime.py | 0 backend/test/unit/channels/{ => core}/test_session_mapper.py | 0 backend/test/unit/channels/{ => core}/test_session_router.py | 0 backend/test/unit/channels/{ => core}/test_text_chunker_smoke.py | 0 .../test/unit/channels/{ => core}/test_thread_binding_manager.py | 0 backend/test/unit/channels/{ => core}/test_thread_models.py | 0 backend/test/unit/channels/{ => core}/test_thread_simulators.py | 0 250 files changed, 0 insertions(+), 0 deletions(-) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_bluebubbles.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_bluebubbles_supplement.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_imessage.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_imessage_adapter_edge.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_imessage_commands.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_imessage_config.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_imessage_exceptions.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_imessage_formatter.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_imessage_media.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_imessage_monitor.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_imessage_normalize.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_imessage_probe.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_imessage_sanitize.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_imessage_security.py (100%) rename backend/test/unit/channels/{ => adapters/bluebubbles_imessage}/test_channels_imessage_utils.py (100%) rename backend/test/unit/channels/{ => adapters/dingding}/test_channels_dingding.py (100%) rename backend/test/unit/channels/{ => adapters/dingding}/test_dingding_adapter_fixes.py (100%) rename backend/test/unit/channels/{ => adapters/dingding}/test_dingding_adapter_quick.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_accounts.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_adapter_p0.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_analysis.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_auto_presence.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_chunker.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_commands.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_components.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_dedupe.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_doctor.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_event_queue.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_formatter.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_normalizer.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_poll.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_rest_scheduler.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_security_audit.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_security_full.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_send.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_session.py (100%) rename backend/test/unit/channels/{ => adapters/discord}/test_discord_webhook.py (100%) rename backend/test/unit/channels/{ => adapters/feishu}/test_channels_feishu.py (100%) rename backend/test/unit/channels/{ => adapters/feishu}/test_channels_feishu_comprehensive.py (100%) rename backend/test/unit/channels/{ => adapters/feishu}/test_channels_feishu_optimizations.py (100%) rename backend/test/unit/channels/{ => adapters/feishu}/test_channels_feishu_p0.py (100%) rename backend/test/unit/channels/{ => adapters/googlechat}/test_googlechat.py (100%) rename backend/test/unit/channels/{ => adapters/googlechat}/test_googlechat_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/googlechat}/test_googlechat_modules.py (100%) rename backend/test/unit/channels/{ => adapters/googlechat}/test_googlechat_send.py (100%) rename backend/test/unit/channels/{ => adapters/irc}/test_irc_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/irc}/test_irc_analysis.py (100%) rename backend/test/unit/channels/{ => adapters/irc}/test_irc_comprehensive.py (100%) rename backend/test/unit/channels/{ => adapters/irc}/test_irc_enhancement.py (100%) rename backend/test/unit/channels/{ => adapters/irc}/test_irc_fixes.py (100%) rename backend/test/unit/channels/{ => adapters/irc}/test_irc_new_features.py (100%) rename backend/test/unit/channels/{ => adapters/line}/test_line_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/line}/test_line_adapter_comprehensive.py (100%) rename backend/test/unit/channels/{ => adapters/matrix}/test_channels_matrix.py (100%) rename backend/test/unit/channels/{ => adapters/matrix}/test_channels_matrix_comprehensive.py (100%) rename backend/test/unit/channels/{ => adapters/mattermost}/test_channels_mattermost_normalizer.py (100%) rename backend/test/unit/channels/{ => adapters/mattermost}/test_channels_mattermost_session.py (100%) rename backend/test/unit/channels/{ => adapters/mattermost}/test_mattermost_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/mattermost}/test_mattermost_adapter_fixes.py (100%) rename backend/test/unit/channels/{ => adapters/mattermost}/test_mattermost_comprehensive.py (100%) rename backend/test/unit/channels/{ => adapters/mattermost}/test_mattermost_normalizer.py (100%) rename backend/test/unit/channels/{ => adapters/mattermost}/test_mattermost_optimization.py (100%) rename backend/test/unit/channels/{ => adapters/mattermost}/test_mattermost_optimization_p0.py (100%) rename backend/test/unit/channels/{ => adapters/mattermost}/test_mattermost_send.py (100%) rename backend/test/unit/channels/{ => adapters/mattermost}/test_mattermost_session.py (100%) rename backend/test/unit/channels/{ => adapters/msteams}/test_msteams_accounts_audit.py (100%) rename backend/test/unit/channels/{ => adapters/msteams}/test_msteams_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/msteams}/test_msteams_analysis.py (100%) rename backend/test/unit/channels/{ => adapters/msteams}/test_msteams_auth_audio.py (100%) rename backend/test/unit/channels/{ => adapters/msteams}/test_msteams_chunking.py (100%) rename backend/test/unit/channels/{ => adapters/msteams}/test_msteams_config.py (100%) rename backend/test/unit/channels/{ => adapters/msteams}/test_msteams_fixes.py (100%) rename backend/test/unit/channels/{ => adapters/msteams}/test_msteams_helpers.py (100%) rename backend/test/unit/channels/{ => adapters/msteams}/test_msteams_phase1.py (100%) rename backend/test/unit/channels/{ => adapters/msteams}/test_msteams_runtime_presentation.py (100%) rename backend/test/unit/channels/{ => adapters/msteams}/test_msteams_storage.py (100%) rename backend/test/unit/channels/{ => adapters/nextcloudtalk}/test_nextcloudtalk_accounts.py (100%) rename backend/test/unit/channels/{ => adapters/nextcloudtalk}/test_nextcloudtalk_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/nextcloudtalk}/test_nextcloudtalk_chunking.py (100%) rename backend/test/unit/channels/{ => adapters/nextcloudtalk}/test_nextcloudtalk_config_enhanced.py (100%) rename backend/test/unit/channels/{ => adapters/nextcloudtalk}/test_nextcloudtalk_credentials.py (100%) rename backend/test/unit/channels/{ => adapters/nextcloudtalk}/test_nextcloudtalk_dedup_enhanced.py (100%) rename backend/test/unit/channels/{ => adapters/nextcloudtalk}/test_nextcloudtalk_formatter_enhanced.py (100%) rename backend/test/unit/channels/{ => adapters/nextcloudtalk}/test_nextcloudtalk_metrics.py (100%) rename backend/test/unit/channels/{ => adapters/nextcloudtalk}/test_nextcloudtalk_normalize.py (100%) rename backend/test/unit/channels/{ => adapters/nextcloudtalk}/test_nextcloudtalk_setup_wizard.py (100%) rename backend/test/unit/channels/{ => adapters/nextcloudtalk}/test_nextcloudtalk_webhook_server.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_channels_nostr_analysis.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_channels_nostr_optimizations.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_adapter_ext.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_config_ext.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_crypto.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_fuzz.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_guard_ext.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_health_ext.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_integration.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_metrics.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_models.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_nip05.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_pair.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_relay.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_send.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_send_cache.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_send_ext.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_state_store.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_target.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_thread_session.py (100%) rename backend/test/unit/channels/{ => adapters/nostr}/test_nostr_zap.py (100%) rename backend/test/unit/channels/{ => adapters/qqbot}/test_qqbot_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/qqbot}/test_qqbot_analysis.py (100%) rename backend/test/unit/channels/{ => adapters/qqbot}/test_qqbot_modules.py (100%) rename backend/test/unit/channels/{ => adapters/signal}/test_channels_signal.py (100%) rename backend/test/unit/channels/{ => adapters/signal}/test_channels_signal_comprehensive.py (100%) rename backend/test/unit/channels/{ => adapters/signal}/test_channels_signal_daemon.py (100%) rename backend/test/unit/channels/{ => adapters/signal}/test_channels_signal_multi_account.py (100%) rename backend/test/unit/channels/{ => adapters/signal}/test_channels_signal_streaming.py (100%) rename backend/test/unit/channels/{ => adapters/slack}/test_channels_slack_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/slack}/test_channels_slack_allowlist.py (100%) rename backend/test/unit/channels/{ => adapters/slack}/test_channels_slack_approval.py (100%) rename backend/test/unit/channels/{ => adapters/slack}/test_channels_slack_blocks.py (100%) rename backend/test/unit/channels/{ => adapters/slack}/test_channels_slack_chunker.py (100%) rename backend/test/unit/channels/{ => adapters/slack}/test_channels_slack_commands.py (100%) rename backend/test/unit/channels/{ => adapters/slack}/test_channels_slack_normalizer.py (100%) rename backend/test/unit/channels/{ => adapters/slack}/test_channels_slack_pairing.py (100%) rename backend/test/unit/channels/{ => adapters/slack}/test_channels_slack_scopes.py (100%) rename backend/test/unit/channels/{ => adapters/slack}/test_channels_slack_security.py (100%) rename backend/test/unit/channels/{ => adapters/slack}/test_channels_slack_session.py (100%) rename backend/test/unit/channels/{ => adapters/synologychat}/test_synologychat_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/synologychat}/test_synologychat_comprehensive.py (100%) rename backend/test/unit/channels/{ => adapters/telegram}/test_telegram_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/telegram}/test_telegram_chunking.py (100%) rename backend/test/unit/channels/{ => adapters/telegram}/test_telegram_comprehensive.py (100%) rename backend/test/unit/channels/{ => adapters/telegram}/test_telegram_format.py (100%) rename backend/test/unit/channels/{ => adapters/telegram}/test_telegram_format_new.py (100%) rename backend/test/unit/channels/{ => adapters/telegram}/test_telegram_remaining_fixes.py (100%) rename backend/test/unit/channels/{ => adapters/telegram}/test_telegram_security.py (100%) rename backend/test/unit/channels/{ => adapters/telegram}/test_telegram_security_new.py (100%) rename backend/test/unit/channels/{ => adapters/telegram}/test_telegram_streaming_new.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_actions.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_auth_provider.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_config_schema.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_deduplicator.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_eventsub.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_helix.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_irc_parser.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_markdown.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_normalizer.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_outbound_cache.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_pairing.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_rate_limiter.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_send_formats.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_session.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_setup.py (100%) rename backend/test/unit/channels/{ => adapters/twitch}/test_twitch_token_utils.py (100%) rename backend/test/unit/channels/{ => adapters/urbit}/test_urbit_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/urbit}/test_urbit_adapter_supplement.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_bridge.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_capabilities.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_chunker.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_client.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_config_ui_hints.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_crypto.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_debounce.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_dual_plugin.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_enhancements.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_errors.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_fixes.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_format.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_group_admin.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_link_format.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_media.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_monitor.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_mp_passive_reply.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_optimization.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_pairing.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_rate_limit.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_rate_limiter.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_retry.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_secrets.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_security.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_selector.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_send.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_send_payloads.py (100%) rename backend/test/unit/channels/{ => adapters/wechat}/test_wechat_session.py (100%) rename backend/test/unit/channels/{ => adapters/whatsapp}/test_whatsapp_accounts_config.py (100%) rename backend/test/unit/channels/{ => adapters/whatsapp}/test_whatsapp_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/whatsapp}/test_whatsapp_analysis.py (100%) rename backend/test/unit/channels/{ => adapters/whatsapp}/test_whatsapp_caching_debounce.py (100%) rename backend/test/unit/channels/{ => adapters/whatsapp}/test_whatsapp_io_credentials.py (100%) rename backend/test/unit/channels/{ => adapters/whatsapp}/test_whatsapp_poll_format.py (100%) rename backend/test/unit/channels/{ => adapters/whatsapp}/test_whatsapp_reactions_markdown.py (100%) rename backend/test/unit/channels/{ => adapters/whatsapp}/test_whatsapp_security_pairing.py (100%) rename backend/test/unit/channels/{ => adapters/yuanbao}/test_yuanbao_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/yuanbao}/test_yuanbao_analysis.py (100%) rename backend/test/unit/channels/{ => adapters/yuanbao}/test_yuanbao_enhancements.py (100%) rename backend/test/unit/channels/{ => adapters/yuanbao}/test_yuanbao_fixes.py (100%) rename backend/test/unit/channels/{ => adapters/yuanbao}/test_yuanbao_optimization.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_channels_zalo_user.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_zalo_oa_adapter.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_zalo_oa_comprehensive.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_zalo_user_cards.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_zalo_user_comprehensive.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_zalo_user_config_schema.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_zalo_user_credentials.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_zalo_user_directory.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_zalo_user_gateway.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_zalo_user_interactive_dispatch.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_zalo_user_normalize_new.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_zalo_user_reaction.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_zalo_user_sticker.py (100%) rename backend/test/unit/channels/{ => adapters/zalo}/test_zalo_user_text_styles.py (100%) rename backend/test/unit/channels/{ => core}/test_actions.py (100%) rename backend/test/unit/channels/{ => core}/test_auth_module.py (100%) rename backend/test/unit/channels/{ => core}/test_base.py (100%) rename backend/test/unit/channels/{ => core}/test_broadcast.py (100%) rename backend/test/unit/channels/{ => core}/test_capabilities.py (100%) rename backend/test/unit/channels/{ => core}/test_channels_accounts.py (100%) rename backend/test/unit/channels/{ => core}/test_channels_approval.py (100%) rename backend/test/unit/channels/{ => core}/test_channels_debounce.py (100%) rename backend/test/unit/channels/{ => core}/test_channels_directory.py (100%) rename backend/test/unit/channels/{ => core}/test_channels_policy.py (100%) rename backend/test/unit/channels/{ => core}/test_channels_snapshot.py (100%) rename backend/test/unit/channels/{ => core}/test_circuit_breaker.py (100%) rename backend/test/unit/channels/{ => core}/test_config_watcher.py (100%) rename backend/test/unit/channels/{ => core}/test_context.py (100%) rename backend/test/unit/channels/{ => core}/test_doctor.py (100%) rename backend/test/unit/channels/{ => core}/test_framework_pairing_manager.py (100%) rename backend/test/unit/channels/{ => core}/test_framework_pipeline.py (100%) rename backend/test/unit/channels/{ => core}/test_framework_security_policy.py (100%) rename backend/test/unit/channels/{ => core}/test_heartbeat.py (100%) rename backend/test/unit/channels/{ => core}/test_history_injector.py (100%) rename backend/test/unit/channels/{ => core}/test_manager.py (100%) rename backend/test/unit/channels/{ => core}/test_manager_phases.py (100%) rename backend/test/unit/channels/{ => core}/test_message_actions_v2.py (100%) rename backend/test/unit/channels/{ => core}/test_meta_snapshot.py (100%) rename backend/test/unit/channels/{ => core}/test_models.py (100%) rename backend/test/unit/channels/{ => core}/test_protocols_bridge.py (100%) rename backend/test/unit/channels/{ => core}/test_registry.py (100%) rename backend/test/unit/channels/{ => core}/test_router.py (100%) rename backend/test/unit/channels/{ => core}/test_router_runtime.py (100%) rename backend/test/unit/channels/{ => core}/test_runtime.py (100%) rename backend/test/unit/channels/{ => core}/test_session_mapper.py (100%) rename backend/test/unit/channels/{ => core}/test_session_router.py (100%) rename backend/test/unit/channels/{ => core}/test_text_chunker_smoke.py (100%) rename backend/test/unit/channels/{ => core}/test_thread_binding_manager.py (100%) rename backend/test/unit/channels/{ => core}/test_thread_models.py (100%) rename backend/test/unit/channels/{ => core}/test_thread_simulators.py (100%) diff --git a/backend/test/unit/channels/test_channels_bluebubbles.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_bluebubbles.py similarity index 100% rename from backend/test/unit/channels/test_channels_bluebubbles.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_bluebubbles.py diff --git a/backend/test/unit/channels/test_channels_bluebubbles_supplement.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_bluebubbles_supplement.py similarity index 100% rename from backend/test/unit/channels/test_channels_bluebubbles_supplement.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_bluebubbles_supplement.py diff --git a/backend/test/unit/channels/test_channels_imessage.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage.py similarity index 100% rename from backend/test/unit/channels/test_channels_imessage.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage.py diff --git a/backend/test/unit/channels/test_channels_imessage_adapter_edge.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_adapter_edge.py similarity index 100% rename from backend/test/unit/channels/test_channels_imessage_adapter_edge.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_adapter_edge.py diff --git a/backend/test/unit/channels/test_channels_imessage_commands.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_commands.py similarity index 100% rename from backend/test/unit/channels/test_channels_imessage_commands.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_commands.py diff --git a/backend/test/unit/channels/test_channels_imessage_config.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_config.py similarity index 100% rename from backend/test/unit/channels/test_channels_imessage_config.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_config.py diff --git a/backend/test/unit/channels/test_channels_imessage_exceptions.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_exceptions.py similarity index 100% rename from backend/test/unit/channels/test_channels_imessage_exceptions.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_exceptions.py diff --git a/backend/test/unit/channels/test_channels_imessage_formatter.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_formatter.py similarity index 100% rename from backend/test/unit/channels/test_channels_imessage_formatter.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_formatter.py diff --git a/backend/test/unit/channels/test_channels_imessage_media.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_media.py similarity index 100% rename from backend/test/unit/channels/test_channels_imessage_media.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_media.py diff --git a/backend/test/unit/channels/test_channels_imessage_monitor.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_monitor.py similarity index 100% rename from backend/test/unit/channels/test_channels_imessage_monitor.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_monitor.py diff --git a/backend/test/unit/channels/test_channels_imessage_normalize.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_normalize.py similarity index 100% rename from backend/test/unit/channels/test_channels_imessage_normalize.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_normalize.py diff --git a/backend/test/unit/channels/test_channels_imessage_probe.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_probe.py similarity index 100% rename from backend/test/unit/channels/test_channels_imessage_probe.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_probe.py diff --git a/backend/test/unit/channels/test_channels_imessage_sanitize.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_sanitize.py similarity index 100% rename from backend/test/unit/channels/test_channels_imessage_sanitize.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_sanitize.py diff --git a/backend/test/unit/channels/test_channels_imessage_security.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_security.py similarity index 100% rename from backend/test/unit/channels/test_channels_imessage_security.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_security.py diff --git a/backend/test/unit/channels/test_channels_imessage_utils.py b/backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_utils.py similarity index 100% rename from backend/test/unit/channels/test_channels_imessage_utils.py rename to backend/test/unit/channels/adapters/bluebubbles_imessage/test_channels_imessage_utils.py diff --git a/backend/test/unit/channels/test_channels_dingding.py b/backend/test/unit/channels/adapters/dingding/test_channels_dingding.py similarity index 100% rename from backend/test/unit/channels/test_channels_dingding.py rename to backend/test/unit/channels/adapters/dingding/test_channels_dingding.py diff --git a/backend/test/unit/channels/test_dingding_adapter_fixes.py b/backend/test/unit/channels/adapters/dingding/test_dingding_adapter_fixes.py similarity index 100% rename from backend/test/unit/channels/test_dingding_adapter_fixes.py rename to backend/test/unit/channels/adapters/dingding/test_dingding_adapter_fixes.py diff --git a/backend/test/unit/channels/test_dingding_adapter_quick.py b/backend/test/unit/channels/adapters/dingding/test_dingding_adapter_quick.py similarity index 100% rename from backend/test/unit/channels/test_dingding_adapter_quick.py rename to backend/test/unit/channels/adapters/dingding/test_dingding_adapter_quick.py diff --git a/backend/test/unit/channels/test_discord_accounts.py b/backend/test/unit/channels/adapters/discord/test_discord_accounts.py similarity index 100% rename from backend/test/unit/channels/test_discord_accounts.py rename to backend/test/unit/channels/adapters/discord/test_discord_accounts.py diff --git a/backend/test/unit/channels/test_discord_adapter_p0.py b/backend/test/unit/channels/adapters/discord/test_discord_adapter_p0.py similarity index 100% rename from backend/test/unit/channels/test_discord_adapter_p0.py rename to backend/test/unit/channels/adapters/discord/test_discord_adapter_p0.py diff --git a/backend/test/unit/channels/test_discord_analysis.py b/backend/test/unit/channels/adapters/discord/test_discord_analysis.py similarity index 100% rename from backend/test/unit/channels/test_discord_analysis.py rename to backend/test/unit/channels/adapters/discord/test_discord_analysis.py diff --git a/backend/test/unit/channels/test_discord_auto_presence.py b/backend/test/unit/channels/adapters/discord/test_discord_auto_presence.py similarity index 100% rename from backend/test/unit/channels/test_discord_auto_presence.py rename to backend/test/unit/channels/adapters/discord/test_discord_auto_presence.py diff --git a/backend/test/unit/channels/test_discord_chunker.py b/backend/test/unit/channels/adapters/discord/test_discord_chunker.py similarity index 100% rename from backend/test/unit/channels/test_discord_chunker.py rename to backend/test/unit/channels/adapters/discord/test_discord_chunker.py diff --git a/backend/test/unit/channels/test_discord_commands.py b/backend/test/unit/channels/adapters/discord/test_discord_commands.py similarity index 100% rename from backend/test/unit/channels/test_discord_commands.py rename to backend/test/unit/channels/adapters/discord/test_discord_commands.py diff --git a/backend/test/unit/channels/test_discord_components.py b/backend/test/unit/channels/adapters/discord/test_discord_components.py similarity index 100% rename from backend/test/unit/channels/test_discord_components.py rename to backend/test/unit/channels/adapters/discord/test_discord_components.py diff --git a/backend/test/unit/channels/test_discord_dedupe.py b/backend/test/unit/channels/adapters/discord/test_discord_dedupe.py similarity index 100% rename from backend/test/unit/channels/test_discord_dedupe.py rename to backend/test/unit/channels/adapters/discord/test_discord_dedupe.py diff --git a/backend/test/unit/channels/test_discord_doctor.py b/backend/test/unit/channels/adapters/discord/test_discord_doctor.py similarity index 100% rename from backend/test/unit/channels/test_discord_doctor.py rename to backend/test/unit/channels/adapters/discord/test_discord_doctor.py diff --git a/backend/test/unit/channels/test_discord_event_queue.py b/backend/test/unit/channels/adapters/discord/test_discord_event_queue.py similarity index 100% rename from backend/test/unit/channels/test_discord_event_queue.py rename to backend/test/unit/channels/adapters/discord/test_discord_event_queue.py diff --git a/backend/test/unit/channels/test_discord_formatter.py b/backend/test/unit/channels/adapters/discord/test_discord_formatter.py similarity index 100% rename from backend/test/unit/channels/test_discord_formatter.py rename to backend/test/unit/channels/adapters/discord/test_discord_formatter.py diff --git a/backend/test/unit/channels/test_discord_normalizer.py b/backend/test/unit/channels/adapters/discord/test_discord_normalizer.py similarity index 100% rename from backend/test/unit/channels/test_discord_normalizer.py rename to backend/test/unit/channels/adapters/discord/test_discord_normalizer.py diff --git a/backend/test/unit/channels/test_discord_poll.py b/backend/test/unit/channels/adapters/discord/test_discord_poll.py similarity index 100% rename from backend/test/unit/channels/test_discord_poll.py rename to backend/test/unit/channels/adapters/discord/test_discord_poll.py diff --git a/backend/test/unit/channels/test_discord_rest_scheduler.py b/backend/test/unit/channels/adapters/discord/test_discord_rest_scheduler.py similarity index 100% rename from backend/test/unit/channels/test_discord_rest_scheduler.py rename to backend/test/unit/channels/adapters/discord/test_discord_rest_scheduler.py diff --git a/backend/test/unit/channels/test_discord_security_audit.py b/backend/test/unit/channels/adapters/discord/test_discord_security_audit.py similarity index 100% rename from backend/test/unit/channels/test_discord_security_audit.py rename to backend/test/unit/channels/adapters/discord/test_discord_security_audit.py diff --git a/backend/test/unit/channels/test_discord_security_full.py b/backend/test/unit/channels/adapters/discord/test_discord_security_full.py similarity index 100% rename from backend/test/unit/channels/test_discord_security_full.py rename to backend/test/unit/channels/adapters/discord/test_discord_security_full.py diff --git a/backend/test/unit/channels/test_discord_send.py b/backend/test/unit/channels/adapters/discord/test_discord_send.py similarity index 100% rename from backend/test/unit/channels/test_discord_send.py rename to backend/test/unit/channels/adapters/discord/test_discord_send.py diff --git a/backend/test/unit/channels/test_discord_session.py b/backend/test/unit/channels/adapters/discord/test_discord_session.py similarity index 100% rename from backend/test/unit/channels/test_discord_session.py rename to backend/test/unit/channels/adapters/discord/test_discord_session.py diff --git a/backend/test/unit/channels/test_discord_webhook.py b/backend/test/unit/channels/adapters/discord/test_discord_webhook.py similarity index 100% rename from backend/test/unit/channels/test_discord_webhook.py rename to backend/test/unit/channels/adapters/discord/test_discord_webhook.py diff --git a/backend/test/unit/channels/test_channels_feishu.py b/backend/test/unit/channels/adapters/feishu/test_channels_feishu.py similarity index 100% rename from backend/test/unit/channels/test_channels_feishu.py rename to backend/test/unit/channels/adapters/feishu/test_channels_feishu.py diff --git a/backend/test/unit/channels/test_channels_feishu_comprehensive.py b/backend/test/unit/channels/adapters/feishu/test_channels_feishu_comprehensive.py similarity index 100% rename from backend/test/unit/channels/test_channels_feishu_comprehensive.py rename to backend/test/unit/channels/adapters/feishu/test_channels_feishu_comprehensive.py diff --git a/backend/test/unit/channels/test_channels_feishu_optimizations.py b/backend/test/unit/channels/adapters/feishu/test_channels_feishu_optimizations.py similarity index 100% rename from backend/test/unit/channels/test_channels_feishu_optimizations.py rename to backend/test/unit/channels/adapters/feishu/test_channels_feishu_optimizations.py diff --git a/backend/test/unit/channels/test_channels_feishu_p0.py b/backend/test/unit/channels/adapters/feishu/test_channels_feishu_p0.py similarity index 100% rename from backend/test/unit/channels/test_channels_feishu_p0.py rename to backend/test/unit/channels/adapters/feishu/test_channels_feishu_p0.py diff --git a/backend/test/unit/channels/test_googlechat.py b/backend/test/unit/channels/adapters/googlechat/test_googlechat.py similarity index 100% rename from backend/test/unit/channels/test_googlechat.py rename to backend/test/unit/channels/adapters/googlechat/test_googlechat.py diff --git a/backend/test/unit/channels/test_googlechat_adapter.py b/backend/test/unit/channels/adapters/googlechat/test_googlechat_adapter.py similarity index 100% rename from backend/test/unit/channels/test_googlechat_adapter.py rename to backend/test/unit/channels/adapters/googlechat/test_googlechat_adapter.py diff --git a/backend/test/unit/channels/test_googlechat_modules.py b/backend/test/unit/channels/adapters/googlechat/test_googlechat_modules.py similarity index 100% rename from backend/test/unit/channels/test_googlechat_modules.py rename to backend/test/unit/channels/adapters/googlechat/test_googlechat_modules.py diff --git a/backend/test/unit/channels/test_googlechat_send.py b/backend/test/unit/channels/adapters/googlechat/test_googlechat_send.py similarity index 100% rename from backend/test/unit/channels/test_googlechat_send.py rename to backend/test/unit/channels/adapters/googlechat/test_googlechat_send.py diff --git a/backend/test/unit/channels/test_irc_adapter.py b/backend/test/unit/channels/adapters/irc/test_irc_adapter.py similarity index 100% rename from backend/test/unit/channels/test_irc_adapter.py rename to backend/test/unit/channels/adapters/irc/test_irc_adapter.py diff --git a/backend/test/unit/channels/test_irc_analysis.py b/backend/test/unit/channels/adapters/irc/test_irc_analysis.py similarity index 100% rename from backend/test/unit/channels/test_irc_analysis.py rename to backend/test/unit/channels/adapters/irc/test_irc_analysis.py diff --git a/backend/test/unit/channels/test_irc_comprehensive.py b/backend/test/unit/channels/adapters/irc/test_irc_comprehensive.py similarity index 100% rename from backend/test/unit/channels/test_irc_comprehensive.py rename to backend/test/unit/channels/adapters/irc/test_irc_comprehensive.py diff --git a/backend/test/unit/channels/test_irc_enhancement.py b/backend/test/unit/channels/adapters/irc/test_irc_enhancement.py similarity index 100% rename from backend/test/unit/channels/test_irc_enhancement.py rename to backend/test/unit/channels/adapters/irc/test_irc_enhancement.py diff --git a/backend/test/unit/channels/test_irc_fixes.py b/backend/test/unit/channels/adapters/irc/test_irc_fixes.py similarity index 100% rename from backend/test/unit/channels/test_irc_fixes.py rename to backend/test/unit/channels/adapters/irc/test_irc_fixes.py diff --git a/backend/test/unit/channels/test_irc_new_features.py b/backend/test/unit/channels/adapters/irc/test_irc_new_features.py similarity index 100% rename from backend/test/unit/channels/test_irc_new_features.py rename to backend/test/unit/channels/adapters/irc/test_irc_new_features.py diff --git a/backend/test/unit/channels/test_line_adapter.py b/backend/test/unit/channels/adapters/line/test_line_adapter.py similarity index 100% rename from backend/test/unit/channels/test_line_adapter.py rename to backend/test/unit/channels/adapters/line/test_line_adapter.py diff --git a/backend/test/unit/channels/test_line_adapter_comprehensive.py b/backend/test/unit/channels/adapters/line/test_line_adapter_comprehensive.py similarity index 100% rename from backend/test/unit/channels/test_line_adapter_comprehensive.py rename to backend/test/unit/channels/adapters/line/test_line_adapter_comprehensive.py diff --git a/backend/test/unit/channels/test_channels_matrix.py b/backend/test/unit/channels/adapters/matrix/test_channels_matrix.py similarity index 100% rename from backend/test/unit/channels/test_channels_matrix.py rename to backend/test/unit/channels/adapters/matrix/test_channels_matrix.py diff --git a/backend/test/unit/channels/test_channels_matrix_comprehensive.py b/backend/test/unit/channels/adapters/matrix/test_channels_matrix_comprehensive.py similarity index 100% rename from backend/test/unit/channels/test_channels_matrix_comprehensive.py rename to backend/test/unit/channels/adapters/matrix/test_channels_matrix_comprehensive.py diff --git a/backend/test/unit/channels/test_channels_mattermost_normalizer.py b/backend/test/unit/channels/adapters/mattermost/test_channels_mattermost_normalizer.py similarity index 100% rename from backend/test/unit/channels/test_channels_mattermost_normalizer.py rename to backend/test/unit/channels/adapters/mattermost/test_channels_mattermost_normalizer.py diff --git a/backend/test/unit/channels/test_channels_mattermost_session.py b/backend/test/unit/channels/adapters/mattermost/test_channels_mattermost_session.py similarity index 100% rename from backend/test/unit/channels/test_channels_mattermost_session.py rename to backend/test/unit/channels/adapters/mattermost/test_channels_mattermost_session.py diff --git a/backend/test/unit/channels/test_mattermost_adapter.py b/backend/test/unit/channels/adapters/mattermost/test_mattermost_adapter.py similarity index 100% rename from backend/test/unit/channels/test_mattermost_adapter.py rename to backend/test/unit/channels/adapters/mattermost/test_mattermost_adapter.py diff --git a/backend/test/unit/channels/test_mattermost_adapter_fixes.py b/backend/test/unit/channels/adapters/mattermost/test_mattermost_adapter_fixes.py similarity index 100% rename from backend/test/unit/channels/test_mattermost_adapter_fixes.py rename to backend/test/unit/channels/adapters/mattermost/test_mattermost_adapter_fixes.py diff --git a/backend/test/unit/channels/test_mattermost_comprehensive.py b/backend/test/unit/channels/adapters/mattermost/test_mattermost_comprehensive.py similarity index 100% rename from backend/test/unit/channels/test_mattermost_comprehensive.py rename to backend/test/unit/channels/adapters/mattermost/test_mattermost_comprehensive.py diff --git a/backend/test/unit/channels/test_mattermost_normalizer.py b/backend/test/unit/channels/adapters/mattermost/test_mattermost_normalizer.py similarity index 100% rename from backend/test/unit/channels/test_mattermost_normalizer.py rename to backend/test/unit/channels/adapters/mattermost/test_mattermost_normalizer.py diff --git a/backend/test/unit/channels/test_mattermost_optimization.py b/backend/test/unit/channels/adapters/mattermost/test_mattermost_optimization.py similarity index 100% rename from backend/test/unit/channels/test_mattermost_optimization.py rename to backend/test/unit/channels/adapters/mattermost/test_mattermost_optimization.py diff --git a/backend/test/unit/channels/test_mattermost_optimization_p0.py b/backend/test/unit/channels/adapters/mattermost/test_mattermost_optimization_p0.py similarity index 100% rename from backend/test/unit/channels/test_mattermost_optimization_p0.py rename to backend/test/unit/channels/adapters/mattermost/test_mattermost_optimization_p0.py diff --git a/backend/test/unit/channels/test_mattermost_send.py b/backend/test/unit/channels/adapters/mattermost/test_mattermost_send.py similarity index 100% rename from backend/test/unit/channels/test_mattermost_send.py rename to backend/test/unit/channels/adapters/mattermost/test_mattermost_send.py diff --git a/backend/test/unit/channels/test_mattermost_session.py b/backend/test/unit/channels/adapters/mattermost/test_mattermost_session.py similarity index 100% rename from backend/test/unit/channels/test_mattermost_session.py rename to backend/test/unit/channels/adapters/mattermost/test_mattermost_session.py diff --git a/backend/test/unit/channels/test_msteams_accounts_audit.py b/backend/test/unit/channels/adapters/msteams/test_msteams_accounts_audit.py similarity index 100% rename from backend/test/unit/channels/test_msteams_accounts_audit.py rename to backend/test/unit/channels/adapters/msteams/test_msteams_accounts_audit.py diff --git a/backend/test/unit/channels/test_msteams_adapter.py b/backend/test/unit/channels/adapters/msteams/test_msteams_adapter.py similarity index 100% rename from backend/test/unit/channels/test_msteams_adapter.py rename to backend/test/unit/channels/adapters/msteams/test_msteams_adapter.py diff --git a/backend/test/unit/channels/test_msteams_analysis.py b/backend/test/unit/channels/adapters/msteams/test_msteams_analysis.py similarity index 100% rename from backend/test/unit/channels/test_msteams_analysis.py rename to backend/test/unit/channels/adapters/msteams/test_msteams_analysis.py diff --git a/backend/test/unit/channels/test_msteams_auth_audio.py b/backend/test/unit/channels/adapters/msteams/test_msteams_auth_audio.py similarity index 100% rename from backend/test/unit/channels/test_msteams_auth_audio.py rename to backend/test/unit/channels/adapters/msteams/test_msteams_auth_audio.py diff --git a/backend/test/unit/channels/test_msteams_chunking.py b/backend/test/unit/channels/adapters/msteams/test_msteams_chunking.py similarity index 100% rename from backend/test/unit/channels/test_msteams_chunking.py rename to backend/test/unit/channels/adapters/msteams/test_msteams_chunking.py diff --git a/backend/test/unit/channels/test_msteams_config.py b/backend/test/unit/channels/adapters/msteams/test_msteams_config.py similarity index 100% rename from backend/test/unit/channels/test_msteams_config.py rename to backend/test/unit/channels/adapters/msteams/test_msteams_config.py diff --git a/backend/test/unit/channels/test_msteams_fixes.py b/backend/test/unit/channels/adapters/msteams/test_msteams_fixes.py similarity index 100% rename from backend/test/unit/channels/test_msteams_fixes.py rename to backend/test/unit/channels/adapters/msteams/test_msteams_fixes.py diff --git a/backend/test/unit/channels/test_msteams_helpers.py b/backend/test/unit/channels/adapters/msteams/test_msteams_helpers.py similarity index 100% rename from backend/test/unit/channels/test_msteams_helpers.py rename to backend/test/unit/channels/adapters/msteams/test_msteams_helpers.py diff --git a/backend/test/unit/channels/test_msteams_phase1.py b/backend/test/unit/channels/adapters/msteams/test_msteams_phase1.py similarity index 100% rename from backend/test/unit/channels/test_msteams_phase1.py rename to backend/test/unit/channels/adapters/msteams/test_msteams_phase1.py diff --git a/backend/test/unit/channels/test_msteams_runtime_presentation.py b/backend/test/unit/channels/adapters/msteams/test_msteams_runtime_presentation.py similarity index 100% rename from backend/test/unit/channels/test_msteams_runtime_presentation.py rename to backend/test/unit/channels/adapters/msteams/test_msteams_runtime_presentation.py diff --git a/backend/test/unit/channels/test_msteams_storage.py b/backend/test/unit/channels/adapters/msteams/test_msteams_storage.py similarity index 100% rename from backend/test/unit/channels/test_msteams_storage.py rename to backend/test/unit/channels/adapters/msteams/test_msteams_storage.py diff --git a/backend/test/unit/channels/test_nextcloudtalk_accounts.py b/backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_accounts.py similarity index 100% rename from backend/test/unit/channels/test_nextcloudtalk_accounts.py rename to backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_accounts.py diff --git a/backend/test/unit/channels/test_nextcloudtalk_adapter.py b/backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_adapter.py similarity index 100% rename from backend/test/unit/channels/test_nextcloudtalk_adapter.py rename to backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_adapter.py diff --git a/backend/test/unit/channels/test_nextcloudtalk_chunking.py b/backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_chunking.py similarity index 100% rename from backend/test/unit/channels/test_nextcloudtalk_chunking.py rename to backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_chunking.py diff --git a/backend/test/unit/channels/test_nextcloudtalk_config_enhanced.py b/backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_config_enhanced.py similarity index 100% rename from backend/test/unit/channels/test_nextcloudtalk_config_enhanced.py rename to backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_config_enhanced.py diff --git a/backend/test/unit/channels/test_nextcloudtalk_credentials.py b/backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_credentials.py similarity index 100% rename from backend/test/unit/channels/test_nextcloudtalk_credentials.py rename to backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_credentials.py diff --git a/backend/test/unit/channels/test_nextcloudtalk_dedup_enhanced.py b/backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_dedup_enhanced.py similarity index 100% rename from backend/test/unit/channels/test_nextcloudtalk_dedup_enhanced.py rename to backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_dedup_enhanced.py diff --git a/backend/test/unit/channels/test_nextcloudtalk_formatter_enhanced.py b/backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_formatter_enhanced.py similarity index 100% rename from backend/test/unit/channels/test_nextcloudtalk_formatter_enhanced.py rename to backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_formatter_enhanced.py diff --git a/backend/test/unit/channels/test_nextcloudtalk_metrics.py b/backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_metrics.py similarity index 100% rename from backend/test/unit/channels/test_nextcloudtalk_metrics.py rename to backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_metrics.py diff --git a/backend/test/unit/channels/test_nextcloudtalk_normalize.py b/backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_normalize.py similarity index 100% rename from backend/test/unit/channels/test_nextcloudtalk_normalize.py rename to backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_normalize.py diff --git a/backend/test/unit/channels/test_nextcloudtalk_setup_wizard.py b/backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_setup_wizard.py similarity index 100% rename from backend/test/unit/channels/test_nextcloudtalk_setup_wizard.py rename to backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_setup_wizard.py diff --git a/backend/test/unit/channels/test_nextcloudtalk_webhook_server.py b/backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_webhook_server.py similarity index 100% rename from backend/test/unit/channels/test_nextcloudtalk_webhook_server.py rename to backend/test/unit/channels/adapters/nextcloudtalk/test_nextcloudtalk_webhook_server.py diff --git a/backend/test/unit/channels/test_channels_nostr_analysis.py b/backend/test/unit/channels/adapters/nostr/test_channels_nostr_analysis.py similarity index 100% rename from backend/test/unit/channels/test_channels_nostr_analysis.py rename to backend/test/unit/channels/adapters/nostr/test_channels_nostr_analysis.py diff --git a/backend/test/unit/channels/test_channels_nostr_optimizations.py b/backend/test/unit/channels/adapters/nostr/test_channels_nostr_optimizations.py similarity index 100% rename from backend/test/unit/channels/test_channels_nostr_optimizations.py rename to backend/test/unit/channels/adapters/nostr/test_channels_nostr_optimizations.py diff --git a/backend/test/unit/channels/test_nostr_adapter.py b/backend/test/unit/channels/adapters/nostr/test_nostr_adapter.py similarity index 100% rename from backend/test/unit/channels/test_nostr_adapter.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_adapter.py diff --git a/backend/test/unit/channels/test_nostr_adapter_ext.py b/backend/test/unit/channels/adapters/nostr/test_nostr_adapter_ext.py similarity index 100% rename from backend/test/unit/channels/test_nostr_adapter_ext.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_adapter_ext.py diff --git a/backend/test/unit/channels/test_nostr_config_ext.py b/backend/test/unit/channels/adapters/nostr/test_nostr_config_ext.py similarity index 100% rename from backend/test/unit/channels/test_nostr_config_ext.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_config_ext.py diff --git a/backend/test/unit/channels/test_nostr_crypto.py b/backend/test/unit/channels/adapters/nostr/test_nostr_crypto.py similarity index 100% rename from backend/test/unit/channels/test_nostr_crypto.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_crypto.py diff --git a/backend/test/unit/channels/test_nostr_fuzz.py b/backend/test/unit/channels/adapters/nostr/test_nostr_fuzz.py similarity index 100% rename from backend/test/unit/channels/test_nostr_fuzz.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_fuzz.py diff --git a/backend/test/unit/channels/test_nostr_guard_ext.py b/backend/test/unit/channels/adapters/nostr/test_nostr_guard_ext.py similarity index 100% rename from backend/test/unit/channels/test_nostr_guard_ext.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_guard_ext.py diff --git a/backend/test/unit/channels/test_nostr_health_ext.py b/backend/test/unit/channels/adapters/nostr/test_nostr_health_ext.py similarity index 100% rename from backend/test/unit/channels/test_nostr_health_ext.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_health_ext.py diff --git a/backend/test/unit/channels/test_nostr_integration.py b/backend/test/unit/channels/adapters/nostr/test_nostr_integration.py similarity index 100% rename from backend/test/unit/channels/test_nostr_integration.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_integration.py diff --git a/backend/test/unit/channels/test_nostr_metrics.py b/backend/test/unit/channels/adapters/nostr/test_nostr_metrics.py similarity index 100% rename from backend/test/unit/channels/test_nostr_metrics.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_metrics.py diff --git a/backend/test/unit/channels/test_nostr_models.py b/backend/test/unit/channels/adapters/nostr/test_nostr_models.py similarity index 100% rename from backend/test/unit/channels/test_nostr_models.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_models.py diff --git a/backend/test/unit/channels/test_nostr_nip05.py b/backend/test/unit/channels/adapters/nostr/test_nostr_nip05.py similarity index 100% rename from backend/test/unit/channels/test_nostr_nip05.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_nip05.py diff --git a/backend/test/unit/channels/test_nostr_pair.py b/backend/test/unit/channels/adapters/nostr/test_nostr_pair.py similarity index 100% rename from backend/test/unit/channels/test_nostr_pair.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_pair.py diff --git a/backend/test/unit/channels/test_nostr_relay.py b/backend/test/unit/channels/adapters/nostr/test_nostr_relay.py similarity index 100% rename from backend/test/unit/channels/test_nostr_relay.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_relay.py diff --git a/backend/test/unit/channels/test_nostr_send.py b/backend/test/unit/channels/adapters/nostr/test_nostr_send.py similarity index 100% rename from backend/test/unit/channels/test_nostr_send.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_send.py diff --git a/backend/test/unit/channels/test_nostr_send_cache.py b/backend/test/unit/channels/adapters/nostr/test_nostr_send_cache.py similarity index 100% rename from backend/test/unit/channels/test_nostr_send_cache.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_send_cache.py diff --git a/backend/test/unit/channels/test_nostr_send_ext.py b/backend/test/unit/channels/adapters/nostr/test_nostr_send_ext.py similarity index 100% rename from backend/test/unit/channels/test_nostr_send_ext.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_send_ext.py diff --git a/backend/test/unit/channels/test_nostr_state_store.py b/backend/test/unit/channels/adapters/nostr/test_nostr_state_store.py similarity index 100% rename from backend/test/unit/channels/test_nostr_state_store.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_state_store.py diff --git a/backend/test/unit/channels/test_nostr_target.py b/backend/test/unit/channels/adapters/nostr/test_nostr_target.py similarity index 100% rename from backend/test/unit/channels/test_nostr_target.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_target.py diff --git a/backend/test/unit/channels/test_nostr_thread_session.py b/backend/test/unit/channels/adapters/nostr/test_nostr_thread_session.py similarity index 100% rename from backend/test/unit/channels/test_nostr_thread_session.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_thread_session.py diff --git a/backend/test/unit/channels/test_nostr_zap.py b/backend/test/unit/channels/adapters/nostr/test_nostr_zap.py similarity index 100% rename from backend/test/unit/channels/test_nostr_zap.py rename to backend/test/unit/channels/adapters/nostr/test_nostr_zap.py diff --git a/backend/test/unit/channels/test_qqbot_adapter.py b/backend/test/unit/channels/adapters/qqbot/test_qqbot_adapter.py similarity index 100% rename from backend/test/unit/channels/test_qqbot_adapter.py rename to backend/test/unit/channels/adapters/qqbot/test_qqbot_adapter.py diff --git a/backend/test/unit/channels/test_qqbot_analysis.py b/backend/test/unit/channels/adapters/qqbot/test_qqbot_analysis.py similarity index 100% rename from backend/test/unit/channels/test_qqbot_analysis.py rename to backend/test/unit/channels/adapters/qqbot/test_qqbot_analysis.py diff --git a/backend/test/unit/channels/test_qqbot_modules.py b/backend/test/unit/channels/adapters/qqbot/test_qqbot_modules.py similarity index 100% rename from backend/test/unit/channels/test_qqbot_modules.py rename to backend/test/unit/channels/adapters/qqbot/test_qqbot_modules.py diff --git a/backend/test/unit/channels/test_channels_signal.py b/backend/test/unit/channels/adapters/signal/test_channels_signal.py similarity index 100% rename from backend/test/unit/channels/test_channels_signal.py rename to backend/test/unit/channels/adapters/signal/test_channels_signal.py diff --git a/backend/test/unit/channels/test_channels_signal_comprehensive.py b/backend/test/unit/channels/adapters/signal/test_channels_signal_comprehensive.py similarity index 100% rename from backend/test/unit/channels/test_channels_signal_comprehensive.py rename to backend/test/unit/channels/adapters/signal/test_channels_signal_comprehensive.py diff --git a/backend/test/unit/channels/test_channels_signal_daemon.py b/backend/test/unit/channels/adapters/signal/test_channels_signal_daemon.py similarity index 100% rename from backend/test/unit/channels/test_channels_signal_daemon.py rename to backend/test/unit/channels/adapters/signal/test_channels_signal_daemon.py diff --git a/backend/test/unit/channels/test_channels_signal_multi_account.py b/backend/test/unit/channels/adapters/signal/test_channels_signal_multi_account.py similarity index 100% rename from backend/test/unit/channels/test_channels_signal_multi_account.py rename to backend/test/unit/channels/adapters/signal/test_channels_signal_multi_account.py diff --git a/backend/test/unit/channels/test_channels_signal_streaming.py b/backend/test/unit/channels/adapters/signal/test_channels_signal_streaming.py similarity index 100% rename from backend/test/unit/channels/test_channels_signal_streaming.py rename to backend/test/unit/channels/adapters/signal/test_channels_signal_streaming.py diff --git a/backend/test/unit/channels/test_channels_slack_adapter.py b/backend/test/unit/channels/adapters/slack/test_channels_slack_adapter.py similarity index 100% rename from backend/test/unit/channels/test_channels_slack_adapter.py rename to backend/test/unit/channels/adapters/slack/test_channels_slack_adapter.py diff --git a/backend/test/unit/channels/test_channels_slack_allowlist.py b/backend/test/unit/channels/adapters/slack/test_channels_slack_allowlist.py similarity index 100% rename from backend/test/unit/channels/test_channels_slack_allowlist.py rename to backend/test/unit/channels/adapters/slack/test_channels_slack_allowlist.py diff --git a/backend/test/unit/channels/test_channels_slack_approval.py b/backend/test/unit/channels/adapters/slack/test_channels_slack_approval.py similarity index 100% rename from backend/test/unit/channels/test_channels_slack_approval.py rename to backend/test/unit/channels/adapters/slack/test_channels_slack_approval.py diff --git a/backend/test/unit/channels/test_channels_slack_blocks.py b/backend/test/unit/channels/adapters/slack/test_channels_slack_blocks.py similarity index 100% rename from backend/test/unit/channels/test_channels_slack_blocks.py rename to backend/test/unit/channels/adapters/slack/test_channels_slack_blocks.py diff --git a/backend/test/unit/channels/test_channels_slack_chunker.py b/backend/test/unit/channels/adapters/slack/test_channels_slack_chunker.py similarity index 100% rename from backend/test/unit/channels/test_channels_slack_chunker.py rename to backend/test/unit/channels/adapters/slack/test_channels_slack_chunker.py diff --git a/backend/test/unit/channels/test_channels_slack_commands.py b/backend/test/unit/channels/adapters/slack/test_channels_slack_commands.py similarity index 100% rename from backend/test/unit/channels/test_channels_slack_commands.py rename to backend/test/unit/channels/adapters/slack/test_channels_slack_commands.py diff --git a/backend/test/unit/channels/test_channels_slack_normalizer.py b/backend/test/unit/channels/adapters/slack/test_channels_slack_normalizer.py similarity index 100% rename from backend/test/unit/channels/test_channels_slack_normalizer.py rename to backend/test/unit/channels/adapters/slack/test_channels_slack_normalizer.py diff --git a/backend/test/unit/channels/test_channels_slack_pairing.py b/backend/test/unit/channels/adapters/slack/test_channels_slack_pairing.py similarity index 100% rename from backend/test/unit/channels/test_channels_slack_pairing.py rename to backend/test/unit/channels/adapters/slack/test_channels_slack_pairing.py diff --git a/backend/test/unit/channels/test_channels_slack_scopes.py b/backend/test/unit/channels/adapters/slack/test_channels_slack_scopes.py similarity index 100% rename from backend/test/unit/channels/test_channels_slack_scopes.py rename to backend/test/unit/channels/adapters/slack/test_channels_slack_scopes.py diff --git a/backend/test/unit/channels/test_channels_slack_security.py b/backend/test/unit/channels/adapters/slack/test_channels_slack_security.py similarity index 100% rename from backend/test/unit/channels/test_channels_slack_security.py rename to backend/test/unit/channels/adapters/slack/test_channels_slack_security.py diff --git a/backend/test/unit/channels/test_channels_slack_session.py b/backend/test/unit/channels/adapters/slack/test_channels_slack_session.py similarity index 100% rename from backend/test/unit/channels/test_channels_slack_session.py rename to backend/test/unit/channels/adapters/slack/test_channels_slack_session.py diff --git a/backend/test/unit/channels/test_synologychat_adapter.py b/backend/test/unit/channels/adapters/synologychat/test_synologychat_adapter.py similarity index 100% rename from backend/test/unit/channels/test_synologychat_adapter.py rename to backend/test/unit/channels/adapters/synologychat/test_synologychat_adapter.py diff --git a/backend/test/unit/channels/test_synologychat_comprehensive.py b/backend/test/unit/channels/adapters/synologychat/test_synologychat_comprehensive.py similarity index 100% rename from backend/test/unit/channels/test_synologychat_comprehensive.py rename to backend/test/unit/channels/adapters/synologychat/test_synologychat_comprehensive.py diff --git a/backend/test/unit/channels/test_telegram_adapter.py b/backend/test/unit/channels/adapters/telegram/test_telegram_adapter.py similarity index 100% rename from backend/test/unit/channels/test_telegram_adapter.py rename to backend/test/unit/channels/adapters/telegram/test_telegram_adapter.py diff --git a/backend/test/unit/channels/test_telegram_chunking.py b/backend/test/unit/channels/adapters/telegram/test_telegram_chunking.py similarity index 100% rename from backend/test/unit/channels/test_telegram_chunking.py rename to backend/test/unit/channels/adapters/telegram/test_telegram_chunking.py diff --git a/backend/test/unit/channels/test_telegram_comprehensive.py b/backend/test/unit/channels/adapters/telegram/test_telegram_comprehensive.py similarity index 100% rename from backend/test/unit/channels/test_telegram_comprehensive.py rename to backend/test/unit/channels/adapters/telegram/test_telegram_comprehensive.py diff --git a/backend/test/unit/channels/test_telegram_format.py b/backend/test/unit/channels/adapters/telegram/test_telegram_format.py similarity index 100% rename from backend/test/unit/channels/test_telegram_format.py rename to backend/test/unit/channels/adapters/telegram/test_telegram_format.py diff --git a/backend/test/unit/channels/test_telegram_format_new.py b/backend/test/unit/channels/adapters/telegram/test_telegram_format_new.py similarity index 100% rename from backend/test/unit/channels/test_telegram_format_new.py rename to backend/test/unit/channels/adapters/telegram/test_telegram_format_new.py diff --git a/backend/test/unit/channels/test_telegram_remaining_fixes.py b/backend/test/unit/channels/adapters/telegram/test_telegram_remaining_fixes.py similarity index 100% rename from backend/test/unit/channels/test_telegram_remaining_fixes.py rename to backend/test/unit/channels/adapters/telegram/test_telegram_remaining_fixes.py diff --git a/backend/test/unit/channels/test_telegram_security.py b/backend/test/unit/channels/adapters/telegram/test_telegram_security.py similarity index 100% rename from backend/test/unit/channels/test_telegram_security.py rename to backend/test/unit/channels/adapters/telegram/test_telegram_security.py diff --git a/backend/test/unit/channels/test_telegram_security_new.py b/backend/test/unit/channels/adapters/telegram/test_telegram_security_new.py similarity index 100% rename from backend/test/unit/channels/test_telegram_security_new.py rename to backend/test/unit/channels/adapters/telegram/test_telegram_security_new.py diff --git a/backend/test/unit/channels/test_telegram_streaming_new.py b/backend/test/unit/channels/adapters/telegram/test_telegram_streaming_new.py similarity index 100% rename from backend/test/unit/channels/test_telegram_streaming_new.py rename to backend/test/unit/channels/adapters/telegram/test_telegram_streaming_new.py diff --git a/backend/test/unit/channels/test_twitch_actions.py b/backend/test/unit/channels/adapters/twitch/test_twitch_actions.py similarity index 100% rename from backend/test/unit/channels/test_twitch_actions.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_actions.py diff --git a/backend/test/unit/channels/test_twitch_adapter.py b/backend/test/unit/channels/adapters/twitch/test_twitch_adapter.py similarity index 100% rename from backend/test/unit/channels/test_twitch_adapter.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_adapter.py diff --git a/backend/test/unit/channels/test_twitch_auth_provider.py b/backend/test/unit/channels/adapters/twitch/test_twitch_auth_provider.py similarity index 100% rename from backend/test/unit/channels/test_twitch_auth_provider.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_auth_provider.py diff --git a/backend/test/unit/channels/test_twitch_config_schema.py b/backend/test/unit/channels/adapters/twitch/test_twitch_config_schema.py similarity index 100% rename from backend/test/unit/channels/test_twitch_config_schema.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_config_schema.py diff --git a/backend/test/unit/channels/test_twitch_deduplicator.py b/backend/test/unit/channels/adapters/twitch/test_twitch_deduplicator.py similarity index 100% rename from backend/test/unit/channels/test_twitch_deduplicator.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_deduplicator.py diff --git a/backend/test/unit/channels/test_twitch_eventsub.py b/backend/test/unit/channels/adapters/twitch/test_twitch_eventsub.py similarity index 100% rename from backend/test/unit/channels/test_twitch_eventsub.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_eventsub.py diff --git a/backend/test/unit/channels/test_twitch_helix.py b/backend/test/unit/channels/adapters/twitch/test_twitch_helix.py similarity index 100% rename from backend/test/unit/channels/test_twitch_helix.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_helix.py diff --git a/backend/test/unit/channels/test_twitch_irc_parser.py b/backend/test/unit/channels/adapters/twitch/test_twitch_irc_parser.py similarity index 100% rename from backend/test/unit/channels/test_twitch_irc_parser.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_irc_parser.py diff --git a/backend/test/unit/channels/test_twitch_markdown.py b/backend/test/unit/channels/adapters/twitch/test_twitch_markdown.py similarity index 100% rename from backend/test/unit/channels/test_twitch_markdown.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_markdown.py diff --git a/backend/test/unit/channels/test_twitch_normalizer.py b/backend/test/unit/channels/adapters/twitch/test_twitch_normalizer.py similarity index 100% rename from backend/test/unit/channels/test_twitch_normalizer.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_normalizer.py diff --git a/backend/test/unit/channels/test_twitch_outbound_cache.py b/backend/test/unit/channels/adapters/twitch/test_twitch_outbound_cache.py similarity index 100% rename from backend/test/unit/channels/test_twitch_outbound_cache.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_outbound_cache.py diff --git a/backend/test/unit/channels/test_twitch_pairing.py b/backend/test/unit/channels/adapters/twitch/test_twitch_pairing.py similarity index 100% rename from backend/test/unit/channels/test_twitch_pairing.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_pairing.py diff --git a/backend/test/unit/channels/test_twitch_rate_limiter.py b/backend/test/unit/channels/adapters/twitch/test_twitch_rate_limiter.py similarity index 100% rename from backend/test/unit/channels/test_twitch_rate_limiter.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_rate_limiter.py diff --git a/backend/test/unit/channels/test_twitch_send_formats.py b/backend/test/unit/channels/adapters/twitch/test_twitch_send_formats.py similarity index 100% rename from backend/test/unit/channels/test_twitch_send_formats.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_send_formats.py diff --git a/backend/test/unit/channels/test_twitch_session.py b/backend/test/unit/channels/adapters/twitch/test_twitch_session.py similarity index 100% rename from backend/test/unit/channels/test_twitch_session.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_session.py diff --git a/backend/test/unit/channels/test_twitch_setup.py b/backend/test/unit/channels/adapters/twitch/test_twitch_setup.py similarity index 100% rename from backend/test/unit/channels/test_twitch_setup.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_setup.py diff --git a/backend/test/unit/channels/test_twitch_token_utils.py b/backend/test/unit/channels/adapters/twitch/test_twitch_token_utils.py similarity index 100% rename from backend/test/unit/channels/test_twitch_token_utils.py rename to backend/test/unit/channels/adapters/twitch/test_twitch_token_utils.py diff --git a/backend/test/unit/channels/test_urbit_adapter.py b/backend/test/unit/channels/adapters/urbit/test_urbit_adapter.py similarity index 100% rename from backend/test/unit/channels/test_urbit_adapter.py rename to backend/test/unit/channels/adapters/urbit/test_urbit_adapter.py diff --git a/backend/test/unit/channels/test_urbit_adapter_supplement.py b/backend/test/unit/channels/adapters/urbit/test_urbit_adapter_supplement.py similarity index 100% rename from backend/test/unit/channels/test_urbit_adapter_supplement.py rename to backend/test/unit/channels/adapters/urbit/test_urbit_adapter_supplement.py diff --git a/backend/test/unit/channels/test_wechat_adapter.py b/backend/test/unit/channels/adapters/wechat/test_wechat_adapter.py similarity index 100% rename from backend/test/unit/channels/test_wechat_adapter.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_adapter.py diff --git a/backend/test/unit/channels/test_wechat_bridge.py b/backend/test/unit/channels/adapters/wechat/test_wechat_bridge.py similarity index 100% rename from backend/test/unit/channels/test_wechat_bridge.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_bridge.py diff --git a/backend/test/unit/channels/test_wechat_capabilities.py b/backend/test/unit/channels/adapters/wechat/test_wechat_capabilities.py similarity index 100% rename from backend/test/unit/channels/test_wechat_capabilities.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_capabilities.py diff --git a/backend/test/unit/channels/test_wechat_chunker.py b/backend/test/unit/channels/adapters/wechat/test_wechat_chunker.py similarity index 100% rename from backend/test/unit/channels/test_wechat_chunker.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_chunker.py diff --git a/backend/test/unit/channels/test_wechat_client.py b/backend/test/unit/channels/adapters/wechat/test_wechat_client.py similarity index 100% rename from backend/test/unit/channels/test_wechat_client.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_client.py diff --git a/backend/test/unit/channels/test_wechat_config_ui_hints.py b/backend/test/unit/channels/adapters/wechat/test_wechat_config_ui_hints.py similarity index 100% rename from backend/test/unit/channels/test_wechat_config_ui_hints.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_config_ui_hints.py diff --git a/backend/test/unit/channels/test_wechat_crypto.py b/backend/test/unit/channels/adapters/wechat/test_wechat_crypto.py similarity index 100% rename from backend/test/unit/channels/test_wechat_crypto.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_crypto.py diff --git a/backend/test/unit/channels/test_wechat_debounce.py b/backend/test/unit/channels/adapters/wechat/test_wechat_debounce.py similarity index 100% rename from backend/test/unit/channels/test_wechat_debounce.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_debounce.py diff --git a/backend/test/unit/channels/test_wechat_dual_plugin.py b/backend/test/unit/channels/adapters/wechat/test_wechat_dual_plugin.py similarity index 100% rename from backend/test/unit/channels/test_wechat_dual_plugin.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_dual_plugin.py diff --git a/backend/test/unit/channels/test_wechat_enhancements.py b/backend/test/unit/channels/adapters/wechat/test_wechat_enhancements.py similarity index 100% rename from backend/test/unit/channels/test_wechat_enhancements.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_enhancements.py diff --git a/backend/test/unit/channels/test_wechat_errors.py b/backend/test/unit/channels/adapters/wechat/test_wechat_errors.py similarity index 100% rename from backend/test/unit/channels/test_wechat_errors.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_errors.py diff --git a/backend/test/unit/channels/test_wechat_fixes.py b/backend/test/unit/channels/adapters/wechat/test_wechat_fixes.py similarity index 100% rename from backend/test/unit/channels/test_wechat_fixes.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_fixes.py diff --git a/backend/test/unit/channels/test_wechat_format.py b/backend/test/unit/channels/adapters/wechat/test_wechat_format.py similarity index 100% rename from backend/test/unit/channels/test_wechat_format.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_format.py diff --git a/backend/test/unit/channels/test_wechat_group_admin.py b/backend/test/unit/channels/adapters/wechat/test_wechat_group_admin.py similarity index 100% rename from backend/test/unit/channels/test_wechat_group_admin.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_group_admin.py diff --git a/backend/test/unit/channels/test_wechat_link_format.py b/backend/test/unit/channels/adapters/wechat/test_wechat_link_format.py similarity index 100% rename from backend/test/unit/channels/test_wechat_link_format.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_link_format.py diff --git a/backend/test/unit/channels/test_wechat_media.py b/backend/test/unit/channels/adapters/wechat/test_wechat_media.py similarity index 100% rename from backend/test/unit/channels/test_wechat_media.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_media.py diff --git a/backend/test/unit/channels/test_wechat_monitor.py b/backend/test/unit/channels/adapters/wechat/test_wechat_monitor.py similarity index 100% rename from backend/test/unit/channels/test_wechat_monitor.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_monitor.py diff --git a/backend/test/unit/channels/test_wechat_mp_passive_reply.py b/backend/test/unit/channels/adapters/wechat/test_wechat_mp_passive_reply.py similarity index 100% rename from backend/test/unit/channels/test_wechat_mp_passive_reply.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_mp_passive_reply.py diff --git a/backend/test/unit/channels/test_wechat_optimization.py b/backend/test/unit/channels/adapters/wechat/test_wechat_optimization.py similarity index 100% rename from backend/test/unit/channels/test_wechat_optimization.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_optimization.py diff --git a/backend/test/unit/channels/test_wechat_pairing.py b/backend/test/unit/channels/adapters/wechat/test_wechat_pairing.py similarity index 100% rename from backend/test/unit/channels/test_wechat_pairing.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_pairing.py diff --git a/backend/test/unit/channels/test_wechat_rate_limit.py b/backend/test/unit/channels/adapters/wechat/test_wechat_rate_limit.py similarity index 100% rename from backend/test/unit/channels/test_wechat_rate_limit.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_rate_limit.py diff --git a/backend/test/unit/channels/test_wechat_rate_limiter.py b/backend/test/unit/channels/adapters/wechat/test_wechat_rate_limiter.py similarity index 100% rename from backend/test/unit/channels/test_wechat_rate_limiter.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_rate_limiter.py diff --git a/backend/test/unit/channels/test_wechat_retry.py b/backend/test/unit/channels/adapters/wechat/test_wechat_retry.py similarity index 100% rename from backend/test/unit/channels/test_wechat_retry.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_retry.py diff --git a/backend/test/unit/channels/test_wechat_secrets.py b/backend/test/unit/channels/adapters/wechat/test_wechat_secrets.py similarity index 100% rename from backend/test/unit/channels/test_wechat_secrets.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_secrets.py diff --git a/backend/test/unit/channels/test_wechat_security.py b/backend/test/unit/channels/adapters/wechat/test_wechat_security.py similarity index 100% rename from backend/test/unit/channels/test_wechat_security.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_security.py diff --git a/backend/test/unit/channels/test_wechat_selector.py b/backend/test/unit/channels/adapters/wechat/test_wechat_selector.py similarity index 100% rename from backend/test/unit/channels/test_wechat_selector.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_selector.py diff --git a/backend/test/unit/channels/test_wechat_send.py b/backend/test/unit/channels/adapters/wechat/test_wechat_send.py similarity index 100% rename from backend/test/unit/channels/test_wechat_send.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_send.py diff --git a/backend/test/unit/channels/test_wechat_send_payloads.py b/backend/test/unit/channels/adapters/wechat/test_wechat_send_payloads.py similarity index 100% rename from backend/test/unit/channels/test_wechat_send_payloads.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_send_payloads.py diff --git a/backend/test/unit/channels/test_wechat_session.py b/backend/test/unit/channels/adapters/wechat/test_wechat_session.py similarity index 100% rename from backend/test/unit/channels/test_wechat_session.py rename to backend/test/unit/channels/adapters/wechat/test_wechat_session.py diff --git a/backend/test/unit/channels/test_whatsapp_accounts_config.py b/backend/test/unit/channels/adapters/whatsapp/test_whatsapp_accounts_config.py similarity index 100% rename from backend/test/unit/channels/test_whatsapp_accounts_config.py rename to backend/test/unit/channels/adapters/whatsapp/test_whatsapp_accounts_config.py diff --git a/backend/test/unit/channels/test_whatsapp_adapter.py b/backend/test/unit/channels/adapters/whatsapp/test_whatsapp_adapter.py similarity index 100% rename from backend/test/unit/channels/test_whatsapp_adapter.py rename to backend/test/unit/channels/adapters/whatsapp/test_whatsapp_adapter.py diff --git a/backend/test/unit/channels/test_whatsapp_analysis.py b/backend/test/unit/channels/adapters/whatsapp/test_whatsapp_analysis.py similarity index 100% rename from backend/test/unit/channels/test_whatsapp_analysis.py rename to backend/test/unit/channels/adapters/whatsapp/test_whatsapp_analysis.py diff --git a/backend/test/unit/channels/test_whatsapp_caching_debounce.py b/backend/test/unit/channels/adapters/whatsapp/test_whatsapp_caching_debounce.py similarity index 100% rename from backend/test/unit/channels/test_whatsapp_caching_debounce.py rename to backend/test/unit/channels/adapters/whatsapp/test_whatsapp_caching_debounce.py diff --git a/backend/test/unit/channels/test_whatsapp_io_credentials.py b/backend/test/unit/channels/adapters/whatsapp/test_whatsapp_io_credentials.py similarity index 100% rename from backend/test/unit/channels/test_whatsapp_io_credentials.py rename to backend/test/unit/channels/adapters/whatsapp/test_whatsapp_io_credentials.py diff --git a/backend/test/unit/channels/test_whatsapp_poll_format.py b/backend/test/unit/channels/adapters/whatsapp/test_whatsapp_poll_format.py similarity index 100% rename from backend/test/unit/channels/test_whatsapp_poll_format.py rename to backend/test/unit/channels/adapters/whatsapp/test_whatsapp_poll_format.py diff --git a/backend/test/unit/channels/test_whatsapp_reactions_markdown.py b/backend/test/unit/channels/adapters/whatsapp/test_whatsapp_reactions_markdown.py similarity index 100% rename from backend/test/unit/channels/test_whatsapp_reactions_markdown.py rename to backend/test/unit/channels/adapters/whatsapp/test_whatsapp_reactions_markdown.py diff --git a/backend/test/unit/channels/test_whatsapp_security_pairing.py b/backend/test/unit/channels/adapters/whatsapp/test_whatsapp_security_pairing.py similarity index 100% rename from backend/test/unit/channels/test_whatsapp_security_pairing.py rename to backend/test/unit/channels/adapters/whatsapp/test_whatsapp_security_pairing.py diff --git a/backend/test/unit/channels/test_yuanbao_adapter.py b/backend/test/unit/channels/adapters/yuanbao/test_yuanbao_adapter.py similarity index 100% rename from backend/test/unit/channels/test_yuanbao_adapter.py rename to backend/test/unit/channels/adapters/yuanbao/test_yuanbao_adapter.py diff --git a/backend/test/unit/channels/test_yuanbao_analysis.py b/backend/test/unit/channels/adapters/yuanbao/test_yuanbao_analysis.py similarity index 100% rename from backend/test/unit/channels/test_yuanbao_analysis.py rename to backend/test/unit/channels/adapters/yuanbao/test_yuanbao_analysis.py diff --git a/backend/test/unit/channels/test_yuanbao_enhancements.py b/backend/test/unit/channels/adapters/yuanbao/test_yuanbao_enhancements.py similarity index 100% rename from backend/test/unit/channels/test_yuanbao_enhancements.py rename to backend/test/unit/channels/adapters/yuanbao/test_yuanbao_enhancements.py diff --git a/backend/test/unit/channels/test_yuanbao_fixes.py b/backend/test/unit/channels/adapters/yuanbao/test_yuanbao_fixes.py similarity index 100% rename from backend/test/unit/channels/test_yuanbao_fixes.py rename to backend/test/unit/channels/adapters/yuanbao/test_yuanbao_fixes.py diff --git a/backend/test/unit/channels/test_yuanbao_optimization.py b/backend/test/unit/channels/adapters/yuanbao/test_yuanbao_optimization.py similarity index 100% rename from backend/test/unit/channels/test_yuanbao_optimization.py rename to backend/test/unit/channels/adapters/yuanbao/test_yuanbao_optimization.py diff --git a/backend/test/unit/channels/test_channels_zalo_user.py b/backend/test/unit/channels/adapters/zalo/test_channels_zalo_user.py similarity index 100% rename from backend/test/unit/channels/test_channels_zalo_user.py rename to backend/test/unit/channels/adapters/zalo/test_channels_zalo_user.py diff --git a/backend/test/unit/channels/test_zalo_oa_adapter.py b/backend/test/unit/channels/adapters/zalo/test_zalo_oa_adapter.py similarity index 100% rename from backend/test/unit/channels/test_zalo_oa_adapter.py rename to backend/test/unit/channels/adapters/zalo/test_zalo_oa_adapter.py diff --git a/backend/test/unit/channels/test_zalo_oa_comprehensive.py b/backend/test/unit/channels/adapters/zalo/test_zalo_oa_comprehensive.py similarity index 100% rename from backend/test/unit/channels/test_zalo_oa_comprehensive.py rename to backend/test/unit/channels/adapters/zalo/test_zalo_oa_comprehensive.py diff --git a/backend/test/unit/channels/test_zalo_user_cards.py b/backend/test/unit/channels/adapters/zalo/test_zalo_user_cards.py similarity index 100% rename from backend/test/unit/channels/test_zalo_user_cards.py rename to backend/test/unit/channels/adapters/zalo/test_zalo_user_cards.py diff --git a/backend/test/unit/channels/test_zalo_user_comprehensive.py b/backend/test/unit/channels/adapters/zalo/test_zalo_user_comprehensive.py similarity index 100% rename from backend/test/unit/channels/test_zalo_user_comprehensive.py rename to backend/test/unit/channels/adapters/zalo/test_zalo_user_comprehensive.py diff --git a/backend/test/unit/channels/test_zalo_user_config_schema.py b/backend/test/unit/channels/adapters/zalo/test_zalo_user_config_schema.py similarity index 100% rename from backend/test/unit/channels/test_zalo_user_config_schema.py rename to backend/test/unit/channels/adapters/zalo/test_zalo_user_config_schema.py diff --git a/backend/test/unit/channels/test_zalo_user_credentials.py b/backend/test/unit/channels/adapters/zalo/test_zalo_user_credentials.py similarity index 100% rename from backend/test/unit/channels/test_zalo_user_credentials.py rename to backend/test/unit/channels/adapters/zalo/test_zalo_user_credentials.py diff --git a/backend/test/unit/channels/test_zalo_user_directory.py b/backend/test/unit/channels/adapters/zalo/test_zalo_user_directory.py similarity index 100% rename from backend/test/unit/channels/test_zalo_user_directory.py rename to backend/test/unit/channels/adapters/zalo/test_zalo_user_directory.py diff --git a/backend/test/unit/channels/test_zalo_user_gateway.py b/backend/test/unit/channels/adapters/zalo/test_zalo_user_gateway.py similarity index 100% rename from backend/test/unit/channels/test_zalo_user_gateway.py rename to backend/test/unit/channels/adapters/zalo/test_zalo_user_gateway.py diff --git a/backend/test/unit/channels/test_zalo_user_interactive_dispatch.py b/backend/test/unit/channels/adapters/zalo/test_zalo_user_interactive_dispatch.py similarity index 100% rename from backend/test/unit/channels/test_zalo_user_interactive_dispatch.py rename to backend/test/unit/channels/adapters/zalo/test_zalo_user_interactive_dispatch.py diff --git a/backend/test/unit/channels/test_zalo_user_normalize_new.py b/backend/test/unit/channels/adapters/zalo/test_zalo_user_normalize_new.py similarity index 100% rename from backend/test/unit/channels/test_zalo_user_normalize_new.py rename to backend/test/unit/channels/adapters/zalo/test_zalo_user_normalize_new.py diff --git a/backend/test/unit/channels/test_zalo_user_reaction.py b/backend/test/unit/channels/adapters/zalo/test_zalo_user_reaction.py similarity index 100% rename from backend/test/unit/channels/test_zalo_user_reaction.py rename to backend/test/unit/channels/adapters/zalo/test_zalo_user_reaction.py diff --git a/backend/test/unit/channels/test_zalo_user_sticker.py b/backend/test/unit/channels/adapters/zalo/test_zalo_user_sticker.py similarity index 100% rename from backend/test/unit/channels/test_zalo_user_sticker.py rename to backend/test/unit/channels/adapters/zalo/test_zalo_user_sticker.py diff --git a/backend/test/unit/channels/test_zalo_user_text_styles.py b/backend/test/unit/channels/adapters/zalo/test_zalo_user_text_styles.py similarity index 100% rename from backend/test/unit/channels/test_zalo_user_text_styles.py rename to backend/test/unit/channels/adapters/zalo/test_zalo_user_text_styles.py diff --git a/backend/test/unit/channels/test_actions.py b/backend/test/unit/channels/core/test_actions.py similarity index 100% rename from backend/test/unit/channels/test_actions.py rename to backend/test/unit/channels/core/test_actions.py diff --git a/backend/test/unit/channels/test_auth_module.py b/backend/test/unit/channels/core/test_auth_module.py similarity index 100% rename from backend/test/unit/channels/test_auth_module.py rename to backend/test/unit/channels/core/test_auth_module.py diff --git a/backend/test/unit/channels/test_base.py b/backend/test/unit/channels/core/test_base.py similarity index 100% rename from backend/test/unit/channels/test_base.py rename to backend/test/unit/channels/core/test_base.py diff --git a/backend/test/unit/channels/test_broadcast.py b/backend/test/unit/channels/core/test_broadcast.py similarity index 100% rename from backend/test/unit/channels/test_broadcast.py rename to backend/test/unit/channels/core/test_broadcast.py diff --git a/backend/test/unit/channels/test_capabilities.py b/backend/test/unit/channels/core/test_capabilities.py similarity index 100% rename from backend/test/unit/channels/test_capabilities.py rename to backend/test/unit/channels/core/test_capabilities.py diff --git a/backend/test/unit/channels/test_channels_accounts.py b/backend/test/unit/channels/core/test_channels_accounts.py similarity index 100% rename from backend/test/unit/channels/test_channels_accounts.py rename to backend/test/unit/channels/core/test_channels_accounts.py diff --git a/backend/test/unit/channels/test_channels_approval.py b/backend/test/unit/channels/core/test_channels_approval.py similarity index 100% rename from backend/test/unit/channels/test_channels_approval.py rename to backend/test/unit/channels/core/test_channels_approval.py diff --git a/backend/test/unit/channels/test_channels_debounce.py b/backend/test/unit/channels/core/test_channels_debounce.py similarity index 100% rename from backend/test/unit/channels/test_channels_debounce.py rename to backend/test/unit/channels/core/test_channels_debounce.py diff --git a/backend/test/unit/channels/test_channels_directory.py b/backend/test/unit/channels/core/test_channels_directory.py similarity index 100% rename from backend/test/unit/channels/test_channels_directory.py rename to backend/test/unit/channels/core/test_channels_directory.py diff --git a/backend/test/unit/channels/test_channels_policy.py b/backend/test/unit/channels/core/test_channels_policy.py similarity index 100% rename from backend/test/unit/channels/test_channels_policy.py rename to backend/test/unit/channels/core/test_channels_policy.py diff --git a/backend/test/unit/channels/test_channels_snapshot.py b/backend/test/unit/channels/core/test_channels_snapshot.py similarity index 100% rename from backend/test/unit/channels/test_channels_snapshot.py rename to backend/test/unit/channels/core/test_channels_snapshot.py diff --git a/backend/test/unit/channels/test_circuit_breaker.py b/backend/test/unit/channels/core/test_circuit_breaker.py similarity index 100% rename from backend/test/unit/channels/test_circuit_breaker.py rename to backend/test/unit/channels/core/test_circuit_breaker.py diff --git a/backend/test/unit/channels/test_config_watcher.py b/backend/test/unit/channels/core/test_config_watcher.py similarity index 100% rename from backend/test/unit/channels/test_config_watcher.py rename to backend/test/unit/channels/core/test_config_watcher.py diff --git a/backend/test/unit/channels/test_context.py b/backend/test/unit/channels/core/test_context.py similarity index 100% rename from backend/test/unit/channels/test_context.py rename to backend/test/unit/channels/core/test_context.py diff --git a/backend/test/unit/channels/test_doctor.py b/backend/test/unit/channels/core/test_doctor.py similarity index 100% rename from backend/test/unit/channels/test_doctor.py rename to backend/test/unit/channels/core/test_doctor.py diff --git a/backend/test/unit/channels/test_framework_pairing_manager.py b/backend/test/unit/channels/core/test_framework_pairing_manager.py similarity index 100% rename from backend/test/unit/channels/test_framework_pairing_manager.py rename to backend/test/unit/channels/core/test_framework_pairing_manager.py diff --git a/backend/test/unit/channels/test_framework_pipeline.py b/backend/test/unit/channels/core/test_framework_pipeline.py similarity index 100% rename from backend/test/unit/channels/test_framework_pipeline.py rename to backend/test/unit/channels/core/test_framework_pipeline.py diff --git a/backend/test/unit/channels/test_framework_security_policy.py b/backend/test/unit/channels/core/test_framework_security_policy.py similarity index 100% rename from backend/test/unit/channels/test_framework_security_policy.py rename to backend/test/unit/channels/core/test_framework_security_policy.py diff --git a/backend/test/unit/channels/test_heartbeat.py b/backend/test/unit/channels/core/test_heartbeat.py similarity index 100% rename from backend/test/unit/channels/test_heartbeat.py rename to backend/test/unit/channels/core/test_heartbeat.py diff --git a/backend/test/unit/channels/test_history_injector.py b/backend/test/unit/channels/core/test_history_injector.py similarity index 100% rename from backend/test/unit/channels/test_history_injector.py rename to backend/test/unit/channels/core/test_history_injector.py diff --git a/backend/test/unit/channels/test_manager.py b/backend/test/unit/channels/core/test_manager.py similarity index 100% rename from backend/test/unit/channels/test_manager.py rename to backend/test/unit/channels/core/test_manager.py diff --git a/backend/test/unit/channels/test_manager_phases.py b/backend/test/unit/channels/core/test_manager_phases.py similarity index 100% rename from backend/test/unit/channels/test_manager_phases.py rename to backend/test/unit/channels/core/test_manager_phases.py diff --git a/backend/test/unit/channels/test_message_actions_v2.py b/backend/test/unit/channels/core/test_message_actions_v2.py similarity index 100% rename from backend/test/unit/channels/test_message_actions_v2.py rename to backend/test/unit/channels/core/test_message_actions_v2.py diff --git a/backend/test/unit/channels/test_meta_snapshot.py b/backend/test/unit/channels/core/test_meta_snapshot.py similarity index 100% rename from backend/test/unit/channels/test_meta_snapshot.py rename to backend/test/unit/channels/core/test_meta_snapshot.py diff --git a/backend/test/unit/channels/test_models.py b/backend/test/unit/channels/core/test_models.py similarity index 100% rename from backend/test/unit/channels/test_models.py rename to backend/test/unit/channels/core/test_models.py diff --git a/backend/test/unit/channels/test_protocols_bridge.py b/backend/test/unit/channels/core/test_protocols_bridge.py similarity index 100% rename from backend/test/unit/channels/test_protocols_bridge.py rename to backend/test/unit/channels/core/test_protocols_bridge.py diff --git a/backend/test/unit/channels/test_registry.py b/backend/test/unit/channels/core/test_registry.py similarity index 100% rename from backend/test/unit/channels/test_registry.py rename to backend/test/unit/channels/core/test_registry.py diff --git a/backend/test/unit/channels/test_router.py b/backend/test/unit/channels/core/test_router.py similarity index 100% rename from backend/test/unit/channels/test_router.py rename to backend/test/unit/channels/core/test_router.py diff --git a/backend/test/unit/channels/test_router_runtime.py b/backend/test/unit/channels/core/test_router_runtime.py similarity index 100% rename from backend/test/unit/channels/test_router_runtime.py rename to backend/test/unit/channels/core/test_router_runtime.py diff --git a/backend/test/unit/channels/test_runtime.py b/backend/test/unit/channels/core/test_runtime.py similarity index 100% rename from backend/test/unit/channels/test_runtime.py rename to backend/test/unit/channels/core/test_runtime.py diff --git a/backend/test/unit/channels/test_session_mapper.py b/backend/test/unit/channels/core/test_session_mapper.py similarity index 100% rename from backend/test/unit/channels/test_session_mapper.py rename to backend/test/unit/channels/core/test_session_mapper.py diff --git a/backend/test/unit/channels/test_session_router.py b/backend/test/unit/channels/core/test_session_router.py similarity index 100% rename from backend/test/unit/channels/test_session_router.py rename to backend/test/unit/channels/core/test_session_router.py diff --git a/backend/test/unit/channels/test_text_chunker_smoke.py b/backend/test/unit/channels/core/test_text_chunker_smoke.py similarity index 100% rename from backend/test/unit/channels/test_text_chunker_smoke.py rename to backend/test/unit/channels/core/test_text_chunker_smoke.py diff --git a/backend/test/unit/channels/test_thread_binding_manager.py b/backend/test/unit/channels/core/test_thread_binding_manager.py similarity index 100% rename from backend/test/unit/channels/test_thread_binding_manager.py rename to backend/test/unit/channels/core/test_thread_binding_manager.py diff --git a/backend/test/unit/channels/test_thread_models.py b/backend/test/unit/channels/core/test_thread_models.py similarity index 100% rename from backend/test/unit/channels/test_thread_models.py rename to backend/test/unit/channels/core/test_thread_models.py diff --git a/backend/test/unit/channels/test_thread_simulators.py b/backend/test/unit/channels/core/test_thread_simulators.py similarity index 100% rename from backend/test/unit/channels/test_thread_simulators.py rename to backend/test/unit/channels/core/test_thread_simulators.py