public async Task Test_StatsAreCorrectlyUpdated_AfterDequeue_NoTaskType()
        {
            PostgreSqlTaskQueueInfo taskQueueInfo =
                CreateTaskQueueInfo(() => mDataSource.LastPostedAt);

            using (PostgreSqlTaskQueueConsumer taskQueueConsumer =
                       CreateTaskQueueConsumer(() => mDataSource.LastPostedAt))
                using (TaskQueueMetricsDiffChecker diff = new TaskQueueMetricsDiffChecker(async()
                                                                                          => await taskQueueInfo.ComputeMetricsAsync()))
                {
                    await diff.CaptureInitialMetricsAsync();

                    IQueuedTaskToken dequeuedToken = await taskQueueConsumer
                                                     .DequeueAsync();

                    QueuedTaskStatus origStatus = mDataSource
                                                  .GetOriginalTokenData(dequeuedToken.DequeuedTask.Id)
                                                  .LastQueuedTaskResult
                                                  .Status;

                    await diff.CaptureNewMetricsAndAssertCorrectDiff(delta : new TaskQueueMetrics(
                                                                         totalUnprocessed: origStatus == QueuedTaskStatus.Unprocessed ? -1 : 0,
                                                                         totalProcessing: 1,
                                                                         totalErrored: origStatus == QueuedTaskStatus.Error ? -1 : 0,
                                                                         totalFaulted: origStatus == QueuedTaskStatus.Faulted ? -1 : 0,
                                                                         totalFataled: origStatus == QueuedTaskStatus.Fatal ? -1 : 0,
                                                                         totalProcessed: origStatus == QueuedTaskStatus.Processed ? -1 : 0));
                }
        }
        public async Task Test_PeekMatchesDequeuedItem_SingleConsumer()
        {
            IQueuedTask      peekTask          = null;
            IQueuedTaskToken dequeuedTaskToken = null;

            PostgreSqlTaskQueueInfo taskQueueInfo =
                CreateTaskQueueInfo(() => mDataSource.LastPostedAt);

            using (PostgreSqlTaskQueueConsumer taskQueue =
                       CreateTaskQueueConsumer(() => mDataSource.LastPostedAt))
            {
                int expectedDequeueCount = mDataSource
                                           .NumTasksInQueue;

                for (int i = 0; i < expectedDequeueCount; i++)
                {
                    peekTask = await taskQueueInfo.PeekAsync();

                    Assert.NotNull(peekTask);

                    dequeuedTaskToken = await taskQueue.DequeueAsync();

                    Assert.NotNull(dequeuedTaskToken);

                    Assert.AreEqual(peekTask.Id, dequeuedTaskToken
                                    .DequeuedTask
                                    .Id);
                }
            }
        }
        public async Task Test_DequeueChangesPeekResult_SingleConsumer()
        {
            IQueuedTask peekTask   = null,
                        rePeekTask = null;

            IQueuedTaskToken dequeuedTaskToken = null;

            PostgreSqlTaskQueueInfo taskQueueInfo =
                CreateTaskQueueInfo(() => mDataSource.LastPostedAt);

            using (PostgreSqlTaskQueueConsumer taskQueueConsumer =
                       CreateTaskQueueConsumer(() => mDataSource.LastPostedAt))
            {
                peekTask = await taskQueueInfo.PeekAsync();

                Assert.NotNull(peekTask);

                dequeuedTaskToken = await taskQueueConsumer.DequeueAsync();

                Assert.NotNull(dequeuedTaskToken);

                rePeekTask = await taskQueueInfo.PeekAsync();

                Assert.NotNull(rePeekTask);

                //Removing a new element from the queue
                //  occurs at the beginning of the queue,
                //  so peeking must yield a different result
                //  than before dequeue-ing
                Assert.AreNotEqual(rePeekTask.Id,
                                   peekTask.Id);
            }
        }
        private async Task Run_ConsumeTestAsync(PostgreSqlTaskQueueConsumer taskQueue,
                                                ConsumedQueuedTaskTokenChecker checker,
                                                DateTimeOffset refNow,
                                                params string[] payloadTypes)
        {
            IQueuedTaskToken newTaskToken;

            if (payloadTypes != null && payloadTypes.Length > 0)
            {
                newTaskToken = await taskQueue.DequeueAsync(payloadTypes);
            }
            else
            {
                newTaskToken = await taskQueue.DequeueAsync();
            }

            checker.AssertConsumedTokenValid(newTaskToken, refNow);

            await checker.AssertTaskNotInDbAnymoreAsync(newTaskToken);

            await checker.AssertTaskResultInDbAndCorrectAsync(newTaskToken);
        }