Skip to content
This repository was archived by the owner on Dec 4, 2023. It is now read-only.
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
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import java.net.HttpURLConnection;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;

/**
* An implementation of the {@link Bot} interface intended for further subclassing.
Expand Down Expand Up @@ -309,7 +310,10 @@ protected CompletableFuture<InvokeResponse> onInvokeActivity(TurnContext turnCon
return onSignInInvoke(turnContext)
.thenApply(aVoid -> createInvokeResponse(null))
.exceptionally(ex -> {
if (ex instanceof InvokeResponseExcetion) {
if (ex instanceof CompletionException && ex.getCause() instanceof InvokeResponseExcetion) {
InvokeResponseExcetion ire = (InvokeResponseExcetion) ex.getCause();
return new InvokeResponse(ire.statusCode, ire.body);
} else if (ex instanceof InvokeResponseExcetion) {
InvokeResponseExcetion ire = (InvokeResponseExcetion) ex;
return new InvokeResponse(ire.statusCode, ire.body);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,12 @@ public class BotFrameworkAdapter extends BotAdapter implements AdapterIntegratio
*/
public static final String CONNECTOR_CLIENT_KEY = "ConnectorClient";

/**
* Key to store TeamsConnectorClient.
* For testing only.
*/
public static final String TEAMSCONNECTOR_CLIENT_KEY = "TeamsConnectorClient";

private AppCredentials appCredentials;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,9 @@ protected CompletableFuture<InvokeResponse> onInvokeActivity(TurnContext turnCon
}

return result.exceptionally(e -> {
if (e instanceof InvokeResponseExcetion) {
if (e instanceof CompletionException && e.getCause() instanceof InvokeResponseExcetion) {
return ((InvokeResponseExcetion) e.getCause()).createInvokeResponse();
} else if (e instanceof InvokeResponseExcetion) {
return ((InvokeResponseExcetion) e).createInvokeResponse();
}
return new InvokeResponse(HttpURLConnection.HTTP_INTERNAL_ERROR, e.getLocalizedMessage());
Expand Down Expand Up @@ -340,7 +342,7 @@ protected CompletableFuture<Void> onConversationUpdateActivity(TurnContext turnC

if (turnContext.getActivity().getMembersRemoved() != null) {
return onTeamsMembersRemovedDispatch(
turnContext.getActivity().getMembersAdded(),
turnContext.getActivity().getMembersRemoved(),
channelData.result() ? channelData.value().getTeam() : null,
turnContext
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@

package com.microsoft.bot.builder.teams;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.bot.builder.BotFrameworkAdapter;
import com.microsoft.bot.builder.TurnContext;
import com.microsoft.bot.connector.ConnectorClient;
Expand All @@ -17,6 +14,7 @@
import com.microsoft.bot.schema.ConversationReference;
import com.microsoft.bot.schema.PagedMembersResult;
import com.microsoft.bot.schema.Pair;
import com.microsoft.bot.schema.Serialization;
import com.microsoft.bot.schema.teams.ChannelInfo;
import com.microsoft.bot.schema.teams.ConversationList;
import com.microsoft.bot.schema.teams.TeamDetails;
Expand Down Expand Up @@ -186,22 +184,8 @@ private static CompletableFuture<List<TeamsChannelAccount>> getMembers(Connector

return connectorClient.getConversations().getConversationMembers(conversationId)
.thenApply(teamMembers -> {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();

List<TeamsChannelAccount> members = teamMembers.stream()
.map(channelAccount -> {
try {
// convert fro ChannelAccount to TeamsChannelAccount by going to JSON then back
// to TeamsChannelAccount.
JsonNode node = objectMapper.valueToTree(channelAccount);
return objectMapper.treeToValue(node, TeamsChannelAccount.class);
} catch (JsonProcessingException jpe) {
// this would be a conversion error. for now, return null and filter the results
// below. there is probably a more elegant way to handle this.
return null;
}
})
.map(channelAccount -> Serialization.convert(channelAccount, TeamsChannelAccount.class))
.collect(Collectors.toCollection(ArrayList::new));

members.removeIf(Objects::isNull);
Expand All @@ -216,25 +200,7 @@ private static CompletableFuture<TeamsChannelAccount> getMember(ConnectorClient
}

return connectorClient.getConversations().getConversationMember(userId, conversationId)
.thenApply(teamMember -> {
if (teamMember == null) {
return null;
}

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();

try {
// convert fro ChannelAccount to TeamsChannelAccount by going to JSON then back
// to TeamsChannelAccount.
JsonNode node = objectMapper.valueToTree(teamMember);
return objectMapper.treeToValue(node, TeamsChannelAccount.class);
} catch (JsonProcessingException jpe) {
// this would be a conversion error.
return null;
}

});
.thenApply(teamMember -> Serialization.convert(teamMember, TeamsChannelAccount.class));
}

private static CompletableFuture<TeamsPagedMembersResult> getPagedMembers(ConnectorClient connectorClient,
Expand Down Expand Up @@ -265,6 +231,13 @@ private static ConnectorClient getConnectorClient(TurnContext turnContext) {
}

private static TeamsConnectorClient getTeamsConnectorClient(TurnContext turnContext) {
// for testing to be able to provide a custom client.
TeamsConnectorClient teamsClient = turnContext.getTurnState()
.get(BotFrameworkAdapter.TEAMSCONNECTOR_CLIENT_KEY);
if (teamsClient != null) {
return teamsClient;
}

ConnectorClient client = getConnectorClient(turnContext);
return new RestTeamsConnectorClient(client.baseUrl(), client.credentials());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.microsoft.bot.builder.teams;

import com.microsoft.bot.builder.InvokeResponse;
import com.microsoft.bot.builder.SimpleAdapter;
import com.microsoft.bot.builder.TurnContext;
import com.microsoft.bot.builder.TurnContextImpl;
import com.microsoft.bot.schema.Activity;
import com.microsoft.bot.schema.ActivityTypes;
import com.microsoft.bot.schema.teams.FileConsentCardResponse;
import com.microsoft.bot.schema.teams.FileUploadInfo;
import com.microsoft.bot.schema.teams.MessagingExtensionAction;
import org.junit.Assert;
import org.junit.Test;

import java.util.List;
import java.util.concurrent.atomic.AtomicReference;

public class TeamsActivityHandlerBadRequestTests {
@Test
public void TestFileConsentBadAction() {
Activity activity = new Activity(ActivityTypes.INVOKE) {{
setName("fileConsent/invoke");
setValue(new FileConsentCardResponse() {{
setAction("this.is.a.bad.action");
setUploadInfo(new FileUploadInfo() {{
setUniqueId("uniqueId");
setFileType("fileType");
setUploadUrl("uploadUrl");
}});
}});
}};

AtomicReference<List<Activity>> activitiesToSend = new AtomicReference<>();

TurnContext turnContext = new TurnContextImpl(
new SimpleAdapter(activitiesToSend::set),
activity
);

TeamsActivityHandler bot = new TeamsActivityHandler();
bot.onTurn(turnContext).join();

Assert.assertNotNull(activitiesToSend.get());
Assert.assertEquals(1, activitiesToSend.get().size());
Assert.assertTrue(activitiesToSend.get().get(0).getValue() instanceof InvokeResponse);
Assert.assertEquals(400, ((InvokeResponse) activitiesToSend.get().get(0).getValue()).getStatus());
}

@Test
public void TestMessagingExtensionSubmitActionPreviewBadAction() {
Activity activity = new Activity(ActivityTypes.INVOKE) {{
setName("composeExtension/submitAction");
setValue(new MessagingExtensionAction() {{
setBotMessagePreviewAction("this.is.a.bad.action");
}});
}};

AtomicReference<List<Activity>> activitiesToSend = new AtomicReference<>();

TurnContext turnContext = new TurnContextImpl(
new SimpleAdapter(activitiesToSend::set),
activity
);

TeamsActivityHandler bot = new TeamsActivityHandler();
bot.onTurn(turnContext).join();

Assert.assertNotNull(activitiesToSend.get());
Assert.assertEquals(1, activitiesToSend.get().size());
Assert.assertTrue(activitiesToSend.get().get(0).getValue() instanceof InvokeResponse);
Assert.assertEquals(400, ((InvokeResponse) activitiesToSend.get().get(0).getValue()).getStatus());
}
}
Loading