Repository: microsoft/botbuilder-python
Pull request #358 (2019-10-24 20:34:57)

Apply conversation reference in TurnContext.update_activity
Fixes https://github.com/microsoft/botbuilder-dotnet/issues/2388

Parity with .NET and Node.js


Patch:
diff --git a/libraries/botbuilder-core/botbuilder/core/turn_context.py b/libraries/botbuilder-core/botbuilder/core/turn_context.py
index 99d53996..0155a992 100644
--- a/libraries/botbuilder-core/botbuilder/core/turn_context.py
+++ b/libraries/botbuilder-core/botbuilder/core/turn_context.py
@@ -173,9 +173,11 @@ class TurnContext:
         :param activity:
         :return:
         """
+        reference = TurnContext.get_conversation_reference(self.activity)
+
         return await self._emit(
             self._on_update_activity,
-            activity,
+            TurnContext.apply_conversation_reference(activity, reference),
             self.adapter.update_activity(self, activity),
         )
 
@@ -240,7 +242,7 @@ class TurnContext:
                 raise error
 
         await emit_next(0)
-        # This should be changed to `return await logic()`
+        # logic does not use parentheses because it's a coroutine
         return await logic
 
     @staticmethod


Test patch:
diff --git a/libraries/botbuilder-core/tests/test_turn_context.py b/libraries/botbuilder-core/tests/test_turn_context.py
index 8e7c6f40..2fe6bdcc 100644
--- a/libraries/botbuilder-core/tests/test_turn_context.py
+++ b/libraries/botbuilder-core/tests/test_turn_context.py
@@ -10,7 +10,7 @@ from botbuilder.schema import (
     Mention,
     ResourceResponse,
 )
-from botbuilder.core import BotAdapter, TurnContext
+from botbuilder.core import BotAdapter, MessageFactory, TurnContext
 
 ACTIVITY = Activity(
     id="1234",
@@ -40,11 +40,12 @@ class SimpleAdapter(BotAdapter):
     async def update_activity(self, context, activity):
         assert context is not None
         assert activity is not None
+        return ResourceResponse(id=activity.id)
 
     async def delete_activity(self, context, reference):
         assert context is not None
         assert reference is not None
-        assert reference.activity_id == "1234"
+        assert reference.activity_id == ACTIVITY.id
 
 
 class TestBotContext(aiounittest.AsyncTestCase):
@@ -225,6 +226,26 @@ class TestBotContext(aiounittest.AsyncTestCase):
         await context.update_activity(ACTIVITY)
         assert called is True
 
+    async def test_update_activity_should_apply_conversation_reference(self):
+        activity_id = "activity ID"
+        context = TurnContext(SimpleAdapter(), ACTIVITY)
+        called = False
+
+        async def update_handler(context, activity, next_handler_coroutine):
+            nonlocal called
+            called = True
+            assert context is not None
+            assert activity.id == activity_id
+            assert activity.conversation.id == ACTIVITY.conversation.id
+            await next_handler_coroutine()
+
+        context.on_update_activity(update_handler)
+        new_activity = MessageFactory.text("test text")
+        new_activity.id = activity_id
+        update_result = await context.update_activity(new_activity)
+        assert called is True
+        assert update_result.id == activity_id
+
     def test_get_conversation_reference_should_return_valid_reference(self):
         reference = TurnContext.get_conversation_reference(ACTIVITY)