tests/gateway/test_sms.py::TestSmsConfigLoading::test_env_overrides_create_sms_config tests/gateway/test_sms.py::TestSmsConfigLoading::test_env_overrides_set_home_channel tests/gateway/test_sms.py::TestSmsFormatAndTruncate::test_strips_bold tests/gateway/test_sms.py::TestSmsFormatAndTruncate::test_strips_italic tests/gateway/test_sms.py::TestSmsFormatAndTruncate::test_strips_code_blocks tests/gateway/test_sms.py::TestSmsFormatAndTruncate::test_strips_inline_code tests/gateway/test_sms.py::TestSmsFormatAndTruncate::test_strips_headers tests/gateway/test_sms.py::TestSmsFormatAndTruncate::test_strips_links tests/gateway/test_sms.py::TestSmsFormatAndTruncate::test_collapses_newlines tests/gateway/test_sms.py::TestSmsEchoPrevention::test_own_number_detection tests/gateway/test_sms.py::TestSmsRequirements::test_check_sms_requirements_missing_sid tests/gateway/test_sms.py::TestSmsRequirements::test_check_sms_requirements_missing_token tests/gateway/test_sms.py::TestSmsRequirements::test_check_sms_requirements_both_set tests/gateway/test_sms.py::TestWebhookHostConfig::test_default_host_is_localhost tests/gateway/test_sms.py::TestWebhookHostConfig::test_host_from_env tests/gateway/test_sms.py::TestWebhookHostConfig::test_webhook_url_from_env tests/gateway/test_sms.py::TestWebhookHostConfig::test_webhook_url_stripped tests/gateway/test_sms.py::TestStartupGuard::test_refuses_start_without_webhook_url tests/gateway/test_sms.py::TestStartupGuard::test_missing_webhook_url_is_non_retryable tests/gateway/test_sms.py::TestStartupGuard::test_missing_phone_number_is_non_retryable tests/gateway/test_sms.py::TestStartupGuard::test_insecure_flag_does_not_set_fatal_error tests/gateway/test_sms.py::TestStartupGuard::test_insecure_flag_allows_start_without_url tests/gateway/test_sms.py::TestStartupGuard::test_webhook_url_allows_start tests/gateway/test_sms.py::TestTwilioSignatureValidation::test_valid_signature_accepted tests/gateway/test_sms.py::TestTwilioSignatureValidation::test_invalid_signature_rejected tests/gateway/test_sms.py::TestTwilioSignatureValidation::test_wrong_token_rejected tests/gateway/test_sms.py::TestTwilioSignatureValidation::test_params_sorted_by_key tests/gateway/test_sms.py::TestTwilioSignatureValidation::test_empty_param_values_included tests/gateway/test_sms.py::TestTwilioSignatureValidation::test_url_matters tests/gateway/test_sms.py::TestTwilioSignatureValidation::test_port_variant_443_matches_without_port tests/gateway/test_sms.py::TestTwilioSignatureValidation::test_port_variant_without_port_matches_443 tests/gateway/test_sms.py::TestTwilioSignatureValidation::test_non_standard_port_no_variant tests/gateway/test_sms.py::TestTwilioSignatureValidation::test_port_variant_http_80 tests/gateway/test_sms.py::TestWebhookSignatureEnforcement::test_insecure_flag_skips_validation tests/gateway/test_sms.py::TestWebhookSignatureEnforcement::test_insecure_flag_with_url_still_validates tests/gateway/test_sms.py::TestWebhookSignatureEnforcement::test_missing_signature_returns_403 tests/gateway/test_sms.py::TestWebhookSignatureEnforcement::test_invalid_signature_returns_403 tests/gateway/test_sms.py::TestWebhookSignatureEnforcement::test_valid_signature_returns_200 tests/gateway/test_sms.py::TestWebhookSignatureEnforcement::test_port_variant_signature_returns_200