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);
        }
Exemple #4
0
        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);
        }
Exemple #12
0
 /// <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;
 }