private void ProcessTestHandler()
        {
            ProcessCertificatesWithLog(() => {
                var handler = new TestCertificateSourceHandler();

                handler.ProcessData();
            });
        }
        private void SaveAndProcess(CertificateTask task, TestCertificateSourceHandler handler)
        {
            if (!session.Transaction.IsActive)
            {
                session.BeginTransaction();
            }

            task.Save();
            session.Transaction.Commit();
            session.Flush();
            handler.ProcessData();
        }
        private void CheckErrors(CertificateTask task, MemoryAppender memoryAppender, TestCertificateSourceHandler handler, uint errorCount, bool idEquals = false)
        {
            var firstEvents = memoryAppender.GetEvents();

            var firstErrors = firstEvents.Where(item => item.Level >= Level.Warn);

            Assert.That(firstErrors.Count(), Is.EqualTo(errorCount), firstErrors.Implode(e => e.MessageObject));

            //кол-во ошибок должно быть равно 1
            Assert.That(handler.Errors.Count, Is.EqualTo(1));

            var info = handler.Errors[task.GetErrorId()];

            Assert.That(info.ErrorCount, Is.EqualTo(errorCount));
            Assert.That(info.Exception.Message, Is.StringStarting("Возникла ошибка при обработке задачи: "));
            if (idEquals)
            {
                Assert.That(info.Task.Id, Is.EqualTo(task.Id));
            }
            Assert.That(info.Task.CertificateSource.Id, Is.EqualTo(task.CertificateSource.Id));
            Assert.That(info.Task.CatalogProduct.Id, Is.EqualTo(task.CatalogProduct.Id));
            Assert.That(info.Task.SerialNumber, Is.EqualTo(task.SerialNumber));

            //Задача должна быть удалена из базы данных
            var deletedTask = CertificateTask.Queryable.FirstOrDefault(t => t.Id == task.Id);

            Assert.That(deletedTask, Is.Null);
        }
        public void SendErrorsOnProcessTask()
        {
            Clean();

            var certificateSource = CreateSourceForSupplier(supplier, typeof(TestErrorSource).Name);

            var serialNumber = Path.GetRandomFileName();
            var catalog      = TestCatalogProduct.Queryable.First();
            var product      = TestProduct.Queryable.First(p => p.CatalogProduct == catalog);

            var documentLine = CreateBodyLine(serialNumber, product);

            var realDocumentLine = Document.Find(documentLine.Waybill.Id).Lines[0];

            var task = new CertificateTask(certificateSource, realDocumentLine);

            task.Save();

            Assert.That(task.Id, Is.GreaterThan(0));

            try {
                session.Transaction.Commit();

                ((Logger)LogManager.GetLogger(typeof(TestCertificateSourceHandler)).Logger).Level = Level.Warn;
                var memoryAppender = new MemoryAppender();
                memoryAppender.ActivateOptions();
                memoryAppender.AddFilter(new LoggerMatchFilter {
                    AcceptOnMatch = true, LoggerToMatch = "PriceProcessor", Next = new DenyAllFilter()
                });
                BasicConfigurator.Configure(memoryAppender);

                var handler = new TestCertificateSourceHandler();

                handler.OnSource = (c) => {
                    c.CertificateSource.CertificateSourceParser = new TestErrorSource();
                    return(c.CertificateSource);
                };

                //Обрабатываем задачу первый раз
                handler.ProcessData();
                CheckErrors(task, memoryAppender, handler, 1);

                //Создаем новую задачу с теми же параметрами и обрабатываем задачу второй раз
                task = new CertificateTask(certificateSource, realDocumentLine);
                SaveAndProcess(task, handler);
                CheckErrors(task, memoryAppender, handler, 2);

                //Создаем новую задачу с теми же параметрами и обрабатываем задачу третий раз
                task = new CertificateTask(certificateSource, realDocumentLine);

                SaveAndProcess(task, handler);
                CheckErrors(task, memoryAppender, handler, 3);

                var lastEvents = memoryAppender.GetEvents();
                var errors     = lastEvents.Where(item => item.Level >= Level.Warn).ToList();
                Assert.That(errors.Count, Is.EqualTo(3));
                //Последнее сообщение должно быть Error
                Assert.That(errors[2].Level, Is.EqualTo(Level.Error));

                //Успешно обработываем сертификат и список ошибок должен очистится
                handler.OnSource = (c) => {
                    c.CertificateSource.CertificateSourceParser = new TestSuccessSource();
                    return(c.CertificateSource);
                };
                certificateSource.SourceClassName = typeof(TestSuccessSource).Name;
                certificateSource.Save();
                //Создаем новую задачу с теми же параметрами и обрабатываем задачу третий раз
                task = new CertificateTask(certificateSource, realDocumentLine);
                SaveAndProcess(task, handler);

                Assert.That(errors.Count, Is.EqualTo(3));
                Assert.That(handler.Errors.Count, Is.EqualTo(0), handler.Errors.Implode());

                //Задача должна быть удалена из базы данных
                var deletedSuccessTask = CertificateTask.Queryable.FirstOrDefault(t => t.Id == task.Id);
                Assert.That(deletedSuccessTask, Is.Null);
            }
            finally {
                LogManager.ResetConfiguration();
            }
        }