public async Task VerifyWebhookAsync_MissingHubChallenge_ReturnsBadRequest() { // Arrange var request = new Mock <HttpRequest>(); var response = new Mock <HttpResponse>(); string webhookChallengeCode = "5af96abed0b2fc27a017bf5a7e961dd9"; string webhookToken = "abc123"; request.Setup(x => x.QueryString).Returns(QueryString.FromUriComponent($"?hub.mode=subscribe&hub.verify_token={webhookToken}")); response.Setup(x => x.Body).Returns(new MemoryStream()); var mockOptions = new RingCentralOptions() { RingCentralEngageApiAccessToken = "abc", RingCentralEngageApiUrl = "http://localhost", BotId = "testbot", RingCentralEngageWebhookValidationToken = "incorrect_token" }; var sut = new RingCentralClientWrapper(OptionsHelper.GetOptionsMonitor(mockOptions), new StaticHandoffRequestRecognizer()); // Act await sut.VerifyWebhookAsync(request.Object, response.Object, It.IsAny <CancellationToken>()); response.Object.Body.Position = 0; using var sr = new StreamReader(response.Object.Body); var responseBody = sr.ReadToEnd(); // Assert Assert.NotEqual(webhookChallengeCode, responseBody); response.VerifySet(x => x.StatusCode = StatusCodes.Status400BadRequest); }
public async Task GetActivityFromRingCentralRequestAsync_WhatsAppContentImportedMissingBodyText_ReturnsUnknownEventAndNullActivity(string jsonFile) { // Arrange var request = new Mock <HttpRequest>(); var response = new Mock <HttpResponse>(); var ringCentralRequest = GetEmbeddedTestData($"{GetType().Namespace}.TestData.{jsonFile}"); using var ms = new MemoryStream(); using var sw = new StreamWriter(ms); sw.Write(ringCentralRequest); sw.Flush(); ms.Position = 0; request.Setup(x => x.Body).Returns(ms); request.Setup(x => x.Path).Returns(PathString.FromUriComponent("/contentimport")); response.Setup(x => x.Body).Returns(new MemoryStream()); var mockOptions = new RingCentralOptions() { RingCentralEngageApiAccessToken = "abc", RingCentralEngageApiUrl = "http://localhost", BotId = "testbot", RingCentralEngageBotControlledThreadCategoryId = "botcontrolled" }; var mockRingCentralClient = new Mock <DimeloClient>(); var sut = new RingCentralClientWrapper(OptionsHelper.GetOptionsMonitor(mockOptions), new StaticHandoffRequestRecognizer()); var mockBotAdapter = new Mock <IBotFrameworkHttpAdapter>().Object; var adapter = new RingCentralAdapter(sut, mockBotAdapter, new StaticHandoffRequestRecognizer()); // Act var(ringCentralWebhook, activity) = await sut.GetActivityFromRingCentralRequestAsync(adapter, mockBotAdapter, request.Object, response.Object); // Assert Assert.Equal(RingCentralHandledEvent.Unknown, ringCentralWebhook); Assert.Null(activity); response.VerifySet(x => x.StatusCode = StatusCodes.Status204NoContent); }
public async Task GetActivityFromRingCentralRequestAsync_ImplementationInfoRequest_ReturnsActionAndNullActivity(string jsonFile) { // Arrange var request = new Mock <HttpRequest>(); var response = new DefaultHttpContext().Response; response.Body = new MemoryStream(); var ringCentralRequest = GetEmbeddedTestData($"{GetType().Namespace}.TestData.{jsonFile}"); using var ms = new MemoryStream(); using var sw = new StreamWriter(ms); sw.Write(ringCentralRequest); sw.Flush(); ms.Position = 0; request.Setup(x => x.Body).Returns(ms); request.Setup(x => x.Path).Returns(PathString.FromUriComponent("/action")); var mockOptions = new RingCentralOptions() { RingCentralEngageApiAccessToken = "abc", RingCentralEngageApiUrl = "http://localhost", BotId = "testbot" }; var sut = new RingCentralClientWrapper(OptionsHelper.GetOptionsMonitor(mockOptions), new StaticHandoffRequestRecognizer()); var mockBotAdapter = new Mock <IBotFrameworkHttpAdapter>().Object; var adapter = new RingCentralAdapter(sut, mockBotAdapter, new StaticHandoffRequestRecognizer()); // Act var(ringCentralWebhook, activity) = await sut.GetActivityFromRingCentralRequestAsync(adapter, mockBotAdapter, request.Object, response); // Assert Assert.Equal(RingCentralHandledEvent.Action, ringCentralWebhook); Assert.Null(activity); Assert.Equal(StatusCodes.Status200OK, response.StatusCode); }
public RingCentralAdapterWithErrorHandler( IBotFrameworkHttpAdapter botAdapter, RingCentralClientWrapper ringCentralClient, DownRenderingMiddleware downRenderingMiddleware, IHandoffRequestRecognizer handoffRequestRecognizer, ILogger <RingCentralAdapter> logger) : base(ringCentralClient, botAdapter, handoffRequestRecognizer, logger) { _ = downRenderingMiddleware ?? throw new NullReferenceException(nameof(downRenderingMiddleware)); // Downrender outbound messages processed by the adapter Use(downRenderingMiddleware); OnTurnError = async(turnContext, exception) => { // Log any leaked exception from the application. logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}"); // Send a message to the user await turnContext.SendActivityAsync("The bot encountered an error or bug."); await turnContext.SendActivityAsync("To continue to run this bot, please fix the bot source code."); // Send a trace activity, which will be displayed in the Bot Framework Emulator await turnContext.TraceActivityAsync("OnTurnError Trace", exception.Message, "https://www.botframework.com/schemas/error", "TurnError"); }; }
public async Task GetActivityFromRingCentralRequestAsync_UnspecificSourceRequest_ReturnsContentImportedAndUnspecificChannelId(string jsonFile) { // Arrange var request = new Mock <HttpRequest>(); var response = new DefaultHttpContext().Response; response.Body = new MemoryStream(); var ringCentralRequest = GetEmbeddedTestData($"{GetType().Namespace}.TestData.{jsonFile}"); using var ms = new MemoryStream(); using var sw = new StreamWriter(ms); sw.Write(ringCentralRequest); sw.Flush(); ms.Position = 0; request.Setup(x => x.Body).Returns(ms); request.Setup(x => x.Path).Returns(PathString.FromUriComponent("/contentimport")); var mockOptions = new RingCentralOptions() { RingCentralEngageApiAccessToken = "abc", RingCentralEngageApiUrl = "http://localhost", BotId = "testbot", RingCentralEngageBotControlledThreadCategoryId = "botcontrolled" }; var mockRingCentralClient = new Mock <DimeloClient>(); var sut = new RingCentralClientWrapper(OptionsHelper.GetOptionsMonitor(mockOptions), new StaticHandoffRequestRecognizer()); var mockBotAdapter = new Mock <IBotFrameworkHttpAdapter>().Object; var adapter = new RingCentralAdapter(sut, mockBotAdapter, new StaticHandoffRequestRecognizer()); // Act var(ringCentralWebhook, activity) = await sut.GetActivityFromRingCentralRequestAsync(adapter, mockBotAdapter, request.Object, response); // Assert Assert.Equal(RingCentralHandledEvent.ContentImported, ringCentralWebhook); Assert.Equal(RingCentralChannels.Unspecific, activity.ChannelId); }
public void ConstructorShouldFailWithNullBotAdapter() { RingCentralClientWrapper rcw = null; IBotFrameworkHttpAdapter botAdapter = null; Assert.Throws <ArgumentNullException>(() => { new RingCentralAdapter(rcw, botAdapter, new StaticHandoffRequestRecognizer()); }); }
public async void DeleteActivityAsyncShouldThrowNotSupportedException() { // Arrange var mockBotAdapter = new Mock <IBotFrameworkHttpAdapter>().Object; var mockOptions = new RingCentralOptions() { RingCentralEngageApiAccessToken = "1111", RingCentralEngageApiUrl = "http://someurl.com", BotId = "testbot" }; var rcw = new RingCentralClientWrapper(OptionsHelper.GetOptionsMonitor(mockOptions), new StaticHandoffRequestRecognizer()); var adapter = new RingCentralAdapter(rcw, mockBotAdapter, new StaticHandoffRequestRecognizer()); var activity = new Activity(); var conversationReference = new ConversationReference(); // Act using (var turnContext = new TurnContext(adapter, activity)) { // Assert await Assert.ThrowsAsync <NotImplementedException>(async() => { await adapter.DeleteActivityAsync(turnContext, conversationReference, default); }); } }
public void ConstructorWithAdapterApiWrapperSucceeds() { // Arrange var mockBotAdapter = new Mock <IBotFrameworkHttpAdapter>().Object; var mockOptions = new RingCentralOptions() { RingCentralEngageApiAccessToken = "1111", RingCentralEngageApiUrl = "http://someurl.com", BotId = "testbot" }; var rcw = new RingCentralClientWrapper(OptionsHelper.GetOptionsMonitor(mockOptions), new StaticHandoffRequestRecognizer()); // Act var sut = new RingCentralAdapter(rcw, mockBotAdapter, new StaticHandoffRequestRecognizer()); // Assert Assert.NotNull(sut); }
public async void ProcessAsyncShouldFailWithNullBot() { // Arrange var mockBotAdapter = new Mock <IBotFrameworkHttpAdapter>().Object; var mockOptions = new RingCentralOptions() { RingCentralEngageApiAccessToken = "1111", RingCentralEngageApiUrl = "http://someurl.com", BotId = "testbot" }; var rcw = new RingCentralClientWrapper(OptionsHelper.GetOptionsMonitor(mockOptions), new StaticHandoffRequestRecognizer()); var adapter = new RingCentralAdapter(rcw, mockBotAdapter, new StaticHandoffRequestRecognizer()); var httpRequest = new Mock <HttpRequest>(); var httpResponse = new Mock <HttpResponse>(); // Act & Assert await Assert.ThrowsAsync <ArgumentNullException>(async() => { await adapter.ProcessAsync(httpRequest.Object, httpResponse.Object, null, default); }); }
public async Task GetActivityFromRingCentralRequestAsync_ActionRequest_ReturnsActionAndActivityText(string jsonFile, string expectedMessage) { // Arrange var request = new Mock <HttpRequest>(); var response = new DefaultHttpContext().Response; response.Body = new MemoryStream(); var ringCentralRequest = GetEmbeddedTestData($"{GetType().Namespace}.TestData.{jsonFile}"); using var ms = new MemoryStream(); using var sw = new StreamWriter(ms); sw.Write(ringCentralRequest); sw.Flush(); ms.Position = 0; request.Setup(x => x.Body).Returns(ms); request.Setup(x => x.Path).Returns(PathString.FromUriComponent("/action")); var mockOptions = new RingCentralOptions() { RingCentralEngageApiAccessToken = "abc", RingCentralEngageApiUrl = "http://localhost", BotId = "testbot", MicrosoftAppId = "appId" }; var sut = new RingCentralClientWrapper(OptionsHelper.GetOptionsMonitor(mockOptions), new StaticHandoffRequestRecognizer()); var mockBotAdapter = new Mock <IBotFrameworkHttpAdapter>(); mockBotAdapter.As <IAdapterIntegration>().Setup(x => x.ContinueConversationAsync(mockOptions.BotId, new ConversationReference(), null, default)).Returns(Task.CompletedTask); mockBotAdapter.Verify(); var adapter = new RingCentralAdapter(sut, mockBotAdapter.Object, new StaticHandoffRequestRecognizer()); // Act var(ringCentralWebhook, activity) = await sut.GetActivityFromRingCentralRequestAsync(adapter, mockBotAdapter.Object, request.Object, response); // Assert Assert.Equal(RingCentralHandledEvent.Action, ringCentralWebhook); Assert.Equal(expectedMessage, activity.Text); Assert.Equal(StatusCodes.Status200OK, response.StatusCode); }
public async Task GetActivityFromRingCentralRequestAsync_WhatsAppRequest_ReturnsContentImported(string jsonFile, string expectedMessage) { // Arrange var request = new Mock <HttpRequest>(); var response = new DefaultHttpContext().Response; response.Body = new MemoryStream(); var ringCentralRequest = GetEmbeddedTestData($"{GetType().Namespace}.TestData.{jsonFile}"); using var ms = new MemoryStream(); using var sw = new StreamWriter(ms); sw.Write(ringCentralRequest); sw.Flush(); ms.Position = 0; request.Setup(x => x.Body).Returns(ms); request.Setup(x => x.Path).Returns(PathString.FromUriComponent("/contentimport")); var mockOptions = new RingCentralOptions() { RingCentralEngageApiAccessToken = PROPERAPIACCESSKEYFORMANUALTESTS, RingCentralEngageApiUrl = PROPERENGAGEURLFORMANUALTEST, BotId = "testbot", RingCentralEngageBotControlledThreadCategoryId = "botcontrolled" }; var sut = new RingCentralClientWrapper(OptionsHelper.GetOptionsMonitor(mockOptions), new StaticHandoffRequestRecognizer()); var mockBotAdapter = new Mock <IBotFrameworkHttpAdapter>().Object; var adapter = new RingCentralAdapter(sut, mockBotAdapter, new StaticHandoffRequestRecognizer()); // Act var(ringCentralWebhook, activity) = await sut.GetActivityFromRingCentralRequestAsync(adapter, mockBotAdapter, request.Object, response); // Assert Assert.Equal(RingCentralHandledEvent.ContentImported, ringCentralWebhook); Assert.Equal(expectedMessage, activity.Text); Assert.Equal(StatusCodes.Status200OK, response.StatusCode); }
/// <summary> /// Initializes a new instance of the <see cref="ActivityPublishingMiddleware"/> class. /// Creates a new <see cref="ActivityPublishingMiddleware"/>. /// </summary> /// <param name="ringCentralClient">Client that is used to publish the activities to the RingCentral platform.</param> /// <param name="handoffRequestRecognizer">Analyzer to detect a handoff request.</param> /// <param name="logger">Optional logger.</param> public ActivityPublishingMiddleware(RingCentralClientWrapper ringCentralClient, IHandoffRequestRecognizer handoffRequestRecognizer, ILogger logger = null) { _ringCentralClient = ringCentralClient ?? throw new ArgumentNullException(nameof(ringCentralClient)); _handoffRequestRecognizer = handoffRequestRecognizer ?? throw new ArgumentNullException(nameof(handoffRequestRecognizer)); _logger = logger ?? NullLogger.Instance; }