From 3eb07a5d6260baab4e4cf84505bde83388781212 Mon Sep 17 00:00:00 2001 From: Santiago Grangetto Date: Wed, 1 Jul 2020 14:56:24 -0300 Subject: [PATCH 1/5] add teams events events added: - teamArchived - teamDeleted - teamHardDeleted - teamRestored - teamUnarchived --- .../core/teams/teams_activity_handler.py | 90 +++++++++++ .../teams/test_teams_activity_handler.py | 140 ++++++++++++++++++ 2 files changed, 230 insertions(+) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py index 7b1a88814..3b728da85 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py @@ -324,10 +324,30 @@ async def on_conversation_update_activity(self, turn_context: TurnContext): return await self.on_teams_channel_renamed( channel_data.channel, channel_data.team, turn_context ) + if channel_data.event_type == "teamArchived": + return await self.on_teams_team_archived( + channel_data.team, turn_context + ) + if channel_data.event_type == "teamDeleted": + return await self.on_teams_team_deleted( + channel_data.team, turn_context + ) + if channel_data.event_type == "teamHardDeleted": + return await self.on_teams_team_hard_deleted( + channel_data.team, turn_context + ) if channel_data.event_type == "teamRenamed": return await self.on_teams_team_renamed_activity( channel_data.team, turn_context ) + if channel_data.event_type == "teamRestored": + return await self.on_teams_team_restored( + channel_data.team, turn_context + ) + if channel_data.event_type == "teamUnarchived": + return await self.on_teams_team_unarchived( + channel_data.team, turn_context + ) return await super().on_conversation_update_activity(turn_context) @@ -336,11 +356,81 @@ async def on_teams_channel_created( # pylint: disable=unused-argument ): return + async def on_teams_team_archived( # pylint: disable=unused-argument + self, team_info: TeamInfo, turn_context: TurnContext + ): + """ + Invoked when a Team Archived event activity is received from the connector. + Team Archived correspond to the user archiving a team. + + :param team_info: The team info object representing the team. + :param turn_context: A context object for this turn. + + :returns: A task that represents the work queued to execute. + """ + return + + async def on_teams_team_deleted( # pylint: disable=unused-argument + self, team_info: TeamInfo, turn_context: TurnContext + ): + """ + Invoked when a Team Deleted event activity is received from the connector. + Team Deleted corresponds to the user deleting a team. + + :param team_info: The team info object representing the team. + :param turn_context: A context object for this turn. + + :returns: A task that represents the work queued to execute. + """ + return + + async def on_teams_team_hard_deleted( # pylint: disable=unused-argument + self, team_info: TeamInfo, turn_context: TurnContext + ): + """ + Invoked when a Team Hard Deleted event activity is received from the connector. + Team Hard Deleted corresponds to the user hard deleting a team. + + :param team_info: The team info object representing the team. + :param turn_context: A context object for this turn. + + :returns: A task that represents the work queued to execute. + """ + return + async def on_teams_team_renamed_activity( # pylint: disable=unused-argument self, team_info: TeamInfo, turn_context: TurnContext ): return + async def on_teams_team_restored( # pyling: disable=unused-argument + self, team_info: TeamInfo, turn_context: TurnContext + ): + """ + Invoked when a Team Restored event activity is received from the connector. + Team Restored corresponds to the user restoring a team. + + :param team_info: The team info object representing the team. + :param turn_context: A context object for this turn. + + :returns: A task that represents the work queued to execute. + """ + return + + async def on_teams_team_unarchived( # pylint: disable=unused-argument + self, team_info: TeamInfo, turn_context: TurnContext + ): + """ + Invoked when a Team Unarchived event activity is received from the connector. + Team Unarchived correspond to the user unarchiving a team. + + :param team_info: The team info object representing the team. + :param turn_context: A context object for this turn. + + :returns: A task that represents the work queued to execute. + """ + return + async def on_teams_members_added_dispatch( # pylint: disable=unused-argument self, members_added: [ChannelAccount], diff --git a/libraries/botbuilder-core/tests/teams/test_teams_activity_handler.py b/libraries/botbuilder-core/tests/teams/test_teams_activity_handler.py index 7c70ef36c..30fdac818 100644 --- a/libraries/botbuilder-core/tests/teams/test_teams_activity_handler.py +++ b/libraries/botbuilder-core/tests/teams/test_teams_activity_handler.py @@ -108,12 +108,42 @@ async def on_teams_channel_deleted( channel_info, team_info, turn_context ) + async def on_teams_team_archived( + self, team_info: TeamInfo, turn_context: TurnContext + ): + self.record.append("on_teams_team_archived") + return await super().on_teams_team_archived(team_info, turn_context) + + async def on_teams_team_deleted( + self, team_info: TeamInfo, turn_context: TurnContext + ): + self.record.append("on_teams_team_deleted") + return await super().on_teams_team_deleted(team_info, turn_context) + + async def on_teams_team_hard_deleted( + self, team_info: TeamInfo, turn_context: TurnContext + ): + self.record.append("on_teams_team_hard_deleted") + return await super().on_teams_team_hard_deleted(team_info, turn_context) + async def on_teams_team_renamed_activity( self, team_info: TeamInfo, turn_context: TurnContext ): self.record.append("on_teams_team_renamed_activity") return await super().on_teams_team_renamed_activity(team_info, turn_context) + async def on_teams_team_restored( + self, team_info: TeamInfo, turn_context: TurnContext + ): + self.record.append("on_teams_team_restored") + return await super().on_teams_team_restored(team_info, turn_context) + + async def on_teams_team_unarchived( + self, team_info: TeamInfo, turn_context: TurnContext + ): + self.record.append("on_teams_team_unarchived") + return await super().on_teams_team_unarchived(team_info, turn_context) + async def on_invoke_activity(self, turn_context: TurnContext): self.record.append("on_invoke_activity") return await super().on_invoke_activity(turn_context) @@ -335,6 +365,72 @@ async def test_on_teams_channel_deleted_activity(self): assert bot.record[0] == "on_conversation_update_activity" assert bot.record[1] == "on_teams_channel_deleted" + async def test_on_teams_team_archived(self): + # arrange + activity = Activity( + type=ActivityTypes.conversation_update, + channel_data={ + "eventType": "teamArchived", + "team": {"id": "team_id_1", "name": "archived_team_name"}, + }, + channel_id=Channels.ms_teams, + ) + + turn_context = TurnContext(NotImplementedAdapter(), activity) + + # Act + bot = TestingTeamsActivityHandler() + await bot.on_turn(turn_context) + + # Assert + assert len(bot.record) == 2 + assert bot.record[0] == "on_conversation_update_activity" + assert bot.record[1] == "on_teams_team_archived" + + async def test_on_teams_team_deleted(self): + # arrange + activity = Activity( + type=ActivityTypes.conversation_update, + channel_data={ + "eventType": "teamDeleted", + "team": {"id": "team_id_1", "name": "deleted_team_name"}, + }, + channel_id=Channels.ms_teams, + ) + + turn_context = TurnContext(NotImplementedAdapter(), activity) + + # Act + bot = TestingTeamsActivityHandler() + await bot.on_turn(turn_context) + + # Assert + assert len(bot.record) == 2 + assert bot.record[0] == "on_conversation_update_activity" + assert bot.record[1] == "on_teams_team_deleted" + + async def test_on_teams_team_hard_deleted(self): + # arrange + activity = Activity( + type=ActivityTypes.conversation_update, + channel_data={ + "eventType": "teamHardDeleted", + "team": {"id": "team_id_1", "name": "hard_deleted_team_name"}, + }, + channel_id=Channels.ms_teams, + ) + + turn_context = TurnContext(NotImplementedAdapter(), activity) + + # Act + bot = TestingTeamsActivityHandler() + await bot.on_turn(turn_context) + + # Assert + assert len(bot.record) == 2 + assert bot.record[0] == "on_conversation_update_activity" + assert bot.record[1] == "on_teams_team_hard_deleted" + async def test_on_teams_team_renamed_activity(self): # arrange activity = Activity( @@ -357,6 +453,50 @@ async def test_on_teams_team_renamed_activity(self): assert bot.record[0] == "on_conversation_update_activity" assert bot.record[1] == "on_teams_team_renamed_activity" + async def test_on_teams_team_restored(self): + # arrange + activity = Activity( + type=ActivityTypes.conversation_update, + channel_data={ + "eventType": "teamRestored", + "team": {"id": "team_id_1", "name": "restored_team_name"}, + }, + channel_id=Channels.ms_teams, + ) + + turn_context = TurnContext(NotImplementedAdapter(), activity) + + # Act + bot = TestingTeamsActivityHandler() + await bot.on_turn(turn_context) + + # Assert + assert len(bot.record) == 2 + assert bot.record[0] == "on_conversation_update_activity" + assert bot.record[1] == "on_teams_team_restored" + + async def test_on_teams_team_unarchived(self): + # arrange + activity = Activity( + type=ActivityTypes.conversation_update, + channel_data={ + "eventType": "teamUnarchived", + "team": {"id": "team_id_1", "name": "unarchived_team_name"}, + }, + channel_id=Channels.ms_teams, + ) + + turn_context = TurnContext(NotImplementedAdapter(), activity) + + # Act + bot = TestingTeamsActivityHandler() + await bot.on_turn(turn_context) + + # Assert + assert len(bot.record) == 2 + assert bot.record[0] == "on_conversation_update_activity" + assert bot.record[1] == "on_teams_team_unarchived" + async def test_on_teams_members_added_activity(self): # arrange activity = Activity( From ac590c1d34ab6e29e24670ab231e2842ac6f686f Mon Sep 17 00:00:00 2001 From: Santiago Grangetto Date: Wed, 1 Jul 2020 15:27:40 -0300 Subject: [PATCH 2/5] fix pylint comment --- .../botbuilder/core/teams/teams_activity_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py index 3b728da85..4deddd9dc 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py @@ -403,7 +403,7 @@ async def on_teams_team_renamed_activity( # pylint: disable=unused-argument ): return - async def on_teams_team_restored( # pyling: disable=unused-argument + async def on_teams_team_restored( # pylint: disable=unused-argument self, team_info: TeamInfo, turn_context: TurnContext ): """ From 8cf7995cd486f62f1440fd0b91beda6b0877b50c Mon Sep 17 00:00:00 2001 From: Den Scollo Date: Mon, 6 Jul 2020 10:59:14 -0300 Subject: [PATCH 3/5] Fix conflicts on teams activity handler file --- .../botbuilder/core/teams/teams_activity_handler.py | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py index baebcf9ad..657fff9cb 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py @@ -521,6 +521,7 @@ async def on_conversation_update_activity(self, turn_context: TurnContext): if channel_data.event_type == "teamHardDeleted": return await self.on_teams_team_hard_deleted( channel_data.team, turn_context + ) if channel_data.event_type == "channelRestored": return await self.on_teams_channel_restored( channel_data.channel, channel_data.team, turn_context From b6756f72fcbd9b3048c5822087a05c492401c97d Mon Sep 17 00:00:00 2001 From: Santiago Grangetto Date: Mon, 6 Jul 2020 12:29:26 -0300 Subject: [PATCH 4/5] pylint warning too-many-lines --- .../botbuilder/core/teams/teams_activity_handler.py | 2 ++ .../tests/teams/test_teams_activity_handler.py | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py index 657fff9cb..c96c60483 100644 --- a/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py +++ b/libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py @@ -1,6 +1,8 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. +# pylint: disable=too-many-lines + from http import HTTPStatus from botbuilder.schema import ChannelAccount, ErrorResponseException, SignInConstants from botbuilder.core import ActivityHandler, InvokeResponse diff --git a/libraries/botbuilder-core/tests/teams/test_teams_activity_handler.py b/libraries/botbuilder-core/tests/teams/test_teams_activity_handler.py index cc7eabb9d..63b265fba 100644 --- a/libraries/botbuilder-core/tests/teams/test_teams_activity_handler.py +++ b/libraries/botbuilder-core/tests/teams/test_teams_activity_handler.py @@ -1,4 +1,7 @@ -from typing import List +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +# pylint: disable=too-many-lines import aiounittest from botbuilder.core import BotAdapter, TurnContext @@ -26,6 +29,7 @@ ) from botframework.connector import Channels from simple_adapter import SimpleAdapter +from typing import List class TestingTeamsActivityHandler(TeamsActivityHandler): From 6378087ed079ae244436c5145bcd009f82822954 Mon Sep 17 00:00:00 2001 From: Santiago Grangetto Date: Mon, 6 Jul 2020 12:36:38 -0300 Subject: [PATCH 5/5] fix import order --- .../botbuilder-core/tests/teams/test_teams_activity_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/botbuilder-core/tests/teams/test_teams_activity_handler.py b/libraries/botbuilder-core/tests/teams/test_teams_activity_handler.py index 63b265fba..3a2f2318c 100644 --- a/libraries/botbuilder-core/tests/teams/test_teams_activity_handler.py +++ b/libraries/botbuilder-core/tests/teams/test_teams_activity_handler.py @@ -3,6 +3,7 @@ # pylint: disable=too-many-lines +from typing import List import aiounittest from botbuilder.core import BotAdapter, TurnContext from botbuilder.core.teams import TeamsActivityHandler @@ -29,7 +30,6 @@ ) from botframework.connector import Channels from simple_adapter import SimpleAdapter -from typing import List class TestingTeamsActivityHandler(TeamsActivityHandler):