tests/gateway/test_whatsapp_cloud.py::TestSendText::test_send_builds_correct_url tests/gateway/test_whatsapp_cloud.py::TestSendText::test_send_includes_bearer_auth tests/gateway/test_whatsapp_cloud.py::TestSendText::test_send_payload_shape tests/gateway/test_whatsapp_cloud.py::TestSendText::test_send_returns_wamid tests/gateway/test_whatsapp_cloud.py::TestSendText::test_send_applies_markdown_conversion tests/gateway/test_whatsapp_cloud.py::TestSendText::test_send_reply_to_attaches_context_first_chunk_only tests/gateway/test_whatsapp_cloud.py::TestSendText::test_send_long_message_chunked tests/gateway/test_whatsapp_cloud.py::TestSendText::test_send_graph_error_returns_failure tests/gateway/test_whatsapp_cloud.py::TestSendText::test_send_empty_content_no_request tests/gateway/test_whatsapp_cloud.py::TestSendText::test_send_not_connected_returns_failure tests/gateway/test_whatsapp_cloud.py::TestSendText::test_send_network_exception_returns_failure tests/gateway/test_whatsapp_cloud.py::TestWebhookVerify::test_verify_echoes_challenge_on_match tests/gateway/test_whatsapp_cloud.py::TestWebhookVerify::test_verify_rejects_token_mismatch tests/gateway/test_whatsapp_cloud.py::TestWebhookVerify::test_verify_rejects_wrong_mode tests/gateway/test_whatsapp_cloud.py::TestWebhookVerify::test_verify_rejects_missing_challenge tests/gateway/test_whatsapp_cloud.py::TestWebhookVerify::test_verify_refuses_when_token_unconfigured tests/gateway/test_whatsapp_cloud.py::TestWebhookSignature::test_valid_signature_accepted tests/gateway/test_whatsapp_cloud.py::TestWebhookSignature::test_tampered_body_rejected tests/gateway/test_whatsapp_cloud.py::TestWebhookSignature::test_missing_signature_header_rejected tests/gateway/test_whatsapp_cloud.py::TestWebhookSignature::test_wrong_signature_format_rejected tests/gateway/test_whatsapp_cloud.py::TestWebhookSignature::test_unconfigured_app_secret_refuses_503 tests/gateway/test_whatsapp_cloud.py::TestWebhookSignature::test_signature_uses_constant_time_compare tests/gateway/test_whatsapp_cloud.py::TestWebhookSignature::test_oversize_body_rejected_before_signature tests/gateway/test_whatsapp_cloud.py::TestWebhookSignature::test_unreadable_body_rejected tests/gateway/test_whatsapp_cloud.py::TestWebhookReplay::test_duplicate_wamid_not_redispatched tests/gateway/test_whatsapp_cloud.py::TestWebhookReplay::test_dedup_cache_evicts_oldest tests/gateway/test_whatsapp_cloud.py::TestWebhookReplay::test_dedup_no_wamid_lets_through tests/gateway/test_whatsapp_cloud.py::TestWebhookDispatch::test_text_message_dispatched_with_event_shape tests/gateway/test_whatsapp_cloud.py::TestWebhookDispatch::test_dispatch_filters_via_mixin_gating tests/gateway/test_whatsapp_cloud.py::TestWebhookDispatch::test_dispatch_handler_exception_does_not_crash tests/gateway/test_whatsapp_cloud.py::TestWebhookDispatch::test_dispatch_ignores_non_message_field tests/gateway/test_whatsapp_cloud.py::TestWebhookDispatch::test_dispatch_ignores_non_waba_object tests/gateway/test_whatsapp_cloud.py::TestWebhookDispatch::test_dispatch_handles_button_reply tests/gateway/test_whatsapp_cloud.py::TestWebhookDispatch::test_dispatch_propagates_reply_to tests/gateway/test_whatsapp_cloud.py::TestWebhookDispatch::test_invalid_json_after_signature_returns_400 tests/gateway/test_whatsapp_cloud.py::TestHealth::test_health_reports_config_visibility tests/gateway/test_whatsapp_cloud.py::TestHealth::test_health_flags_missing_secrets tests/gateway/test_whatsapp_cloud.py::TestMixinInherited::test_format_message_converts_markdown tests/gateway/test_whatsapp_cloud.py::TestMixinInherited::test_should_process_message_dm_open tests/gateway/test_whatsapp_cloud.py::TestMixinInherited::test_should_process_message_dm_disabled tests/gateway/test_whatsapp_cloud.py::TestMixinInherited::test_broadcast_chats_filtered tests/gateway/test_whatsapp_cloud.py::TestSendImage::test_send_image_link_mode_skips_upload tests/gateway/test_whatsapp_cloud.py::TestSendImage::test_send_image_local_path_uploads_then_sends tests/gateway/test_whatsapp_cloud.py::TestSendImage::test_send_image_caption_attached tests/gateway/test_whatsapp_cloud.py::TestSendImage::test_send_image_oversize_rejected_locally tests/gateway/test_whatsapp_cloud.py::TestSendImage::test_send_image_missing_local_file_returns_failure tests/gateway/test_whatsapp_cloud.py::TestSendImage::test_send_image_upload_failure_returns_failure tests/gateway/test_whatsapp_cloud.py::TestSendVideo::test_send_video_link_mode tests/gateway/test_whatsapp_cloud.py::TestSendMethodsAcceptBaseClassKwargs::test_send_image_accepts_metadata tests/gateway/test_whatsapp_cloud.py::TestSendMethodsAcceptBaseClassKwargs::test_send_image_file_accepts_metadata tests/gateway/test_whatsapp_cloud.py::TestSendMethodsAcceptBaseClassKwargs::test_send_video_accepts_metadata tests/gateway/test_whatsapp_cloud.py::TestSendMethodsAcceptBaseClassKwargs::test_send_voice_accepts_metadata tests/gateway/test_whatsapp_cloud.py::TestSendMethodsAcceptBaseClassKwargs::test_send_document_accepts_metadata tests/gateway/test_whatsapp_cloud.py::TestSendDocument::test_send_document_filename_attached tests/gateway/test_whatsapp_cloud.py::TestSendVoice::test_send_voice_no_ffmpeg_falls_back_to_mp3 tests/gateway/test_whatsapp_cloud.py::TestSendVoice::test_send_voice_ffmpeg_present_uses_opus tests/gateway/test_whatsapp_cloud.py::TestSendVoice::test_warn_once_no_ffmpeg_actually_only_warns_once tests/gateway/test_whatsapp_cloud.py::TestDownloadMedia::test_two_step_download_writes_cache_file tests/gateway/test_whatsapp_cloud.py::TestDownloadMedia::test_metadata_failure_returns_none tests/gateway/test_whatsapp_cloud.py::TestDownloadMedia::test_bytes_failure_returns_none tests/gateway/test_whatsapp_cloud.py::TestDownloadMedia::test_metadata_includes_auth_header tests/gateway/test_whatsapp_cloud.py::TestDownloadMedia::test_extension_overrides_for_real_world_mimes[audio/ogg-.ogg] tests/gateway/test_whatsapp_cloud.py::TestDownloadMedia::test_extension_overrides_for_real_world_mimes[audio/ogg; codecs=opus-.ogg] tests/gateway/test_whatsapp_cloud.py::TestDownloadMedia::test_extension_overrides_for_real_world_mimes[audio/x-opus+ogg-.ogg] tests/gateway/test_whatsapp_cloud.py::TestDownloadMedia::test_extension_overrides_for_real_world_mimes[audio/opus-.ogg] tests/gateway/test_whatsapp_cloud.py::TestDownloadMedia::test_extension_overrides_for_real_world_mimes[audio/mp4-.m4a] tests/gateway/test_whatsapp_cloud.py::TestDownloadMedia::test_extension_overrides_for_real_world_mimes[audio/x-m4a-.m4a] tests/gateway/test_whatsapp_cloud.py::TestDownloadMedia::test_extension_overrides_for_real_world_mimes[image/jpeg-.jpg] tests/gateway/test_whatsapp_cloud.py::TestInboundMediaDispatch::test_inbound_image_populates_media_urls tests/gateway/test_whatsapp_cloud.py::TestInboundMediaDispatch::test_inbound_text_document_injected_into_body tests/gateway/test_whatsapp_cloud.py::TestInboundMediaDispatch::test_inbound_image_download_failure_still_dispatches tests/gateway/test_whatsapp_cloud.py::TestGroupMessageGuard::test_group_shaped_message_dropped_with_warning tests/gateway/test_whatsapp_cloud.py::TestGroupMessageGuard::test_normal_dm_still_dispatches tests/gateway/test_whatsapp_cloud.py::TestSendClarifyButtons::test_three_choices_uses_button_mode tests/gateway/test_whatsapp_cloud.py::TestSendClarifyButtons::test_four_choices_promoted_to_list_mode tests/gateway/test_whatsapp_cloud.py::TestSendClarifyButtons::test_open_ended_falls_back_to_plain_text tests/gateway/test_whatsapp_cloud.py::TestSendClarifyButtons::test_send_failure_does_not_register_state tests/gateway/test_whatsapp_cloud.py::TestSendExecApprovalButtons::test_approval_renders_two_buttons tests/gateway/test_whatsapp_cloud.py::TestSendExecApprovalButtons::test_long_command_is_truncated tests/gateway/test_whatsapp_cloud.py::TestSendSlashConfirmButtons::test_three_buttons_with_ids tests/gateway/test_whatsapp_cloud.py::TestDispatchInteractiveReplyClarify::test_clarify_tap_resolves_and_pops_state tests/gateway/test_whatsapp_cloud.py::TestDispatchInteractiveReplyClarify::test_clarify_other_button_keeps_state_and_prompts tests/gateway/test_whatsapp_cloud.py::TestDispatchInteractiveReplyClarify::test_clarify_other_with_no_entry_falls_back tests/gateway/test_whatsapp_cloud.py::TestDispatchInteractiveReplyClarify::test_stale_clarify_tap_falls_back_to_text tests/gateway/test_whatsapp_cloud.py::TestDispatchInteractiveReplyClarify::test_clarify_resolver_no_waiter_falls_back tests/gateway/test_whatsapp_cloud.py::TestDispatchInteractiveReplyApproval::test_approve_tap_calls_resolver_and_confirms tests/gateway/test_whatsapp_cloud.py::TestDispatchInteractiveReplyApproval::test_deny_tap_passes_deny_choice tests/gateway/test_whatsapp_cloud.py::TestDispatchInteractiveReplySlashConfirm::test_once_tap_calls_resolver tests/gateway/test_whatsapp_cloud.py::TestInteractiveReplyEndToEnd::test_recognized_tap_returns_none_no_text_dispatch tests/gateway/test_whatsapp_cloud.py::TestInteractiveReplyEndToEnd::test_unrecognized_tap_falls_through_to_text tests/gateway/test_whatsapp_cloud.py::TestInboundWamidCache::test_accepted_message_populates_cache tests/gateway/test_whatsapp_cloud.py::TestInboundWamidCache::test_subsequent_messages_overwrite_cache tests/gateway/test_whatsapp_cloud.py::TestInboundWamidCache::test_filtered_message_does_not_pollute_cache tests/gateway/test_whatsapp_cloud.py::TestSendTyping::test_send_typing_posts_correct_payload tests/gateway/test_whatsapp_cloud.py::TestSendTyping::test_send_typing_uses_latest_cached_wamid tests/gateway/test_whatsapp_cloud.py::TestSendTyping::test_send_typing_no_cached_wamid_is_noop tests/gateway/test_whatsapp_cloud.py::TestSendTyping::test_send_typing_swallows_network_errors tests/gateway/test_whatsapp_cloud.py::TestSendTyping::test_send_typing_stale_message_logged_at_info tests/gateway/test_whatsapp_cloud.py::TestSendTyping::test_send_typing_no_http_client_is_noop tests/gateway/test_whatsapp_cloud.py::TestSendTyping::test_send_typing_includes_bearer_auth tests/gateway/test_whatsapp_cloud.py::TestAllowlistNormalization::test_normalize_allow_ids_strips_jid_suffix_and_punctuation tests/gateway/test_whatsapp_cloud.py::TestAllowlistNormalization::test_dm_allowlist_matches_bare_wa_id_against_jid_entry tests/gateway/test_whatsapp_cloud.py::TestAllowlistNormalization::test_cloud_env_overrides_take_precedence tests/gateway/test_whatsapp_cloud.py::TestBoundedInteractiveState::test_bounded_put_evicts_oldest tests/gateway/test_whatsapp_cloud.py::TestMediaIdValidation::test_traversal_media_id_refused