diff --git a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsActivityHandler.java b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsActivityHandler.java index 367ac58ed..a4463900a 100644 --- a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsActivityHandler.java +++ b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsActivityHandler.java @@ -442,8 +442,11 @@ protected CompletableFuture onTeamsMembersAddedDispatch( List teamsMembersAdded = new ArrayList<>(); for (ChannelAccount memberAdded : membersAdded) { - if (!memberAdded.getProperties().isEmpty()) { - // when the ChannelAccount object is fully a TeamsChannelAccount + boolean isBot = turnContext.getActivity().getRecipient() != null + && StringUtils.equals(memberAdded.getId(), turnContext.getActivity().getRecipient().getId()); + + if (!memberAdded.getProperties().isEmpty() || isBot) { + // when the ChannelAccount object is fully a TeamsChannelAccount, or for the bot // (when Teams changes the service to return the full details) try { JsonNode node = mapper.valueToTree(memberAdded); diff --git a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsInfo.java b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsInfo.java index 0a4dfd16c..091774d2f 100644 --- a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsInfo.java +++ b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/teams/TeamsInfo.java @@ -324,11 +324,7 @@ public static CompletableFuture> sendMessage ConversationParameters conversationParameters = new ConversationParameters(); conversationParameters.setIsGroup(true); - // conversationParameters.setChannelData(new Object() { - // Object channel = new Object() { - // String id = teamsChannelId; - // }; - // }); + conversationParameters.setChannelData(teamsChannelData); conversationParameters.setActivity(activity); diff --git a/libraries/bot-builder/src/test/java/com/microsoft/bot/builder/teams/TeamsActivityHandlerTests.java b/libraries/bot-builder/src/test/java/com/microsoft/bot/builder/teams/TeamsActivityHandlerTests.java index 94818bff0..412b69cf8 100644 --- a/libraries/bot-builder/src/test/java/com/microsoft/bot/builder/teams/TeamsActivityHandlerTests.java +++ b/libraries/bot-builder/src/test/java/com/microsoft/bot/builder/teams/TeamsActivityHandlerTests.java @@ -51,6 +51,43 @@ import java.util.concurrent.atomic.AtomicReference; public class TeamsActivityHandlerTests { + @Test + public void TestConversationUpdateBotTeamsMemberAdded() { + String baseUri = "https://test.coffee"; + ConnectorClient connectorClient = getConnectorClient( + "http://localhost/", + MicrosoftAppCredentials.empty() + ); + + Activity activity = new Activity(ActivityTypes.CONVERSATION_UPDATE) { + { + setMembersAdded(new ArrayList() { + { + add(new ChannelAccount("botid-1")); + } + }); + setRecipient(new ChannelAccount("botid-1")); + setChannelData(new TeamsChannelData() { + { + setEventType("teamMemberAdded"); + setTeam(new TeamInfo("team-id")); + } + }); + setChannelId(Channels.MSTEAMS); + } + }; + + TurnContext turnContext = new TurnContextImpl(new SimpleAdapter(), activity); + turnContext.getTurnState().add(BotFrameworkAdapter.CONNECTOR_CLIENT_KEY, connectorClient); + + TestActivityHandler bot = new TestActivityHandler(); + bot.onTurn(turnContext).join(); + + Assert.assertEquals(2, bot.record.size()); + Assert.assertEquals("onConversationUpdateActivity", bot.record.get(0)); + Assert.assertEquals("onTeamsMembersAdded", bot.record.get(1)); + } + @Test public void TestConversationUpdateTeamsMemberAdded() { String baseUri = "https://test.coffee"; @@ -100,7 +137,7 @@ public void TestConversationUpdateTeamsMemberAddedNoTeam() { { setMembersAdded(new ArrayList() { { - add(new ChannelAccount("id-3")); + add(new ChannelAccount("id-1")); } }); setRecipient(new ChannelAccount("b")); @@ -1272,6 +1309,72 @@ private static ConnectorClient getConnectorClient(String baseUri, AppCredentials }) ); + // getConversationMember (Team) + Mockito.when(mockConversations.getConversationMember("id-1", "team-id")).thenReturn( + CompletableFuture.completedFuture( + new ChannelAccount() { + { + setId("id-1"); + setName("name-1"); + setProperties( + "objectId", + JsonNodeFactory.instance.textNode("objectId-1") + ); + setProperties( + "givenName", + JsonNodeFactory.instance.textNode("givenName-1") + ); + setProperties( + "surname", + JsonNodeFactory.instance.textNode("surname-1") + ); + setProperties("email", JsonNodeFactory.instance.textNode("email-1")); + setProperties( + "userPrincipalName", + JsonNodeFactory.instance.textNode("userPrincipalName-1") + ); + setProperties( + "tenantId", + JsonNodeFactory.instance.textNode("tenantId-1") + ); + } + } + ) + ); + + // getConversationMember (Group chat) + Mockito.when(mockConversations.getConversationMember("id-1", "conversation-id")).thenReturn( + CompletableFuture.completedFuture( + new ChannelAccount() { + { + setId("id-1"); + setName("name-1"); + setProperties( + "objectId", + JsonNodeFactory.instance.textNode("objectId-1") + ); + setProperties( + "givenName", + JsonNodeFactory.instance.textNode("givenName-1") + ); + setProperties( + "surname", + JsonNodeFactory.instance.textNode("surname-1") + ); + setProperties("email", JsonNodeFactory.instance.textNode("email-1")); + setProperties( + "userPrincipalName", + JsonNodeFactory.instance.textNode("userPrincipalName-1") + ); + setProperties( + "tenantId", + JsonNodeFactory.instance.textNode("tenantId-1") + ); + } + } + ) + ); + ConnectorClient mockConnectorClient = Mockito.mock(ConnectorClient.class); Mockito.when(mockConnectorClient.getConversations()).thenReturn(mockConversations); Mockito.when(mockConnectorClient.baseUrl()).thenReturn(baseUri);