public CertificatePrintStatusUpdateHandlerTestsFixture()
            {
                _certificateRepository   = new Mock <ICertificateRepository>();
                _batchLogQueryRepository = new Mock <IBatchLogQueryRepository>();
                _mediator = new Mock <IMediator>();
                _logger   = new Mock <ILogger <CertificatePrintStatusUpdateHandler> >();

                _sut = new CertificatePrintStatusUpdateHandler(_certificateRepository.Object, _batchLogQueryRepository.Object, _mediator.Object, _logger.Object);
            }
        public void BaseArrange()
        {
            _certificateRepository         = new Mock <ICertificateRepository>();
            _certificateBatchLogRepository = new Mock <ICertificateBatchLogRepository>();
            _mediator = new Mock <IMediator>();

            _certificateRepository.Setup(r => r.GetCertificate(It.IsIn(_certificateReference1)))
            .Returns((string certificateReference) => Task.FromResult(
                         new Certificate
            {
                Id = Guid.NewGuid(),
                CertificateReference = certificateReference,
                UpdatedAt            = _batch111SentToPrinterAt,
                BatchNumber          = _batch111,
                Status      = CertificateStatus.SentToPrinter,
                ToBePrinted = _batch111SentToPrinterAt
            }));

            _certificateBatchLogRepository.Setup(r => r.GetCertificateBatchLog(It.IsIn(_certificateReference1), _batch111))
            .Returns((string certificateReference, int batchNumber) => Task.FromResult(
                         new CertificateBatchLog
            {
                Id = Guid.NewGuid(),
                CertificateReference = certificateReference,
                UpdatedAt            = _batch111SentToPrinterAt,
                BatchNumber          = batchNumber,
                Status   = CertificateStatus.SentToPrinter,
                StatusAt = _batch111SentToPrinterAt
            }));

            _certificateRepository.Setup(r => r.GetCertificate(It.IsIn(_certificateReference2, _certificateReference3)))
            .Returns((string certificateReference) => Task.FromResult(
                         new Certificate
            {
                Id = Guid.NewGuid(),
                CertificateReference = certificateReference,
                UpdatedAt            = _batch222PrintNotifiedAt,
                BatchNumber          = _batch222,
                Status      = CertificateStatus.Printed,
                ToBePrinted = _batch222SentToPrinterAt
            }));

            _certificateBatchLogRepository.Setup(r => r.GetCertificateBatchLog(It.IsIn(_certificateReference2, _certificateReference3), _batch222))
            .Returns((string certificateReference, int batchNumber) => Task.FromResult(
                         new CertificateBatchLog
            {
                Id = Guid.NewGuid(),
                CertificateReference = certificateReference,
                UpdatedAt            = _batch222PrintNotifiedAt,
                BatchNumber          = batchNumber,
                Status   = CertificateStatus.Printed,
                StatusAt = _batch222PrintedAt
            }));

            _certificateRepository.Setup(r => r.GetCertificate(It.IsIn(_certificateReference4)))
            .Returns((string certificateReference) => Task.FromResult <Certificate>(null));

            _certificateRepository.Setup(r => r.GetCertificate(It.IsIn(_certificateReference5)))
            .Returns((string certificateReference) => Task.FromResult(
                         new Certificate
            {
                Id = Guid.NewGuid(),
                CertificateReference = certificateReference,
                UpdatedAt            = DateTime.UtcNow.AddDays(1),
                BatchNumber          = _batch222,
                Status = CertificateStatus.Delivered
            }));

            _certificateBatchLogRepository.Setup(r => r.GetCertificateBatchLog(It.IsIn(_certificateReference5), _batch222))
            .Returns((string certificateReference, int batchNumber) => Task.FromResult(
                         new CertificateBatchLog
            {
                Id = Guid.NewGuid(),
                CertificateReference = certificateReference,
                UpdatedAt            = _deliveredAtNotifiedAt,
                BatchNumber          = batchNumber,
                Status   = CertificateStatus.Delivered,
                StatusAt = _deliveredAt
            }));


            _certificateRepository.Setup(r => r.GetCertificate(It.IsIn(_certificateReferenceReprintedAfterPrinted)))
            .Returns((string certificateReference) => Task.FromResult(
                         new Certificate
            {
                Id = Guid.NewGuid(),
                CertificateReference = certificateReference,
                UpdatedAt            = _certificateReferenceReprintedAfterPrintedAt,
                BatchNumber          = null,
                Status = CertificateStatus.Reprint,
            }));

            _certificateBatchLogRepository.Setup(r => r.GetCertificateBatchLog(It.IsIn(_certificateReferenceReprintedAfterPrinted), _batch111))
            .Returns((string certificateReference, int batchNumber) => Task.FromResult(
                         new CertificateBatchLog
            {
                Id = Guid.NewGuid(),
                CertificateReference = certificateReference,
                UpdatedAt            = _batch111SentToPrinterAt,
                BatchNumber          = batchNumber,
                Status   = CertificateStatus.SentToPrinter,
                StatusAt = _batch111SentToPrinterAt
            }));

            _certificateBatchLogRepository.Setup(r => r.GetCertificateBatchLog(It.IsIn(_certificateReferenceReprintedAfterPrinted), _batch222))
            .Returns((string certificateReference, int batchNumber) => Task.FromResult(
                         new CertificateBatchLog
            {
                Id = Guid.NewGuid(),
                CertificateReference = certificateReference,
                UpdatedAt            = _batch222PrintNotifiedAt,
                BatchNumber          = batchNumber,
                Status   = CertificateStatus.Printed,
                StatusAt = _batch222PrintedAt
            }));

            _certificateRepository.Setup(r => r.GetCertificate(It.IsIn(_certificateReferenceDeletedAfterPrinted)))
            .Returns((string certificateReference) => Task.FromResult(
                         new Certificate
            {
                Id = Guid.NewGuid(),
                CertificateReference = certificateReference,
                UpdatedAt            = _certificateReferenceDeletedAfterPrintedAt,
                BatchNumber          = _batch222,
                Status = CertificateStatus.Deleted
            }));

            _certificateBatchLogRepository.Setup(r => r.GetCertificateBatchLog(It.IsIn(_certificateReferenceDeletedAfterPrinted), _batch222))
            .Returns((string certificateReference, int batchNumber) => Task.FromResult(
                         new CertificateBatchLog
            {
                Id = Guid.NewGuid(),
                CertificateReference = certificateReference,
                UpdatedAt            = _batch222PrintNotifiedAt,
                BatchNumber          = batchNumber,
                Status   = CertificateStatus.Printed,
                StatusAt = _batch222PrintedAt
            }));

            _certificateBatchLogRepository.Setup(r => r.GetCertificateBatchLog(It.IsIn(_certificateReference5), _batch111))
            .Returns((string certificateReference, int batchNumber) => Task.FromResult(
                         new CertificateBatchLog
            {
                Id = Guid.NewGuid(),
                CertificateReference = certificateReference,
                Status   = CertificateStatus.Delivered,
                StatusAt = DateTime.UtcNow.AddDays(1)
            }));

            _certificateRepository.Setup(r => r.GetCertificate(It.IsIn(_certificateReference4)))
            .Returns((string certificateReference) => Task.FromResult <Certificate>(null));

            _certificateRepository.Setup(r => r.UpdatePrintStatus(It.IsAny <Certificate>(), It.IsAny <int>(), It.IsAny <string>(), It.IsAny <DateTime>(), It.IsAny <string>(), It.IsAny <bool>()))
            .Returns(Task.CompletedTask);

            _mediator.Setup(r => r.Send(It.Is <GetBatchLogRequest>(p => new[] { _batch111, _batch222 }.Contains(p.BatchNumber)), It.IsAny <CancellationToken>()))
            .Returns((GetBatchLogRequest request, CancellationToken token) => Task.FromResult(new BatchLogResponse {
                BatchNumber = request.BatchNumber
            }));

            _mediator.Setup(r => r.Send(It.Is <GetBatchLogRequest>(p => !(new[] { _batch111, _batch222 }.Contains(p.BatchNumber))), It.IsAny <CancellationToken>()))
            .Returns((GetBatchLogRequest request, CancellationToken token) => Task.FromResult <BatchLogResponse>(null));

            _logger = new Mock <ILogger <CertificatePrintStatusUpdateHandler> >();

            _sut = new CertificatePrintStatusUpdateHandler(_certificateRepository.Object, _certificateBatchLogRepository.Object, _mediator.Object, _logger.Object);
        }