tests/gateway/test_teams.py::TestTeamsRequirements::test_returns_false_when_sdk_missing tests/gateway/test_teams.py::TestTeamsRequirements::test_returns_false_when_aiohttp_missing tests/gateway/test_teams.py::TestTeamsRequirements::test_returns_true_when_deps_available tests/gateway/test_teams.py::TestTeamsRequirements::test_check_teams_requirements_shortcircuits_when_present tests/gateway/test_teams.py::TestTeamsRequirements::test_check_teams_requirements_lazy_installs_when_missing tests/gateway/test_teams.py::TestTeamsRequirements::test_validate_config_with_env tests/gateway/test_teams.py::TestTeamsRequirements::test_validate_config_from_extra tests/gateway/test_teams.py::TestTeamsRequirements::test_validate_config_missing tests/gateway/test_teams.py::TestTeamsRequirements::test_validate_config_missing_tenant tests/gateway/test_teams.py::TestTeamsAdapterInit::test_reads_config_from_extra tests/gateway/test_teams.py::TestTeamsAdapterInit::test_falls_back_to_env_vars tests/gateway/test_teams.py::TestTeamsAdapterInit::test_default_port tests/gateway/test_teams.py::TestTeamsAdapterInit::test_custom_port_from_extra tests/gateway/test_teams.py::TestTeamsAdapterInit::test_custom_port_from_env tests/gateway/test_teams.py::TestTeamsAdapterInit::test_invalid_port_from_extra_falls_back_to_default tests/gateway/test_teams.py::TestTeamsAdapterInit::test_invalid_port_from_env_falls_back_to_default tests/gateway/test_teams.py::TestTeamsAdapterInit::test_platform_value tests/gateway/test_teams.py::TestTeamsPluginRegistration::test_register_calls_ctx tests/gateway/test_teams.py::TestTeamsPluginRegistration::test_register_name tests/gateway/test_teams.py::TestTeamsPluginRegistration::test_register_auth_env_vars tests/gateway/test_teams.py::TestTeamsPluginRegistration::test_register_max_message_length tests/gateway/test_teams.py::TestTeamsPluginRegistration::test_register_has_setup_fn tests/gateway/test_teams.py::TestTeamsPluginRegistration::test_register_has_platform_hint tests/gateway/test_teams.py::TestTeamsInteractiveSetup::test_interactive_setup_persists_credentials tests/gateway/test_teams.py::TestTeamsConnect::test_connect_fails_without_sdk[asyncio] tests/gateway/test_teams.py::TestTeamsConnect::test_connect_fails_without_credentials[asyncio] tests/gateway/test_teams.py::TestTeamsConnect::test_disconnect_cleans_up[asyncio] tests/gateway/test_teams.py::TestTeamsSend::test_send_returns_error_without_app[asyncio] tests/gateway/test_teams.py::TestTeamsSend::test_send_calls_app_send[asyncio] tests/gateway/test_teams.py::TestTeamsSend::test_send_handles_error[asyncio] tests/gateway/test_teams.py::TestTeamsSend::test_send_typing[asyncio] tests/gateway/test_teams.py::TestTeamsSummaryWriter::test_incoming_webhook_posts_summary_text[asyncio] tests/gateway/test_teams.py::TestTeamsSummaryWriter::test_graph_delivery_posts_to_channel[asyncio] tests/gateway/test_teams.py::TestTeamsSummaryWriter::test_graph_delivery_falls_back_to_platform_home_channel[asyncio] tests/gateway/test_teams.py::TestTeamsSummaryWriter::test_existing_record_is_reused_without_force_resend[asyncio] tests/gateway/test_teams.py::TestTeamsMessageHandling::test_personal_message_creates_dm_event[asyncio] tests/gateway/test_teams.py::TestTeamsMessageHandling::test_group_message_creates_group_event[asyncio] tests/gateway/test_teams.py::TestTeamsMessageHandling::test_channel_message_creates_channel_event[asyncio] tests/gateway/test_teams.py::TestTeamsMessageHandling::test_user_id_uses_aad_object_id[asyncio] tests/gateway/test_teams.py::TestTeamsMessageHandling::test_self_message_filtered[asyncio] tests/gateway/test_teams.py::TestTeamsMessageHandling::test_bot_mention_stripped_from_text[asyncio] tests/gateway/test_teams.py::TestTeamsMessageHandling::test_deduplication[asyncio] tests/gateway/test_teams.py::TestTeamsAttachmentClassification::test_file_download_info_sets_document_type[asyncio] tests/gateway/test_teams.py::TestTeamsAttachmentClassification::test_mixed_image_and_document_prefers_document[asyncio] tests/gateway/test_teams.py::TestTeamsAttachmentClassification::test_html_body_attachment_stays_text[asyncio] tests/gateway/test_teams.py::TestTeamsAttachmentClassification::test_image_only_still_photo[asyncio] tests/gateway/test_teams.py::TestTeamsAttachmentClassification::test_download_failure_degrades_to_text[asyncio] tests/gateway/test_teams.py::TestTeamsStandaloneSend::test_standalone_send_acquires_token_and_posts_activity tests/gateway/test_teams.py::TestTeamsStandaloneSend::test_standalone_send_returns_error_when_unconfigured tests/gateway/test_teams.py::TestTeamsStandaloneSend::test_standalone_send_propagates_token_failure tests/gateway/test_teams.py::TestTeamsStandaloneSend::test_standalone_send_rejects_off_allowlist_service_url tests/gateway/test_teams.py::TestTeamsStandaloneSend::test_standalone_send_rejects_chat_id_with_path_traversal tests/gateway/test_teams.py::TestTeamsMediaAttachments::test_send_video_remote_url_succeeds tests/gateway/test_teams.py::TestTeamsMediaAttachments::test_send_voice_local_file_base64 tests/gateway/test_teams.py::TestTeamsMediaAttachments::test_send_document_local_file_base64 tests/gateway/test_teams.py::TestTeamsMediaAttachments::test_send_video_without_app_fails tests/gateway/test_teams.py::TestTeamsMediaAttachments::test_send_document_missing_file_fails_gracefully