From bd192f2ce798a4ff29703656a16938b192c270b1 Mon Sep 17 00:00:00 2001 From: Axel Suarez Date: Thu, 24 Oct 2019 14:37:30 -0700 Subject: [PATCH] Added trace activity helper in turn context --- .../botbuilder/core/turn_context.py | 23 ++++++++++++++- .../tests/test_turn_context.py | 29 ++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/libraries/botbuilder-core/botbuilder/core/turn_context.py b/libraries/botbuilder-core/botbuilder/core/turn_context.py index 0155a992b..75bb278d3 100644 --- a/libraries/botbuilder-core/botbuilder/core/turn_context.py +++ b/libraries/botbuilder-core/botbuilder/core/turn_context.py @@ -3,8 +3,15 @@ import re from copy import copy +from datetime import datetime from typing import List, Callable, Union, Dict -from botbuilder.schema import Activity, ConversationReference, Mention, ResourceResponse +from botbuilder.schema import ( + Activity, + ActivityTypes, + ConversationReference, + Mention, + ResourceResponse, +) class TurnContext: @@ -245,6 +252,20 @@ async def next_handler(): # logic does not use parentheses because it's a coroutine return await logic + async def send_trace_activity( + self, name: str, value: object, value_type: str, label: str + ) -> ResourceResponse: + trace_activity = Activity( + type=ActivityTypes.trace, + timestamp=datetime.utcnow(), + name=name, + value=value, + value_type=value_type, + label=label, + ) + + return await self.send_activity(trace_activity) + @staticmethod def get_conversation_reference(activity: Activity) -> ConversationReference: """ diff --git a/libraries/botbuilder-core/tests/test_turn_context.py b/libraries/botbuilder-core/tests/test_turn_context.py index 2fe6bdcc5..d39da5d20 100644 --- a/libraries/botbuilder-core/tests/test_turn_context.py +++ b/libraries/botbuilder-core/tests/test_turn_context.py @@ -1,10 +1,12 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. +from typing import Callable, List import aiounittest from botbuilder.schema import ( Activity, + ActivityTypes, ChannelAccount, ConversationAccount, Mention, @@ -33,7 +35,7 @@ async def send_activities(self, context, activities): assert activities for (idx, activity) in enumerate(activities): # pylint: disable=unused-variable assert isinstance(activity, Activity) - assert activity.type == "message" + assert activity.type == "message" or activity.type == ActivityTypes.trace responses.append(ResourceResponse(id="5678")) return responses @@ -319,3 +321,28 @@ def test_should_remove_at_mention_from_activity(self): assert text, " test activity" assert activity.text, " test activity" + + async def test_should_send_a_trace_activity(self): + context = TurnContext(SimpleAdapter(), ACTIVITY) + called = False + + # pylint: disable=unused-argument + async def aux_func( + ctx: TurnContext, activities: List[Activity], next: Callable + ): + nonlocal called + called = True + assert isinstance(activities, list), "activities not array." + assert len(activities) == 1, "invalid count of activities." + assert activities[0].type == ActivityTypes.trace, "type wrong." + assert activities[0].name == "name-text", "name wrong." + assert activities[0].value == "value-text", "value worng." + assert activities[0].value_type == "valueType-text", "valeuType wrong." + assert activities[0].label == "label-text", "label wrong." + return [] + + context.on_send_activities(aux_func) + await context.send_trace_activity( + "name-text", "value-text", "valueType-text", "label-text" + ) + assert called