tests/gateway/test_msgraph_webhook.py::TestMSGraphWebhookConfig::test_gateway_config_accepts_msgraph_webhook_platform tests/gateway/test_msgraph_webhook.py::TestMSGraphWebhookConfig::test_env_overrides_apply_to_existing_msgraph_webhook_platform tests/gateway/test_msgraph_webhook.py::TestMSGraphValidationHandshake::test_connect_requires_client_state[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphValidationHandshake::test_connect_requires_source_allowlist_on_public_bind[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphValidationHandshake::test_connect_allows_loopback_without_source_allowlist[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphValidationHandshake::test_validation_token_echo_on_get[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphValidationHandshake::test_bare_get_without_validation_token_rejected[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphValidationHandshake::test_post_with_validation_token_still_echoes[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphNotifications::test_missing_client_state_is_auth_rejected[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphNotifications::test_valid_notification_accepted_and_scheduled[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphNotifications::test_bad_client_state_rejected_as_auth_failure[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphNotifications::test_client_state_compare_is_timing_safe[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphNotifications::test_duplicate_notification_deduped[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphNotifications::test_notifications_without_id_are_not_deduped[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphNotifications::test_resource_patterns_accept_leading_slash[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphNotifications::test_resource_not_in_allowlist_returns_400[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphNotifications::test_malformed_body_returns_400[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphNotifications::test_missing_value_array_returns_400[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphNotifications::test_seen_receipts_are_bounded[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphSourceIPAllowlist::test_public_bind_without_allowlist_fails_closed[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphSourceIPAllowlist::test_loopback_bind_without_allowlist_still_accepts_local_requests[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphSourceIPAllowlist::test_post_from_disallowed_ip_rejected[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphSourceIPAllowlist::test_post_from_allowed_ip_accepted[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphSourceIPAllowlist::test_validation_handshake_also_respects_allowlist[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphSourceIPAllowlist::test_health_endpoint_also_respects_allowlist[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphSourceIPAllowlist::test_invalid_cidr_entries_are_ignored_at_init[asyncio] tests/gateway/test_msgraph_webhook.py::TestMSGraphSourceIPAllowlist::test_cidr_list_accepts_comma_string[asyncio]