public async Task ProcessAllMessagesInQueue_TriggersDelivery()
        {
            // Setup
            Mock.Get(eventQueueStore)
            .SetupSequence(s => s.PeekEventAsync())
            .ReturnsAsync(new ServerEventMessage {
            })
            .ReturnsAsync(null);

            var  triggerService = new TriggerService();
            bool DeliverySet    = false;
            var  cts            = new CancellationTokenSource();
            var  waitingTask    = Task.Factory.StartNew(() =>
            {
                triggerService.DeliveryStart.WaitOne();
                DeliverySet = true;
            }, cts.Token);

            // Test
            var options = Options.Create(new EventServerOptions());
            var service = new HostedProcessingService(new TriggerService(), serviceProvider, logger, options);
            await service.ProcessAllMessagesInQueue();

            // Assert
            Mock.Get(eventQueueStore).Verify();
            Assert.IsTrue(DeliverySet, "DeliveryStart was not set");

            Mock.Get(objectUpdateService).VerifyNoOtherCalls();
            Mock.Get(metadataService).VerifyNoOtherCalls();
            Mock.Get(eventProcessingService).VerifyNoOtherCalls();
            cts.Cancel();
        }
        public async Task ProcessAllMessagesInQueue_Exceptions_PoisonMessage()
        {
            // Setup
            Mock.Get(eventQueueStore)
            .SetupSequence(s => s.PeekEventAsync())
            .ReturnsAsync(new ServerEventMessage {
                LogId = 53232L, Topic = "TopicA", EventJson = "{Event-Data-Here}"
            })
            .ReturnsAsync(null);

            Mock.Get(eventQueueStore)
            .Setup(s => s.PoisonedEventAsync(It.Is <long>(v => v == 53232L)))
            .Returns(Task.CompletedTask)
            .Verifiable();

            Mock.Get(eventProcessingService)
            .Setup(s => s.ProcessEvent(It.Is <string>(v => v == "TopicA"), It.Is <string>(v => v == "{Event-Data-Here}")))
            .ThrowsAsync(new Exception())
            .Verifiable();

            // Test
            var options = Options.Create(new EventServerOptions {
                AutoDiscoverEvents = false, AutoDiscoverObjectTypes = false
            });
            var service = new HostedProcessingService(new TriggerService(), serviceProvider, logger, options);
            await service.ProcessAllMessagesInQueue();

            // Assert
            Mock.Get(eventQueueStore).Verify();
            Mock.Get(eventProcessingService).Verify();
            Mock.Get(eventQueueStore).Verify();

            Mock.Get(objectUpdateService).VerifyNoOtherCalls();
            Mock.Get(metadataService).VerifyNoOtherCalls();
        }
        public async Task ProcessAllMessagesInQueue_ObjectMessage_OnlySends()
        {
            // Setup
            Mock.Get(eventQueueStore)
            .SetupSequence(s => s.PeekEventAsync())
            .ReturnsAsync(new ServerEventMessage {
                LogId = 53232L, ObjectType = "ObjectTypeA", ObjectId = "235", ObjectUpdate = "{Object-Data}"
            })
            .ReturnsAsync(null);

            Mock.Get(eventQueueStore)
            .Setup(s => s.DequeueEventAsync(It.Is <long>(v => v == 53232L)))
            .Returns(Task.CompletedTask)
            .Verifiable();

            Mock.Get(objectUpdateService)
            .Setup(s => s.UpdateObject(It.Is <string>(v => v == "ObjectTypeA"), It.Is <string>(v => v == "235"), It.Is <string>(v => v == "{Object-Data}")))
            .Returns(Task.CompletedTask)
            .Verifiable();

            // Test
            var options = Options.Create(new EventServerOptions {
                AutoDiscoverEvents = false, AutoDiscoverObjectTypes = false
            });
            var service = new HostedProcessingService(new TriggerService(), serviceProvider, logger, options);
            await service.ProcessAllMessagesInQueue();

            // Assert
            Mock.Get(eventQueueStore).Verify();
            Mock.Get(objectUpdateService).Verify();
            Mock.Get(eventQueueStore).Verify();

            Mock.Get(eventProcessingService).VerifyNoOtherCalls();
            Mock.Get(metadataService).VerifyNoOtherCalls();
        }