@@ -83,6 +83,65 @@ def test_get_channel_pairs():
8383 assert (CHANNEL_LINK_KEY , None ) in result
8484
8585
86+ def test_get_caller_pairs_non_teams_fallback_to_from_id ():
87+ """Test userId falls back to from.id when aad_object_id is None (non-Teams channel)."""
88+ from_account = ChannelAccount (
89+ id = "from-id-123" ,
90+ name = "Non-Teams User" ,
91+ )
92+ activity = Activity (type = "message" , from_property = from_account )
93+
94+ result = list (get_caller_pairs (activity ))
95+
96+ assert (USER_ID_KEY , "from-id-123" ) in result
97+ assert (USER_NAME_KEY , "Non-Teams User" ) in result
98+ assert (USER_EMAIL_KEY , None ) in result
99+
100+
101+ def test_get_caller_pairs_a2a_fallback_to_agentic_user_id ():
102+ """Test userId falls back to agentic_user_id for A2A calls (no aad_object_id)."""
103+ from_account = ChannelAccount (
104+ id = "from-id-456" ,
105+ name = "Agent Caller" ,
106+ agentic_user_id = "a2a-agent-guid" ,
107+ )
108+ activity = Activity (type = "message" , from_property = from_account )
109+
110+ result = list (get_caller_pairs (activity ))
111+
112+ assert (USER_ID_KEY , "a2a-agent-guid" ) in result
113+ assert (USER_EMAIL_KEY , "a2a-agent-guid" ) in result
114+
115+
116+ def test_get_caller_pairs_aad_object_id_wins_when_all_set ():
117+ """Test aad_object_id takes precedence when all identifiers are present."""
118+ from_account = ChannelAccount (
119+ id = "from-id-789" ,
120+ aad_object_id = "aad-wins" ,
121+ name = "Full User" ,
122+ agentic_user_id = "agent-upn" ,
123+ )
124+ activity = Activity (type = "message" , from_property = from_account )
125+
126+ result = list (get_caller_pairs (activity ))
127+
128+ assert (USER_ID_KEY , "aad-wins" ) in result
129+ assert (USER_NAME_KEY , "Full User" ) in result
130+ assert (USER_EMAIL_KEY , "agent-upn" ) in result
131+
132+
133+ def test_get_caller_pairs_a2a_guid_agentic_user_id ():
134+ """Test userId resolves to GUID AgenticUserId in A2A scenario."""
135+ from_account = ChannelAccount (
136+ id = "29:1sH5NArUwkWAX" ,
137+ name = "Agent Caller" ,
138+ agentic_user_id = "bef730f4-d6f5-4ffb-b759-26ffa449ed7e" ,
139+ )
140+ activity = Activity (type = "message" , from_property = from_account )
141+ result = list (get_caller_pairs (activity ))
142+ assert (USER_ID_KEY , "bef730f4-d6f5-4ffb-b759-26ffa449ed7e" ) in result
143+
144+
86145def test_get_conversation_pairs ():
87146 """Test get_conversation_pairs extracts conversation information."""
88147 conversation = ConversationAccount (id = "conversation-123" )
0 commit comments