private MxHostTestDetails MarkTestToSkip(MxHostTestDetails host)
        {
            using (_log.BeginScope(new Dictionary <string, object> {
                [TlsHostLogPropertyName] = host.Test.Id
            }))
            {
                host.SkipTesting = _recentlyProcessedLedger.Contains(host.NormalizedHostname);

                _log.LogInformation($"Host {host.Test.Id} will be {(host.SkipTesting ? "skipped" : "processed")}");
                return(host);
            }
        }
        public async Task HostsAreProcessed()
        {
            var testPending            = CreateMxHostTestPending();
            List <TlsTestPending> list = new List <TlsTestPending>
            {
                testPending
            };

            A.CallTo(() => _mxQueueProcessor.GetMxHosts())
            .Returns(Task.FromResult(list)).Once()
            .Then
            .Returns(Task.FromResult(new List <TlsTestPending>()));

            A.CallTo(() => _recentlyProcessedLedger.Contains(A <string> ._)).Returns(false);

            A.CallTo(() => _mxQueueProcessor.DeleteMessage(A <string> ._, A <string> ._)).Returns(Task.CompletedTask);

            var testResult = CreateMxHostTestResult();

            A.CallTo(() => _mxHostTester.Test(testPending)).Returns(Task.FromResult(testResult)).Once();

            A.CallTo(() => _processingFilter.Reserve(A <string> ._)).Returns(true);

            A.CallTo(() => _publisher.Publish(A <Message> ._, A <string> ._)).Returns(Task.CompletedTask);

            Task process = _mxSecurityTesterProcessor.Process(cancellationTokenSource.Token);

            await _pipelineStartBlock.SendAsync(null);

            cancellationTokenSource.Cancel();

            await process;

            A.CallTo(() => _mxQueueProcessor.GetMxHosts()).MustHaveHappenedOnceExactly();
            A.CallTo(() => _mxHostTester.Test(testPending)).MustHaveHappenedOnceExactly();
            A.CallTo(() => _publisher.Publish(testResult, A <string> ._)).MustHaveHappenedOnceExactly();
            A.CallTo(() => _mxQueueProcessor.DeleteMessage("MessageId1", "ReceiptHandle1")).MustHaveHappenedOnceExactly();
            A.CallTo(() => _processingFilter.Reserve("host.domain1.gov.uk")).MustHaveHappenedOnceExactly();
            A.CallTo(() => _processingFilter.ReleaseReservation("host.domain1.gov.uk")).MustHaveHappenedOnceExactly();
            A.CallTo(() => _recentlyProcessedLedger.Set("host.domain1.gov.uk")).MustHaveHappenedOnceExactly();
        }