Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion libraries/botbuilder-core/botbuilder/core/turn_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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:
"""
Expand Down
29 changes: 28 additions & 1 deletion libraries/botbuilder-core/tests/test_turn_context.py
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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