public void PostUserDescription() {
            var container = AppBuilder.CreateContainer();
            using (WebApp.Start(Settings.Current.BaseURL, app => AppBuilder.BuildWithContainer(app, container, false))) {
                const string referenceId = "fda94ff32921425ebb08b73df1d1d34c";

                var statsCounter = container.GetInstance<IAppStatsClient>() as InMemoryAppStatsClient;
                Assert.NotNull(statsCounter);

                EnsureSampleData(container);

                var events = new List<Event> { new Event { Message = "Testing", ReferenceId = referenceId } };
                var configuration = GetClient().Configuration;
                var serializer = new DefaultJsonSerializer();

                var client = new DefaultSubmissionClient();
                var description = new UserDescription { EmailAddress = "*****@*****.**", Description = "Some description." };
                var response = client.PostUserDescription(referenceId, description, configuration, serializer);
                Assert.True(response.Success, response.Message);
                Assert.Null(response.Message);

                response = client.PostEvents(events, configuration, serializer);
                Assert.True(response.Success, response.Message);
                Assert.Null(response.Message);

                statsCounter.WaitForCounter(StatNames.EventsUserDescriptionProcessed, 1);

                var eventRepository = container.GetInstance<IEventRepository>();
                var ev = eventRepository.GetByReferenceId("537650f3b77efe23a47914f4", referenceId).FirstOrDefault();
                Assert.NotNull(ev);
                Assert.NotNull(ev.GetUserDescription());
                Assert.Equal(description.ToJson(), ev.GetUserDescription().ToJson());

                Assert.Equal(0, statsCounter.GetCount(StatNames.EventsUserDescriptionErrors));
                response = client.PostUserDescription(referenceId + 1, description, configuration, serializer);
                Assert.True(response.Success, response.Message);
                Assert.Null(response.Message);

                statsCounter.WaitForCounter(StatNames.EventsUserDescriptionErrors, 1);
                Assert.Equal(1, statsCounter.GetCount(StatNames.EventsUserDescriptionErrors));
            }
        }
        public async Task PostUserDescription() {
            var container = AppBuilder.CreateContainer();
            using (WebApp.Start(Settings.Current.BaseURL, app => AppBuilder.BuildWithContainer(app, container, false))) {
                var repository = container.GetInstance<IEventRepository>();
                repository.RemoveAll();

                const string referenceId = "fda94ff32921425ebb08b73df1d1d34c";
                const string badReferenceId = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";

                var statsCounter = container.GetInstance<IAppStatsClient>() as InMemoryAppStatsClient;
                var descQueue = container.GetInstance<IQueue<EventUserDescription>>() as InMemoryQueue<EventUserDescription>;

                Assert.NotNull(statsCounter);

                EnsureSampleData(container);

                var events = new List<Event> { new Event { Message = "Testing", ReferenceId = referenceId } };
                var configuration = GetClient().Configuration;
                var serializer = new DefaultJsonSerializer();

                var client = new DefaultSubmissionClient();
                var description = new UserDescription { EmailAddress = "*****@*****.**", Description = "Some description." };
                Debug.WriteLine("Before Submit Description");
                statsCounter.DisplayStats();
                Assert.True(statsCounter.WaitForCounter(StatNames.EventsUserDescriptionErrors, work: () => {
                    var response = client.PostUserDescription(referenceId, description, configuration, serializer);
                    Debug.WriteLine("After Submit Description");
                    Assert.True(response.Success, response.Message);
                    Assert.Null(response.Message);
                }));
                statsCounter.DisplayStats();
                Debug.WriteLine(descQueue.GetQueueCount());

                Debug.WriteLine("Before Post Event");
                Assert.True(statsCounter.WaitForCounter(StatNames.EventsProcessed, work: () => {
                    var response = client.PostEvents(events, configuration, serializer);
                    Debug.WriteLine("After Post Event");
                    Assert.True(response.Success, response.Message);
                    Assert.Null(response.Message);
                }));
                statsCounter.DisplayStats();
                if (statsCounter.GetCount(StatNames.EventsUserDescriptionProcessed) == 0)
                    Assert.True(statsCounter.WaitForCounter(StatNames.EventsUserDescriptionProcessed));

                container.GetInstance<IElasticClient>().Refresh();
                var ev = repository.GetByReferenceId("537650f3b77efe23a47914f4", referenceId).FirstOrDefault();
                Assert.NotNull(ev);
                Assert.NotNull(ev.GetUserDescription());
                Assert.Equal(description.ToJson(), ev.GetUserDescription().ToJson());

                Assert.InRange(statsCounter.GetCount(StatNames.EventsUserDescriptionErrors), 1, 5);
                Assert.True(statsCounter.WaitForCounter(StatNames.EventsUserDescriptionErrors, work: () => {
                    var response = client.PostUserDescription(badReferenceId, description, configuration, serializer);
                    Assert.True(response.Success, response.Message);
                    Assert.Null(response.Message);
                }));
                statsCounter.DisplayStats();

                Assert.InRange(statsCounter.GetCount(StatNames.EventsUserDescriptionErrors), 2, 10);
            }
        }