tests/gateway/test_feishu_approval_buttons.py::TestFeishuExecApproval::test_sends_interactive_card tests/gateway/test_feishu_approval_buttons.py::TestFeishuExecApproval::test_stores_approval_state tests/gateway/test_feishu_approval_buttons.py::TestFeishuExecApproval::test_not_connected tests/gateway/test_feishu_approval_buttons.py::TestFeishuExecApproval::test_truncates_long_command tests/gateway/test_feishu_approval_buttons.py::TestFeishuExecApproval::test_multiple_approvals_get_unique_ids tests/gateway/test_feishu_approval_buttons.py::TestFeishuUpdatePrompt::test_sends_interactive_card tests/gateway/test_feishu_approval_buttons.py::TestFeishuUpdatePrompt::test_stores_prompt_state tests/gateway/test_feishu_approval_buttons.py::TestFeishuUpdatePrompt::test_not_connected tests/gateway/test_feishu_approval_buttons.py::TestFeishuUpdatePrompt::test_send_failure_returns_error tests/gateway/test_feishu_approval_buttons.py::TestResolveApproval::test_resolves_once tests/gateway/test_feishu_approval_buttons.py::TestResolveApproval::test_resolves_deny tests/gateway/test_feishu_approval_buttons.py::TestResolveApproval::test_resolves_session tests/gateway/test_feishu_approval_buttons.py::TestResolveApproval::test_resolves_always tests/gateway/test_feishu_approval_buttons.py::TestResolveApproval::test_already_resolved_drops_silently tests/gateway/test_feishu_approval_buttons.py::TestResolveApproval::test_unauthorized_click_does_not_resolve tests/gateway/test_feishu_approval_buttons.py::TestResolveApproval::test_chat_mismatch_does_not_resolve tests/gateway/test_feishu_approval_buttons.py::TestNonApprovalCardAction::test_routes_as_synthetic_command tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_drops_action_when_loop_not_ready tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_returns_card_for_approve_action tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_returns_card_for_deny_action tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_ignores_missing_approval_id tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_no_card_for_non_approval_action tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_falls_back_to_open_id_when_name_not_cached tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_ignores_expired_cached_name tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_rejects_approval_click_from_unauthorized_user tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_rejects_approval_click_when_callback_chat_mismatches tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_returns_card_for_update_prompt_yes tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_returns_card_for_update_prompt_no tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_ignores_missing_update_prompt_id tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_already_resolved_update_prompt_returns_no_card tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_update_prompt_schedule_failure_returns_no_card tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_update_prompt_unauthorized_operator_returns_no_card tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_update_prompt_empty_allowlists_fail_closed tests/gateway/test_feishu_approval_buttons.py::TestCardActionCallbackResponse::test_update_prompt_chat_mismatch_returns_no_card tests/gateway/test_feishu_approval_buttons.py::TestResolveUpdatePrompt::test_writes_response_file tests/gateway/test_feishu_approval_buttons.py::TestResolveUpdatePrompt::test_overwrites_existing_response_file tests/gateway/test_feishu_approval_buttons.py::TestResolveUpdatePrompt::test_unknown_prompt_id_drops_silently tests/gateway/test_feishu_approval_buttons.py::TestResolveUpdatePrompt::test_chat_mismatch_does_not_write_response_file