tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_github_signature_valid tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_github_signature_invalid tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_gitlab_token tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_gitlab_token_wrong tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_no_signature_with_secret_rejects tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_no_secret_allows_all tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_generic_signature_valid tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_svix_signature_valid tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_svix_signature_wrong_body_rejects tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_svix_signature_old_timestamp_rejects tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_svix_signature_multiple_entries_accepts_matching_v1 tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_svix_signature_missing_signature_rejects tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_svix_signature_unsupported_version_rejects tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_svix_signature_invalid_whsec_rejects tests/gateway/test_webhook_adapter.py::TestValidateSignature::test_validate_svix_signature_raw_secret_valid tests/gateway/test_webhook_adapter.py::TestRenderPrompt::test_render_prompt_dot_notation tests/gateway/test_webhook_adapter.py::TestRenderPrompt::test_render_prompt_missing_key_preserved tests/gateway/test_webhook_adapter.py::TestRenderPrompt::test_render_prompt_no_template_dumps_json tests/gateway/test_webhook_adapter.py::TestRenderDeliveryExtra::test_render_delivery_extra_templates tests/gateway/test_webhook_adapter.py::TestEventFilter::test_event_filter_accepts_matching tests/gateway/test_webhook_adapter.py::TestEventFilter::test_event_filter_rejects_non_matching tests/gateway/test_webhook_adapter.py::TestEventFilter::test_event_filter_empty_allows_all tests/gateway/test_webhook_adapter.py::TestEventFilter::test_event_filter_accepts_payload_type_field tests/gateway/test_webhook_adapter.py::TestHTTPHandling::test_unknown_route_returns_404 tests/gateway/test_webhook_adapter.py::TestHTTPHandling::test_webhook_handler_returns_202 tests/gateway/test_webhook_adapter.py::TestHTTPHandling::test_route_without_secret_rejects_unsigned_request tests/gateway/test_webhook_adapter.py::TestHTTPHandling::test_health_endpoint tests/gateway/test_webhook_adapter.py::TestHTTPHandling::test_connect_starts_server tests/gateway/test_webhook_adapter.py::TestHTTPHandling::test_disconnect_cleans_up tests/gateway/test_webhook_adapter.py::TestIdempotency::test_duplicate_delivery_id_returns_200 tests/gateway/test_webhook_adapter.py::TestIdempotency::test_expired_delivery_id_allows_reprocess tests/gateway/test_webhook_adapter.py::TestIdempotency::test_svix_id_used_as_delivery_id_for_deduplication tests/gateway/test_webhook_adapter.py::TestRateLimiting::test_rate_limit_rejects_excess tests/gateway/test_webhook_adapter.py::TestRateLimiting::test_rate_limit_window_resets tests/gateway/test_webhook_adapter.py::TestRateLimiting::test_rate_limit_prunes_incrementally_from_left tests/gateway/test_webhook_adapter.py::TestRateLimiting::test_seen_delivery_ttl_is_checked_per_delivery_without_full_prune tests/gateway/test_webhook_adapter.py::TestBodySize::test_oversized_payload_rejected tests/gateway/test_webhook_adapter.py::TestInsecureNoAuth::test_insecure_no_auth_skips_validation tests/gateway/test_webhook_adapter.py::TestSessionIsolation::test_concurrent_webhooks_get_independent_sessions tests/gateway/test_webhook_adapter.py::TestDeliveryCleanup::test_delivery_info_survives_multiple_sends tests/gateway/test_webhook_adapter.py::TestDeliveryCleanup::test_delivery_info_pruned_via_ttl tests/gateway/test_webhook_adapter.py::TestDeliveryCleanup::test_delivery_info_prune_uses_ordered_incremental_queue tests/gateway/test_webhook_adapter.py::TestCheckRequirements::test_returns_true_when_aiohttp_available tests/gateway/test_webhook_adapter.py::TestCheckRequirements::test_returns_false_without_aiohttp tests/gateway/test_webhook_adapter.py::TestRawTemplateToken::test_raw_resolves_to_full_json_payload tests/gateway/test_webhook_adapter.py::TestRawTemplateToken::test_raw_truncated_at_4000_chars tests/gateway/test_webhook_adapter.py::TestRawTemplateToken::test_raw_mixed_with_other_variables tests/gateway/test_webhook_adapter.py::TestDeliverCrossPlatformThreadId::test_thread_id_passed_as_metadata tests/gateway/test_webhook_adapter.py::TestDeliverCrossPlatformThreadId::test_message_thread_id_passed_as_thread_id tests/gateway/test_webhook_adapter.py::TestDeliverCrossPlatformThreadId::test_no_thread_id_sends_no_metadata tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_connect_rejects_insecure_no_auth_on_public_bind tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_connect_rejects_insecure_no_auth_on_lan_ip tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_connect_rejects_insecure_no_auth_on_empty_host tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_connect_allows_insecure_no_auth_on_loopback[127.0.0.1] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_connect_allows_insecure_no_auth_on_loopback[localhost] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_is_loopback_host_accepts[127.0.0.1] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_is_loopback_host_accepts[localhost] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_is_loopback_host_accepts[Localhost] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_is_loopback_host_accepts[::1] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_is_loopback_host_accepts[ip6-localhost] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_is_loopback_host_accepts[ip6-loopback] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_is_loopback_host_rejects[0.0.0.0] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_is_loopback_host_rejects[192.168.1.5] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_is_loopback_host_rejects[10.0.0.1] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_is_loopback_host_rejects[example.com] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_is_loopback_host_rejects[] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_is_loopback_host_rejects[None] tests/gateway/test_webhook_adapter.py::TestInsecureNoAuthSafetyRail::test_connect_allows_real_secret_on_public_bind 68 tests collected in 0.37s