private static async Task LogDeleteActivitesTest(ITranscriptStore transcriptStore)
        {
            var         conversation = TestAdapter.CreateConversation(Guid.NewGuid().ToString("n"));
            TestAdapter adapter      = new TestAdapter(conversation)
                                       .Use(new TranscriptLoggerMiddleware(transcriptStore));
            string activityId = null;

            await new TestFlow(adapter, async(context, cancellationToken) =>
            {
                if (context.Activity.Text == "deleteIt")
                {
                    await context.DeleteActivityAsync(activityId);
                }
                else
                {
                    var activity = context.Activity.CreateReply("response");
                    var response = await context.SendActivityAsync(activity);
                    activityId   = response.Id;
                }
            })
            .Send("foo")
            .AssertReply("response")
            .Send("deleteIt")
            .StartTestAsync();

            await Task.Delay(100);

            var pagedResult = await transcriptStore.GetTranscriptActivitiesAsync(conversation.ChannelId, conversation.Conversation.Id);

            Assert.Equal(3, pagedResult.Items.Length);
            Assert.Equal("foo", pagedResult.Items[0].AsMessageActivity().Text);
            Assert.NotNull(pagedResult.Items[1].AsMessageDeleteActivity());
            Assert.Equal(ActivityTypes.MessageDelete, pagedResult.Items[1].Type);
            Assert.Equal("deleteIt", pagedResult.Items[2].AsMessageActivity().Text);
        }
        public AdapterWithErrorHandler(ITranscriptStore transcriptLogger, IConfiguration configuration, ILogger <BotFrameworkHttpAdapter> logger, ConversationState conversationState = null)
            : base(configuration, logger)
        {
            Use(new TranscriptLoggerMiddleware(transcriptLogger));

            OnTurnError = async(turnContext, exception) =>
            {
                // Log any leaked exception from the application.
                logger.LogError($"Exception caught : {exception.Message}");

                // Send a catch-all apology to the user.
                var errorMessage = MessageFactory.Text(ErrorMsgText, ErrorMsgText, InputHints.ExpectingInput);
                await turnContext.SendActivityAsync(errorMessage);

                if (conversationState != null)
                {
                    try
                    {
                        // Delete the conversationState for the current conversation to prevent the
                        // bot from getting stuck in a error-loop caused by being in a bad state.
                        // ConversationState should be thought of as similar to "cookie-state" in a Web pages.
                        await conversationState.DeleteAsync(turnContext);
                    }
                    catch (Exception e)
                    {
                        logger.LogError($"Exception caught on attempting to Delete ConversationState : {e.Message}");
                    }
                }
            };
        }
        private static async Task TestDateLogUpdateActivitiesTest(ITranscriptStore transcriptStore)
        {
            var dateTimeStartOffset1 = new DateTimeOffset(DateTime.Now);
            var dateTimeStartOffset2 = new DateTimeOffset(DateTime.UtcNow);

            var         conversation = TestAdapter.CreateConversation(Guid.NewGuid().ToString("n"));
            TestAdapter adapter      = new TestAdapter(conversation)
                                       .Use(new TranscriptLoggerMiddleware(transcriptStore));
            Activity activityToUpdate = null;

            await new TestFlow(adapter, async(context, cancellationToken) =>
            {
                if (context.Activity.Text == "update")
                {
                    activityToUpdate.Text = "new response";
                    await context.UpdateActivityAsync(activityToUpdate);
                }
                else
                {
                    var activity = context.Activity.CreateReply("response");

                    var response = await context.SendActivityAsync(activity);
                    activity.Id  = response.Id;

                    // clone the activity, so we can use it to do an update
                    activityToUpdate = JsonConvert.DeserializeObject <Activity>(JsonConvert.SerializeObject(activity));
                }
            })
            .Send("foo")
            .Send("update")
            .AssertReply("new response")
            .StartTestAsync();

            await Task.Delay(100);

            // Perform some queries
            var pagedResult = await transcriptStore.GetTranscriptActivitiesAsync(conversation.ChannelId, conversation.Conversation.Id, null, dateTimeStartOffset1.DateTime);

            Assert.Equal(3, pagedResult.Items.Length);
            Assert.Equal("foo", pagedResult.Items[0].AsMessageActivity().Text);
            Assert.Equal("new response", pagedResult.Items[1].AsMessageActivity().Text);
            Assert.Equal("update", pagedResult.Items[2].AsMessageActivity().Text);

            // Perform some queries
            pagedResult = await transcriptStore.GetTranscriptActivitiesAsync(conversation.ChannelId, conversation.Conversation.Id, null, DateTimeOffset.MinValue);

            Assert.Equal(3, pagedResult.Items.Length);
            Assert.Equal("foo", pagedResult.Items[0].AsMessageActivity().Text);
            Assert.Equal("new response", pagedResult.Items[1].AsMessageActivity().Text);
            Assert.Equal("update", pagedResult.Items[2].AsMessageActivity().Text);

            // Perform some queries
            pagedResult = await transcriptStore.GetTranscriptActivitiesAsync(conversation.ChannelId, conversation.Conversation.Id, null, DateTimeOffset.MaxValue);

            Assert.Empty(pagedResult.Items);
        }
        public static async Task EnsureToLogActivitiesWithIdsTest(ITranscriptStore transcriptStore)
        {
            var conversation = TestAdapter.CreateConversation(Guid.NewGuid().ToString("n"));
            var adapter      = new AllowNullIdTestAdapter(conversation)
                               .Use(new TranscriptLoggerMiddleware(transcriptStore));

            await new TestFlow(adapter, async(context, cancellationToken) =>
            {
                var activityWithId = new Activity
                {
                    Id        = "TestActivityWithId",
                    Text      = "I am an activity with an Id.",
                    Type      = ActivityTypes.Message,
                    RelatesTo = context.Activity.RelatesTo
                };
                var activityWithNullId = new Activity
                {
                    Id        = null,
                    Text      = "My Id is null.",
                    Type      = ActivityTypes.Message,
                    RelatesTo = context.Activity.RelatesTo
                };

                await context.SendActivityAsync(activityWithId);
                await context.SendActivityAsync(activityWithId);

                await context.SendActivityAsync(activityWithNullId);
            })
            .Send("inbound message to TestFlow")
            .AssertReply("I am an activity with an Id.")
            .Send("2nd inbound message to TestFlow")
            .AssertReply((activity) => Assert.AreEqual(activity.Id, "TestActivityWithId"))
            .Send("3rd inbound message to TestFlow")
            .AssertReply("My Id is null.")
            .StartTestAsync();

            await Task.Delay(100);

            var pagedResult = await transcriptStore.GetTranscriptActivitiesAsync(conversation.ChannelId, conversation.Conversation.Id);

            Assert.AreEqual(12, pagedResult.Items.Length);
            Assert.AreEqual("inbound message to TestFlow", pagedResult.Items[0].AsMessageActivity().Text);
            Assert.IsNotNull(pagedResult.Items[1].AsMessageActivity());
            Assert.AreEqual("I am an activity with an Id.", pagedResult.Items[1].AsMessageActivity().Text);
            Assert.AreEqual("2nd inbound message to TestFlow", pagedResult.Items[4].AsMessageActivity().Text);
            Assert.AreEqual("TestActivityWithId", pagedResult.Items[5].Id);
            Assert.AreEqual("3rd inbound message to TestFlow", pagedResult.Items[8].AsMessageActivity().Text);
            Assert.AreEqual("My Id is null.", pagedResult.Items[11].AsMessageActivity().Text);
            Assert.IsTrue(pagedResult.Items[11].AsMessageActivity().Id.Contains("g_"));
            foreach (var activity in pagedResult.Items)
            {
                Assert.IsTrue(activity.Timestamp > default(DateTimeOffset));
            }
        }
        public void Initialize()
        {
            // Get elasticsearch configuration from external file.
            var config = new ConfigurationBuilder()
                         .AddJsonFile("elasticsearchsettings.json")
                         .Build();

            var elasticsearchTranscriptStoreOptions = new ElasticsearchTranscriptStoreOptions
            {
                ElasticsearchEndpoint = new Uri(config["Endpoint"]),
                UserName  = config["UserName"],
                Password  = config["Password"],
                IndexName = config["IndexName"]
            };

            elasticsearchEndpoint = config["Endpoint"];

            transcriptStore = new ElasticsearchTranscriptStore(elasticsearchTranscriptStoreOptions);
        }
        private static async Task LogActivitiesTest(ITranscriptStore transcriptStore)
        {
            var         conversation = TestAdapter.CreateConversation(Guid.NewGuid().ToString("n"));
            TestAdapter adapter      = new TestAdapter(conversation)
                                       .Use(new TranscriptLoggerMiddleware(transcriptStore));

            await new TestFlow(adapter, async(context, cancellationToken) =>
            {
                var typingActivity = new Activity
                {
                    Type      = ActivityTypes.Typing,
                    RelatesTo = context.Activity.RelatesTo
                };
                await context.SendActivityAsync(typingActivity);
                await Task.Delay(50);
                await context.SendActivityAsync("echo:" + context.Activity.Text);
            })
            .Send("foo")
            .AssertReply((activity) => Assert.Equal(activity.Type, ActivityTypes.Typing))
            .AssertReply("echo:foo")
            .Send("bar")
            .AssertReply((activity) => Assert.Equal(activity.Type, ActivityTypes.Typing))
            .AssertReply("echo:bar")
            .StartTestAsync();

            await Task.Delay(100);

            var pagedResult = await transcriptStore.GetTranscriptActivitiesAsync(conversation.ChannelId, conversation.Conversation.Id);

            Assert.Equal(6, pagedResult.Items.Length);
            Assert.Equal("foo", pagedResult.Items[0].AsMessageActivity().Text);
            Assert.NotNull(pagedResult.Items[1].AsTypingActivity());
            Assert.Equal("echo:foo", pagedResult.Items[2].AsMessageActivity().Text);
            Assert.Equal("bar", pagedResult.Items[3].AsMessageActivity().Text);
            Assert.NotNull(pagedResult.Items[4].AsTypingActivity());
            Assert.Equal("echo:bar", pagedResult.Items[5].AsMessageActivity().Text);
            foreach (var activity in pagedResult.Items)
            {
                Assert.True(!string.IsNullOrWhiteSpace(activity.Id));
                Assert.True(activity.Timestamp > default(DateTimeOffset));
            }
        }