Skip to content

Commit

Permalink
Add unit tests for BotBuilder/SharePoint
Browse files Browse the repository at this point in the history
  • Loading branch information
ceciliaavila committed Feb 11, 2025
1 parent 048f474 commit 9e7ce1a
Show file tree
Hide file tree
Showing 3 changed files with 424 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Threading;
using System.Threading.Tasks;
Expand Down Expand Up @@ -95,7 +96,7 @@ private async Task<bool> DeduplicatedTokenExchangeIdAsync(ITurnContext turnConte
// Create a StoreItem with Etag of the unique 'signin/tokenExchange' request
var storeItem = new TokenStoreItem
{
ETag = ProtocolJsonSerializer.ToObject<JsonObject>(turnContext.Activity.Value)["id"].ToString(),
ETag = ProtocolJsonSerializer.ToJsonElements(turnContext.Activity.Value)["id"].ToString(),
};

var storeItems = new Dictionary<string, object> { { TokenStoreItem.GetStorageKey(turnContext), storeItem } };
Expand Down Expand Up @@ -149,7 +150,7 @@ private async Task<bool> ExchangedTokenAsync(ITurnContext turnContext, Cancellat
turnContext.Activity.From.Id,
_oAuthConnectionName,
turnContext.Activity.ChannelId,
new TokenExchangeRequest { Token = aceRequest.Data as string },
new TokenExchangeRequest { Token = ((JsonElement)aceRequest.Data).GetString() },
cancellationToken).ConfigureAwait(false);
}
else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,45 @@
using Microsoft.Agents.BotBuilder.SharePoint;
using Microsoft.Agents.Core.Interfaces;
using Microsoft.Agents.Core.SharePoint.Models;
using System;

namespace Microsoft.Agents.BotBuilder.Tests.SharePoint
{
public class SharePointActivityHandlerTests
{
private IActivity[] _activitiesToSend = null;

public SharePointActivityHandlerTests()
{
_activitiesToSend = null;
}

void CaptureSend(IActivity[] arg)
{
_activitiesToSend = arg;
}

[Fact]
public async Task OnInvokeActivityAsync_ShouldThrowOnNullActivityName()
{
// Arrange
var activity = new Activity
{
Type = ActivityTypes.Invoke,
Value = new JsonObject()
};

var turnContext = new TurnContext(new SimpleAdapter(CaptureSend), activity);

// Act
var bot = new TestActivityHandler();

// Assert
await Assert.ThrowsAsync<NotSupportedException>(() => ((IBot)bot).OnTurnAsync(turnContext));
}

[Fact]
public async Task TestSharePointGetCardViewAction()
public async Task OnInvokeActivityAsync_ShouldCatchInvokeResponseException()
{
// Arrange
var activity = new Activity
Expand All @@ -27,11 +59,78 @@ public async Task TestSharePointGetCardViewAction()
Value = new JsonObject()
};

IActivity[] activitiesToSend = null;
void CaptureSend(IActivity[] arg)
var turnContext = new TurnContext(new SimpleAdapter(CaptureSend), activity);

// Act
var bot = new ErrorActivityHandler();
await ((IBot)bot).OnTurnAsync(turnContext);

// Assert
Assert.NotNull(_activitiesToSend);
Assert.Single(_activitiesToSend);
Assert.IsType<InvokeResponse>(_activitiesToSend[0].Value);
Assert.Equal(501, ((InvokeResponse)_activitiesToSend[0].Value).Status);
Assert.Null(((InvokeResponse)_activitiesToSend[0].Value).Body);
}

[Fact]
public async Task OnInvokeActivityAsync_ShouldCatchBadRequestError()
{
// Arrange
var activity = new Activity
{
activitiesToSend = arg;
}
Type = ActivityTypes.Invoke,
Name = "cardExtension/getCardView",
Value = 1
};

var turnContext = new TurnContext(new SimpleAdapter(CaptureSend), activity);

// Act
var bot = new TestActivityHandler();
await ((IBot)bot).OnTurnAsync(turnContext);

// Assert
Assert.NotNull(_activitiesToSend);
Assert.Single(_activitiesToSend);
Assert.IsType<InvokeResponse>(_activitiesToSend[0].Value);
Assert.Equal(400, ((InvokeResponse)_activitiesToSend[0].Value).Status);
}

[Fact]
public async Task OnInvokeActivityAsync_ShouldCatchInternalServerError()
{
// Arrange
var activity = new Activity
{
Type = ActivityTypes.Invoke,
Name = "cardExtension/setPropertyPaneConfiguration",
Value = new JsonObject()
};

var turnContext = new TurnContext(new SimpleAdapter(CaptureSend), activity);

// Act
var bot = new ErrorActivityHandler();
await ((IBot)bot).OnTurnAsync(turnContext);

// Assert
Assert.NotNull(_activitiesToSend);
Assert.Single(_activitiesToSend);
Assert.IsType<InvokeResponse>(_activitiesToSend[0].Value);
Assert.Equal(500, ((InvokeResponse)_activitiesToSend[0].Value).Status);
}

[Fact]
public async Task OnSharePointTaskGetCardViewAsync_ShouldBeCalled()
{
// Arrange
var activity = new Activity
{
Type = ActivityTypes.Invoke,
Name = "cardExtension/getCardView",
Value = new JsonObject()
};

var turnContext = new TurnContext(new SimpleAdapter(CaptureSend), activity);

Expand All @@ -42,14 +141,14 @@ void CaptureSend(IActivity[] arg)
// Assert
Assert.Single(bot.Record);
Assert.Equal("OnSharePointTaskGetCardViewAsync", bot.Record[0]);
Assert.NotNull(activitiesToSend);
Assert.Single(activitiesToSend);
Assert.IsType<InvokeResponse>(activitiesToSend[0].Value);
Assert.Equal(200, ((InvokeResponse)activitiesToSend[0].Value).Status);
Assert.NotNull(_activitiesToSend);
Assert.Single(_activitiesToSend);
Assert.IsType<InvokeResponse>(_activitiesToSend[0].Value);
Assert.Equal(200, ((InvokeResponse)_activitiesToSend[0].Value).Status);
}

[Fact]
public async Task TestSharePointGetQuickViewAction()
public async Task OnSharePointTaskGetQuickViewAsync_ShouldBeCalled()
{
// Arrange
var activity = new Activity
Expand All @@ -59,12 +158,6 @@ public async Task TestSharePointGetQuickViewAction()
Value = new JsonObject()
};

IActivity[] activitiesToSend = null;
void CaptureSend(IActivity[] arg)
{
activitiesToSend = arg;
}

var turnContext = new TurnContext(new SimpleAdapter(CaptureSend), activity);

// Act
Expand All @@ -74,14 +167,14 @@ void CaptureSend(IActivity[] arg)
// Assert
Assert.Single(bot.Record);
Assert.Equal("OnSharePointTaskGetQuickViewAsync", bot.Record[0]);
Assert.NotNull(activitiesToSend);
Assert.Single(activitiesToSend);
Assert.IsType<InvokeResponse>(activitiesToSend[0].Value);
Assert.Equal(200, ((InvokeResponse)activitiesToSend[0].Value).Status);
Assert.NotNull(_activitiesToSend);
Assert.Single(_activitiesToSend);
Assert.IsType<InvokeResponse>(_activitiesToSend[0].Value);
Assert.Equal(200, ((InvokeResponse)_activitiesToSend[0].Value).Status);
}

[Fact]
public async Task TestSharePointGetPropertyPaneConfigurationAction()
public async Task OnSharePointTaskGetPropertyPaneConfigurationAsync_ShouldBeCalled()
{
// Arrange
var activity = new Activity
Expand All @@ -91,12 +184,6 @@ public async Task TestSharePointGetPropertyPaneConfigurationAction()
Value = new JsonObject()
};

IActivity[] activitiesToSend = null;
void CaptureSend(IActivity[] arg)
{
activitiesToSend = arg;
}

var turnContext = new TurnContext(new SimpleAdapter(CaptureSend), activity);

// Act
Expand All @@ -106,14 +193,14 @@ void CaptureSend(IActivity[] arg)
// Assert
Assert.Single(bot.Record);
Assert.Equal("OnSharePointTaskGetPropertyPaneConfigurationAsync", bot.Record[0]);
Assert.NotNull(activitiesToSend);
Assert.Single(activitiesToSend);
Assert.IsType<InvokeResponse>(activitiesToSend[0].Value);
Assert.Equal(200, ((InvokeResponse)activitiesToSend[0].Value).Status);
Assert.NotNull(_activitiesToSend);
Assert.Single(_activitiesToSend);
Assert.IsType<InvokeResponse>(_activitiesToSend[0].Value);
Assert.Equal(200, ((InvokeResponse)_activitiesToSend[0].Value).Status);
}

[Fact]
public async Task TestSharePointSetPropertyPaneConfigurationAction()
public async Task OnSharePointTaskSetPropertyPaneConfigurationAsync_ShouldBeCalled()
{
// Arrange
var activity = new Activity
Expand All @@ -123,12 +210,6 @@ public async Task TestSharePointSetPropertyPaneConfigurationAction()
Value = new JsonObject()
};

IActivity[] activitiesToSend = null;
void CaptureSend(IActivity[] arg)
{
activitiesToSend = arg;
}

var turnContext = new TurnContext(new SimpleAdapter(CaptureSend), activity);

// Act
Expand All @@ -138,14 +219,14 @@ void CaptureSend(IActivity[] arg)
// Assert
Assert.Single(bot.Record);
Assert.Equal("OnSharePointTaskSetPropertyPaneConfigurationAsync", bot.Record[0]);
Assert.NotNull(activitiesToSend);
Assert.Single(activitiesToSend);
Assert.IsType<InvokeResponse>(activitiesToSend[0].Value);
Assert.Equal(200, ((InvokeResponse)activitiesToSend[0].Value).Status);
Assert.NotNull(_activitiesToSend);
Assert.Single(_activitiesToSend);
Assert.IsType<InvokeResponse>(_activitiesToSend[0].Value);
Assert.Equal(200, ((InvokeResponse)_activitiesToSend[0].Value).Status);
}

[Fact]
public async Task TestSharePointHandleActionAction()
public async Task OnSharePointTaskHandleActionAsync_ShouldBeCalled()
{
// Arrange
var activity = new Activity
Expand All @@ -155,11 +236,31 @@ public async Task TestSharePointHandleActionAction()
Value = new JsonObject()
};

IActivity[] activitiesToSend = null;
void CaptureSend(IActivity[] arg)
var turnContext = new TurnContext(new SimpleAdapter(CaptureSend), activity);

// Act
var bot = new TestActivityHandler();
await ((IBot)bot).OnTurnAsync(turnContext);

// Assert
Assert.Single(bot.Record);
Assert.Equal("OnSharePointTaskHandleActionAsync", bot.Record[0]);
Assert.NotNull(_activitiesToSend);
Assert.Single(_activitiesToSend);
Assert.IsType<InvokeResponse>(_activitiesToSend[0].Value);
Assert.Equal(200, ((InvokeResponse)_activitiesToSend[0].Value).Status);
}

[Fact]
public async Task OnSignInInvokeAsync_ShouldBeCalled()
{
// Arrange
var activity = new Activity
{
activitiesToSend = arg;
}
Type = ActivityTypes.Invoke,
Name = "cardExtension/token",
Value = new JsonObject()
};

var turnContext = new TurnContext(new SimpleAdapter(CaptureSend), activity);

Expand All @@ -169,16 +270,16 @@ void CaptureSend(IActivity[] arg)

// Assert
Assert.Single(bot.Record);
Assert.Equal("OnSharePointTaskHandleActionAsync", bot.Record[0]);
Assert.NotNull(activitiesToSend);
Assert.Single(activitiesToSend);
Assert.IsType<InvokeResponse>(activitiesToSend[0].Value);
Assert.Equal(200, ((InvokeResponse)activitiesToSend[0].Value).Status);
Assert.Equal("OnSignInInvokeAsync", bot.Record[0]);
Assert.NotNull(_activitiesToSend);
Assert.Single(_activitiesToSend);
Assert.IsType<InvokeResponse>(_activitiesToSend[0].Value);
Assert.Equal(200, ((InvokeResponse)_activitiesToSend[0].Value).Status);
}

private class TestActivityHandler : SharePointActivityHandler
{
public List<string> Record { get; } = new List<string>();
public List<string> Record { get; } = [];

// Invoke
protected override Task<CardViewResponse> OnSharePointTaskGetCardViewAsync(ITurnContext<IInvokeActivity> turnContext, AceRequest aceRequest, CancellationToken cancellationToken)
Expand Down Expand Up @@ -210,6 +311,23 @@ protected override Task<BaseHandleActionResponse> OnSharePointTaskHandleActionAs
Record.Add(MethodBase.GetCurrentMethod().Name);
return Task.FromResult<BaseHandleActionResponse>(new NoOpHandleActionResponse());
}

protected override Task OnSignInInvokeAsync(ITurnContext<IInvokeActivity> turnContext, CancellationToken cancellationToken)
{
Record.Add(MethodBase.GetCurrentMethod().Name);
return Task.FromResult(true);
}
}

private class ErrorActivityHandler : SharePointActivityHandler
{
public List<string> Record { get; } = [];

protected override Task<BaseHandleActionResponse> OnSharePointTaskSetPropertyPaneConfigurationAsync(ITurnContext<IInvokeActivity> turnContext, AceRequest aceRequest, CancellationToken cancellationToken)
{
Record.Add(MethodBase.GetCurrentMethod().Name);
return Task.FromResult<BaseHandleActionResponse>(new QuickViewHandleActionResponse());
}
}
}
}
Loading

0 comments on commit 9e7ce1a

Please sign in to comment.