public async Task Transcript_LogActivities()
        {
            var         transcriptStore = new MemoryTranscriptStore();
            TestAdapter adapter         = new TestAdapter()
                                          .Use(new TranscriptLoggerMiddleware(transcriptStore));
            string conversationId = null;

            await new TestFlow(adapter, async(context) =>
            {
                conversationId     = context.Activity.Conversation.Id;
                var typingActivity = new Activity
                {
                    Type      = ActivityTypes.Typing,
                    RelatesTo = context.Activity.RelatesTo
                };
                await context.SendActivity(typingActivity);
                await Task.Delay(500);
                await context.SendActivity("echo:" + context.Activity.Text);
            })
            .Send("foo")
            .AssertReply((activity) => Assert.AreEqual(activity.Type, ActivityTypes.Typing))
            .AssertReply("echo:foo")
            .Send("bar")
            .AssertReply((activity) => Assert.AreEqual(activity.Type, ActivityTypes.Typing))
            .AssertReply("echo:bar")
            .StartTest();

            var pagedResult = await transcriptStore.GetTranscriptActivities("test", conversationId);

            Assert.AreEqual(6, pagedResult.Items.Length);
            Assert.AreEqual("foo", pagedResult.Items[0].AsMessageActivity().Text);
            Assert.IsNotNull(pagedResult.Items[1].AsTypingActivity());
            Assert.AreEqual("echo:foo", pagedResult.Items[2].AsMessageActivity().Text);
            Assert.AreEqual("bar", pagedResult.Items[3].AsMessageActivity().Text);
            Assert.IsNotNull(pagedResult.Items[4].AsTypingActivity());
            Assert.AreEqual("echo:bar", pagedResult.Items[5].AsMessageActivity().Text);
            foreach (var activity in pagedResult.Items)
            {
                Assert.IsTrue(!String.IsNullOrWhiteSpace(activity.Id));
                Assert.IsTrue(activity.Timestamp > default(DateTime));
            }
        }
        public async Task Transcript_LogUpdateActivities()
        {
            var         transcriptStore = new MemoryTranscriptStore();
            TestAdapter adapter         = new TestAdapter()
                                          .Use(new TranscriptLoggerMiddleware(transcriptStore));
            string   conversationId   = null;
            Activity activityToUpdate = null;

            await new TestFlow(adapter, async(context) =>
            {
                conversationId = context.Activity.Conversation.Id;
                if (context.Activity.Text == "update")
                {
                    activityToUpdate.Text = "new response";
                    await context.UpdateActivity(activityToUpdate);
                }
                else
                {
                    var activity = context.Activity.CreateReply("response");
                    var response = await context.SendActivity(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")
            .StartTest();
            await Task.Delay(500);

            var pagedResult = await transcriptStore.GetTranscriptActivities("test", conversationId);

            Assert.AreEqual(4, pagedResult.Items.Length);
            Assert.AreEqual("foo", pagedResult.Items[0].AsMessageActivity().Text);
            Assert.AreEqual("response", pagedResult.Items[1].AsMessageActivity().Text);
            Assert.AreEqual("new response", pagedResult.Items[2].AsMessageUpdateActivity().Text);
            Assert.AreEqual("update", pagedResult.Items[3].AsMessageActivity().Text);
            Assert.AreEqual(pagedResult.Items[1].Id, pagedResult.Items[2].Id);
        }
        public async Task Transcript_LogDeleteActivities()
        {
            var         transcriptStore = new MemoryTranscriptStore();
            TestAdapter adapter         = new TestAdapter()
                                          .Use(new TranscriptLoggerMiddleware(transcriptStore));
            string conversationId = null;
            string activityId     = null;

            await new TestFlow(adapter, async(context) =>
            {
                conversationId = context.Activity.Conversation.Id;
                if (context.Activity.Text == "deleteIt")
                {
                    await context.DeleteActivity(activityId);
                }
                else
                {
                    var activity = context.Activity.CreateReply("response");
                    var response = await context.SendActivity(activity);
                    activityId   = response.Id;
                }
            })
            .Send("foo")
            .AssertReply("response")
            .Send("deleteIt")
            .StartTest();
            await Task.Delay(500);

            var pagedResult = await transcriptStore.GetTranscriptActivities("test", conversationId);

            Assert.AreEqual(4, pagedResult.Items.Length);
            Assert.AreEqual("foo", pagedResult.Items[0].AsMessageActivity().Text);
            Assert.AreEqual("response", pagedResult.Items[1].AsMessageActivity().Text);
            Assert.AreEqual("deleteIt", pagedResult.Items[2].AsMessageActivity().Text);
            Assert.AreEqual(ActivityTypes.MessageDelete, pagedResult.Items[3].Type);
            Assert.AreEqual(pagedResult.Items[1].Id, pagedResult.Items[3].Id);
        }