Skip to content

Adding deserializer helper #472

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Dec 6, 2019
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
2 changes: 2 additions & 0 deletions libraries/botbuilder-core/botbuilder/core/teams/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@

from .teams_activity_handler import TeamsActivityHandler
from .teams_info import TeamsInfo
from .teams_helper import deserializer_helper
from .teams_activity_extensions import (
teams_get_channel_id,
teams_get_team_info,
teams_notify_user,
)

__all__ = [
"deserializer_helper",
"TeamsActivityHandler",
"TeamsInfo",
"teams_get_channel_id",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from http import HTTPStatus
from botbuilder.schema import Activity, ActivityTypes, ChannelAccount
from botbuilder.core.turn_context import TurnContext
from botbuilder.core.teams.teams_helper import deserializer_helper
from botbuilder.core import ActivityHandler, InvokeResponse, BotFrameworkAdapter
from botbuilder.schema.teams import (
AppBasedLinkQuery,
Expand Down Expand Up @@ -62,14 +63,16 @@ async def on_invoke_activity(self, turn_context: TurnContext):
if turn_context.activity.name == "fileConsent/invoke":
return await self.on_teams_file_consent(
turn_context,
FileConsentCardResponse().deserialize(turn_context.activity.value),
deserializer_helper(
FileConsentCardResponse, turn_context.activity.value
),
)

if turn_context.activity.name == "actionableMessage/executeAction":
await self.on_teams_o365_connector_card_action(
turn_context,
O365ConnectorCardActionQuery().deserialize(
turn_context.activity.value
deserializer_helper(
O365ConnectorCardActionQuery, turn_context.activity.value
),
)
return self._create_invoke_response()
Expand All @@ -78,16 +81,18 @@ async def on_invoke_activity(self, turn_context: TurnContext):
return self._create_invoke_response(
await self.on_teams_app_based_link_query(
turn_context,
AppBasedLinkQuery().deserialize(turn_context.activity.value),
deserializer_helper(
AppBasedLinkQuery, turn_context.activity.value
),
)
)

if turn_context.activity.name == "composeExtension/query":
return self._create_invoke_response(
await self.on_teams_messaging_extension_query(
turn_context,
MessagingExtensionQuery().deserialize(
turn_context.activity.value
deserializer_helper(
MessagingExtensionQuery, turn_context.activity.value
),
)
)
Expand All @@ -103,24 +108,28 @@ async def on_invoke_activity(self, turn_context: TurnContext):
return self._create_invoke_response(
await self.on_teams_messaging_extension_submit_action_dispatch(
turn_context,
MessagingExtensionAction(**turn_context.activity.value),
deserializer_helper(
MessagingExtensionAction, turn_context.activity.value
),
)
)

if turn_context.activity.name == "composeExtension/fetchTask":
return self._create_invoke_response(
await self.on_teams_messaging_extension_fetch_task(
turn_context,
MessagingExtensionAction(**turn_context.activity.value),
deserializer_helper(
MessagingExtensionAction, turn_context.activity.value,
),
)
)

if turn_context.activity.name == "composeExtension/querySettingUrl":
return self._create_invoke_response(
await self.on_teams_messaging_extension_configuration_query_settings_url(
turn_context,
MessagingExtensionQuery().deserialize(
turn_context.activity.value
deserializer_helper(
MessagingExtensionQuery, turn_context.activity.value
),
)
)
Expand All @@ -141,15 +150,19 @@ async def on_invoke_activity(self, turn_context: TurnContext):
return self._create_invoke_response(
await self.on_teams_task_module_fetch(
turn_context,
TaskModuleRequest().deserialize(turn_context.activity.value),
deserializer_helper(
TaskModuleRequest, turn_context.activity.value
),
)
)

if turn_context.activity.name == "task/submit":
return self._create_invoke_response(
await self.on_teams_task_module_submit(
turn_context,
TaskModuleRequest().deserialize(turn_context.activity.value),
deserializer_helper(
TaskModuleRequest, turn_context.activity.value
),
)
)

Expand Down
24 changes: 24 additions & 0 deletions libraries/botbuilder-core/botbuilder/core/teams/teams_helper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from inspect import getmembers
from typing import Type
from enum import Enum

from msrest.serialization import Model, Deserializer

import botbuilder.schema as schema
import botbuilder.schema.teams as teams_schema


def deserializer_helper(msrest_cls: Type[Model], dict_to_deserialize: dict) -> Model:
dependencies = [
schema_cls
for key, schema_cls in getmembers(schema)
if isinstance(schema_cls, type) and issubclass(schema_cls, (Model, Enum))
]
dependencies += [
schema_cls
for key, schema_cls in getmembers(teams_schema)
if isinstance(schema_cls, type) and issubclass(schema_cls, (Model, Enum))
]
dependencies_dict = {dependency.__name__: dependency for dependency in dependencies}
deserializer = Deserializer(dependencies_dict)
return deserializer(msrest_cls.__name__, dict_to_deserialize)
Original file line number Diff line number Diff line change
Expand Up @@ -517,11 +517,11 @@ async def test_on_teams_messaging_extension_bot_message_preview_edit_activity(se
value={
"data": {"key": "value"},
"context": {"theme": "dark"},
"comamndId": "test_command",
"commandId": "test_command",
"commandContext": "command_context_test",
"botMessagePreviewAction": "edit",
"botActivityPreview": [Activity().serialize()],
"messagePayload": MessageActionsPayload().serialize(),
"botActivityPreview": [{"id": "activity123"}],
"messagePayload": {"id": "payloadid"},
},
)

Expand All @@ -548,11 +548,11 @@ async def test_on_teams_messaging_extension_bot_message_send_activity(self):
value={
"data": {"key": "value"},
"context": {"theme": "dark"},
"comamndId": "test_command",
"commandId": "test_command",
"commandContext": "command_context_test",
"botMessagePreviewAction": "send",
"botActivityPreview": [Activity().serialize()],
"messagePayload": MessageActionsPayload().serialize(),
"botActivityPreview": [{"id": "123"}],
"messagePayload": {"id": "abc"},
},
)

Expand All @@ -578,11 +578,11 @@ async def test_on_teams_messaging_extension_bot_message_send_activity_with_none(
value={
"data": {"key": "value"},
"context": {"theme": "dark"},
"comamndId": "test_command",
"commandId": "test_command",
"commandContext": "command_context_test",
"botMessagePreviewAction": None,
"botActivityPreview": [Activity().serialize()],
"messagePayload": MessageActionsPayload().serialize(),
"botActivityPreview": [{"id": "test123"}],
"messagePayload": {"id": "payloadid123"},
},
)

Expand All @@ -608,7 +608,7 @@ async def test_on_teams_messaging_extension_bot_message_send_activity_with_empty
value={
"data": {"key": "value"},
"context": {"theme": "dark"},
"comamndId": "test_command",
"commandId": "test_command",
"commandContext": "command_context_test",
"botMessagePreviewAction": "",
"botActivityPreview": [Activity().serialize()],
Expand Down Expand Up @@ -636,14 +636,13 @@ async def test_on_teams_messaging_extension_fetch_task(self):
value={
"data": {"key": "value"},
"context": {"theme": "dark"},
"comamndId": "test_command",
"commandId": "test_command",
"commandContext": "command_context_test",
"botMessagePreviewAction": "message_action",
"botActivityPreview": [Activity().serialize()],
"messagePayload": MessageActionsPayload().serialize(),
"botActivityPreview": [{"id": "123"}],
"messagePayload": {"id": "abc123"},
},
)

turn_context = TurnContext(SimpleAdapter(), activity)

# Act
Expand All @@ -661,7 +660,7 @@ async def test_on_teams_messaging_extension_configuration_query_settings_url(sel
type=ActivityTypes.invoke,
name="composeExtension/querySettingUrl",
value={
"comamndId": "test_command",
"commandId": "test_command",
"parameters": [],
"messagingExtensionQueryOptions": {"skip": 1, "count": 1},
"state": "state_string",
Expand Down
51 changes: 51 additions & 0 deletions libraries/botbuilder-core/tests/teams/test_teams_helper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import aiounittest

from botbuilder.core.teams.teams_helper import deserializer_helper
from botbuilder.schema import Activity, ChannelAccount, Mention
from botbuilder.schema.teams import (
MessageActionsPayload,
MessagingExtensionAction,
TaskModuleRequestContext,
)


class TestTeamsActivityHandler(aiounittest.AsyncTestCase):
def test_teams_helper_teams_schema(self):
# Arrange
data = {
"data": {"key": "value"},
"context": {"theme": "dark"},
"commandId": "test_command",
"commandContext": "command_context_test",
"botMessagePreviewAction": "edit",
"botActivityPreview": [{"id": "activity123"}],
"messagePayload": {"id": "payloadid"},
}

# Act
result = deserializer_helper(MessagingExtensionAction, data)

# Assert
assert result.data == {"key": "value"}
assert result.context == TaskModuleRequestContext(theme="dark")
assert result.command_id == "test_command"
assert result.bot_message_preview_action == "edit"
assert len(result.bot_activity_preview) == 1
assert result.bot_activity_preview[0] == Activity(id="activity123")
assert result.message_payload == MessageActionsPayload(id="payloadid")

def test_teams_helper_schema(self):
# Arrange
data = {
"mentioned": {"id": "123", "name": "testName"},
"text": "Hello <at>testName</at>",
"type": "mention",
}

# Act
result = deserializer_helper(Mention, data)

# Assert
assert result.mentioned == ChannelAccount(id="123", name="testName")
assert result.text == "Hello <at>testName</at>"
assert result.type == "mention"
Original file line number Diff line number Diff line change
Expand Up @@ -560,7 +560,7 @@ def __init__(self, **kwargs):
super(MessagingExtensionAction, self).__init__(**kwargs)
self.command_id = kwargs.get("command_id", None)
self.command_context = kwargs.get("command_context", None)
self.bot_message_preview_action = kwargs.get("botMessagePreviewAction", None)
self.bot_message_preview_action = kwargs.get("bot_message_preview_action", None)
self.bot_activity_preview = kwargs.get("bot_activity_preview", None)
self.message_payload = kwargs.get("message_payload", None)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -670,7 +670,7 @@ def __init__(
context=None,
command_id: str = None,
command_context=None,
botMessagePreviewAction=None,
bot_message_preview_action=None,
bot_activity_preview=None,
message_payload=None,
**kwargs
Expand All @@ -680,7 +680,7 @@ def __init__(
)
self.command_id = command_id
self.command_context = command_context
self.bot_message_preview_action = botMessagePreviewAction
self.bot_message_preview_action = bot_message_preview_action
self.bot_activity_preview = bot_activity_preview
self.message_payload = message_payload

Expand Down