// NOTE: To run this test you must have installed the Azure Storage Emulator.
        // You can download it here: https://go.microsoft.com/fwlink/?linkid=717179&clcid=0x409
        // The test will automatically start the emulator.
        public async Task TableLoggerTest()
        {
            var tableName = "TableLoggerTestActivities";
            var account   = CloudStorageAccount.DevelopmentStorageAccount;

            account.CreateCloudTableClient().GetTableReference(tableName).DeleteIfExists();
            var builder = new ContainerBuilder();

            builder.RegisterModule(new TableLoggerModule(account, tableName));
            var container = builder.Build();
            var logger    = container.Resolve <IActivityLogger>();
            var source    = container.Resolve <IActivitySource>();
            var manager   = container.Resolve <IActivityManager>();

            var activities = GetTestActivityList();

            var comparator = new CompareActivity();

            for (var i = 0; i < activities.Count; ++i)
            {
                await logger.LogAsync(activities[i]);

                var oldest = LastActivity.AddSeconds(-30);
                AssertEqual(Filter(activities, oldest: oldest, take: i + 1), source.Activities(DefaultChannel, DefaultConversation, oldest));
            }

            var conversation = Filter(activities);

            AssertEqual(conversation, source.Activities(DefaultChannel, DefaultConversation));
            AssertEqual(Filter(activities, channel: "channel2"), source.Activities("channel2", "conversation1"));
            AssertEqual(Filter(activities, conversation: "conversation2"), source.Activities(DefaultChannel, "conversation2"));

            var transcript = new List <string>();

            foreach (var activity in conversation)
            {
                var msg = activity as IMessageActivity;
                if (msg != null)
                {
                    transcript.Add($"({msg.From.Name} {msg.Timestamp:g})");
                    transcript.Add($"{msg.Text}");
                }
            }
            int j         = 0;
            var botToUser = new Mock <IBotToUser>();

            botToUser
            .Setup(p => p.PostAsync(It.IsAny <IMessageActivity>(), It.IsAny <CancellationToken>()))
            .Returns(Task.CompletedTask)
            .Callback((IMessageActivity activity, CancellationToken cancel) =>
                      Assert.AreEqual(transcript[j++], activity.Text));
            botToUser
            .Setup(p => p.MakeMessage())
            .Returns(new Activity());
            var replay = new ReplayTranscript(botToUser.Object);
            await source.WalkActivitiesAsync(replay.Replay, DefaultChannel, DefaultConversation);

            await manager.DeleteConversationAsync(DefaultChannel, "conversation2");

            Assert.AreEqual(0, source.Activities(DefaultChannel, "conversation2").Count());

            await manager.DeleteConversationAsync("channel2", DefaultConversation);

            Assert.AreEqual(0, source.Activities("channel2", DefaultConversation).Count());

            await manager.DeleteUserActivitiesAsync("user2");

            await source.WalkActivitiesAsync(activity =>
            {
                Assert.IsTrue(activity.From.Id != "user2" && activity.Recipient.Id != "user2");
                return(Task.CompletedTask);
            });

            var purge = LastActivity.AddSeconds(-30.0);
            await manager.DeleteBeforeAsync(purge);

            AssertEqual(Filter(activities, oldest: purge), source.Activities(DefaultChannel, DefaultConversation));
        }