tests/gateway/test_weixin.py::TestWeixinFormatting::test_format_message_preserves_markdown tests/gateway/test_weixin.py::TestWeixinFormatting::test_format_message_preserves_markdown_tables tests/gateway/test_weixin.py::TestWeixinFormatting::test_format_message_preserves_fenced_code_blocks tests/gateway/test_weixin.py::TestWeixinFormatting::test_format_message_wraps_long_plain_lines_for_copying tests/gateway/test_weixin.py::TestWeixinFormatting::test_format_message_does_not_wrap_long_code_block_lines tests/gateway/test_weixin.py::TestWeixinFormatting::test_format_message_returns_empty_string_for_none tests/gateway/test_weixin.py::TestWeixinChunking::test_split_text_splits_short_chatty_replies_into_separate_bubbles tests/gateway/test_weixin.py::TestWeixinChunking::test_split_text_keeps_structured_table_block_together tests/gateway/test_weixin.py::TestWeixinChunking::test_split_text_keeps_four_line_structured_blocks_together tests/gateway/test_weixin.py::TestWeixinChunking::test_split_text_keeps_heading_with_body_together tests/gateway/test_weixin.py::TestWeixinChunking::test_split_text_keeps_short_reformatted_table_in_single_chunk tests/gateway/test_weixin.py::TestWeixinChunking::test_split_text_keeps_complete_code_block_together_when_possible tests/gateway/test_weixin.py::TestWeixinChunking::test_split_text_safely_splits_long_code_blocks tests/gateway/test_weixin.py::TestWeixinChunking::test_split_text_can_restore_legacy_multiline_splitting_via_config tests/gateway/test_weixin.py::TestWeixinConfig::test_apply_env_overrides_configures_weixin tests/gateway/test_weixin.py::TestWeixinConfig::test_get_connected_platforms_includes_weixin_with_token tests/gateway/test_weixin.py::TestWeixinConfig::test_get_connected_platforms_requires_account_id tests/gateway/test_weixin.py::TestWeixinStatePersistence::test_save_weixin_account_preserves_existing_file_on_replace_failure tests/gateway/test_weixin.py::TestWeixinStatePersistence::test_context_token_persist_preserves_existing_file_on_replace_failure tests/gateway/test_weixin.py::TestWeixinStatePersistence::test_save_sync_buf_preserves_existing_file_on_replace_failure tests/gateway/test_weixin.py::TestWeixinQrLogin::test_qr_login_timeout_uses_monotonic_clock tests/gateway/test_weixin.py::TestWeixinSendMessageIntegration::test_parse_target_ref_accepts_weixin_ids tests/gateway/test_weixin.py::TestWeixinSendMessageIntegration::test_send_to_platform_routes_weixin_media_to_native_helper tests/gateway/test_weixin.py::TestWeixinChunkDelivery::test_send_waits_between_multiple_chunks tests/gateway/test_weixin.py::TestWeixinChunkDelivery::test_send_retries_failed_chunk_before_continuing tests/gateway/test_weixin.py::TestWeixinChunkDelivery::test_repeated_rate_limits_open_circuit_for_followup_sends tests/gateway/test_weixin.py::TestWeixinChunkDelivery::test_open_rate_limit_circuit_fails_fast_without_sendmessage tests/gateway/test_weixin.py::TestWeixinChunkDelivery::test_successful_send_after_cooldown_resets_rate_limit_state tests/gateway/test_weixin.py::TestWeixinChunkDelivery::test_concurrent_rate_limited_sends_are_serialized_by_gate tests/gateway/test_weixin.py::TestWeixinOutboundMedia::test_send_image_file_accepts_keyword_image_path tests/gateway/test_weixin.py::TestWeixinOutboundMedia::test_send_document_accepts_keyword_file_path tests/gateway/test_weixin.py::TestWeixinOutboundMedia::test_send_file_uses_post_for_upload_full_url_and_hex_encoded_aes_key tests/gateway/test_weixin.py::TestWeixinRemoteMediaSafety::test_download_remote_media_blocks_unsafe_urls tests/gateway/test_weixin.py::TestWeixinMarkdownLinks::test_format_message_preserves_markdown_links tests/gateway/test_weixin.py::TestWeixinMarkdownLinks::test_format_message_preserves_links_inside_code_blocks tests/gateway/test_weixin.py::TestWeixinBlankMessagePrevention::test_split_text_returns_empty_list_for_empty_string tests/gateway/test_weixin.py::TestWeixinBlankMessagePrevention::test_split_text_returns_empty_list_for_empty_string_split_per_line tests/gateway/test_weixin.py::TestWeixinBlankMessagePrevention::test_send_empty_content_does_not_call_send_message tests/gateway/test_weixin.py::TestWeixinBlankMessagePrevention::test_send_message_rejects_empty_text tests/gateway/test_weixin.py::TestWeixinStreamingCursorSuppression::test_supports_message_editing_is_false tests/gateway/test_weixin.py::TestWeixinMediaBuilder::test_image_builder_aes_key_is_base64_of_hex tests/gateway/test_weixin.py::TestWeixinMediaBuilder::test_video_builder_includes_md5 tests/gateway/test_weixin.py::TestWeixinMediaBuilder::test_voice_builder_for_audio_files_uses_file_attachment_type tests/gateway/test_weixin.py::TestWeixinMediaBuilder::test_voice_builder_for_silk_files tests/gateway/test_weixin.py::TestWeixinSendImageFileParameterName::test_send_image_file_uses_image_path_parameter tests/gateway/test_weixin.py::TestWeixinSendImageFileParameterName::test_send_image_file_works_without_optional_params tests/gateway/test_weixin.py::TestWeixinVoiceSending::test_send_voice_downgrades_to_document_attachment tests/gateway/test_weixin.py::TestWeixinVoiceSending::test_voice_builder_for_silk_files_can_be_forced_to_file_attachment tests/gateway/test_weixin.py::TestWeixinVoiceSending::test_send_file_sets_voice_metadata_for_silk_payload tests/gateway/test_weixin.py::TestIsStaleSessionRet::test_ret_minus_2_with_unknown_error_is_stale tests/gateway/test_weixin.py::TestIsStaleSessionRet::test_errcode_minus_2_with_unknown_error_is_stale tests/gateway/test_weixin.py::TestIsStaleSessionRet::test_unknown_error_case_insensitive tests/gateway/test_weixin.py::TestIsStaleSessionRet::test_ret_minus_2_with_freq_limit_is_not_stale tests/gateway/test_weixin.py::TestIsStaleSessionRet::test_ret_minus_2_with_no_errmsg_is_not_stale tests/gateway/test_weixin.py::TestIsStaleSessionRet::test_errcode_minus_14_is_not_matched_here tests/gateway/test_weixin.py::TestIsStaleSessionRet::test_success_codes_are_not_stale tests/gateway/test_weixin.py::TestWeixinContentDedup::test_duplicate_content_with_different_message_ids_is_dropped tests/gateway/test_weixin.py::TestWeixinContentDedup::test_content_dedup_not_called_for_messages_without_text tests/gateway/test_weixin.py::TestWeixinTextDebounce::test_batch_delays_default_from_config tests/gateway/test_weixin.py::TestWeixinTextDebounce::test_batch_delays_overridden_via_config_extra tests/gateway/test_weixin.py::TestWeixinTextDebounce::test_invalid_config_value_falls_back_to_default tests/gateway/test_weixin.py::TestWeixinTextDebounce::test_rapid_texts_collapse_into_single_dispatch tests/gateway/test_weixin.py::TestWeixinApiTimeout::test_api_post_does_not_pass_aiohttp_timeout_kwarg tests/gateway/test_weixin.py::TestWeixinApiTimeout::test_api_get_does_not_pass_aiohttp_timeout_kwarg tests/gateway/test_weixin.py::TestWeixinApiTimeout::test_api_post_raises_timeout_when_response_is_slow tests/gateway/test_weixin.py::TestWeixinApiTimeout::test_api_get_raises_timeout_when_response_is_slow tests/gateway/test_weixin.py::TestWeixinApiTimeout::test_api_post_raises_runtime_error_on_non_ok_status tests/gateway/test_weixin.py::TestWeixinApiTimeout::test_api_get_raises_runtime_error_on_non_ok_status tests/gateway/test_weixin.py::TestWeixinApiTimeout::test_get_updates_returns_empty_sentinel_on_timeout