public void AccessToDeletedTask()
        {
            Clean();

            var certificateSource = CreateRealSourceForSupplier(supplier);
            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));
            task.Delete();

            Assert.That(task.Id, Is.GreaterThan(0));
            Assert.That(task.CertificateSource, Is.Not.Null);
            Assert.That(task.CatalogProduct, Is.Not.Null);
            Assert.That(task.SerialNumber, Is.Not.Null.Or.Empty);

            var deletedTask = CertificateTask.Queryable.FirstOrDefault(t => t.Id == task.Id);

            Assert.That(deletedTask, Is.Null);
            Assert.That(task.SerialNumber, Is.Not.Null.Or.Empty);
        }
        private CertificateTask SuccessProcessCertificate(out string supplierCertificatesDir, out string certificateFile)
        {
            var certificateSource = CreateRealSourceForSupplier(supplier);
            var serialNumber      = Path.GetRandomFileName();
            var catalog           = TestCatalogProduct.Queryable.First();
            var product           = TestProduct.Queryable.First(p => p.CatalogProduct == catalog);

            supplierCertificatesDir = Path.Combine(Settings.Default.FTPOptBoxPath, supplier.Id.ToString().PadLeft(3, '0'), "Certificats");
            if (Directory.Exists(supplierCertificatesDir))
            {
                Directory.Delete(supplierCertificatesDir, true);
            }
            Directory.CreateDirectory(supplierCertificatesDir);

            certificateFile = Path.GetRandomFileName();
            File.WriteAllText(Path.Combine(supplierCertificatesDir, certificateFile), "Это тестовый сертификат", Encoding.GetEncoding(1251));

            var documentLine     = CreateBodyLine(serialNumber, product);
            var realDocumentLine = Document.Find(documentLine.Waybill.Id).Lines[0];
            var task             = new CertificateTask(certificateSource, realDocumentLine);

            task.Save();

            documentLine.CertificateFilename = Path.GetFileNameWithoutExtension(certificateFile);
            documentLine.Save();

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

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

            task.Save();
            session.Transaction.Commit();
            session.Flush();
            handler.ProcessData();
        }
        private CertificateTask CreateTask()
        {
            TestCertifcateSource.GetFilesFromSourceAction = null;
            TestCertifcateSource.CertificateExistsAction  = null;
            CertificateSource.Assembly = typeof(TestCertifcateSource).Assembly;

            var source = CreateSourceForSupplier(supplier, "TestCertifcateSource");
            var line   = CreateBodyLine();

            var task = new CertificateTask();

            task.CertificateSource = source;
            task.CatalogProduct    = session.Load <Catalog>(line.CatalogProduct.CatalogProduct.Id);
            task.SerialNumber      = DocumentLine.EmptySerialNumber;
            task.DocumentLine      = session.Load <DocumentLine>(line.Id);
            task.Save();
            return(task);
        }
Exemple #5
0
        public void SimpleCreateTask()
        {
            var certificateSource = CreateSourceForSupplier();
            var documentLine      = CreateBodyLine();
            var catalog           = TestCatalogProduct.Queryable.First();
            var serialNumber      = Path.GetRandomFileName();
            var realDocumentLine  = Document.Find(documentLine.Waybill.Id).Lines[0];

            var task = new CertificateTask();

            using (new TransactionScope()) {
                task.CertificateSource = certificateSource;
                task.CatalogProduct    = Catalog.Find(catalog.Id);
                task.SerialNumber      = serialNumber;
                task.DocumentLine      = realDocumentLine;
                task.Save();
            }

            Assert.That(task.Id, Is.GreaterThan(0));
        }
        public void CreateCertificateOnEmptySerialNumber()
        {
            Clean();
            DeleteCertificatedWithEmptySerialNumber();

            var catalog = TestCatalogProduct.Queryable.First();

            var certificateSource = CreateRealSourceForSupplier(supplier);
            var product           = TestProduct.Queryable.First(p => p.CatalogProduct == catalog);

            var supplierCertificatesDir = Path.Combine(Settings.Default.FTPOptBoxPath, supplier.Id.ToString().PadLeft(3, '0'), "Certificats");

            if (Directory.Exists(supplierCertificatesDir))
            {
                Directory.Delete(supplierCertificatesDir, true);
            }
            Directory.CreateDirectory(supplierCertificatesDir);

            var destinationDir = Settings.Default.CertificatePath;

            var documentLine = CreateBodyLine(String.Empty, product);

            var certificateFile = Path.GetRandomFileName();

            File.WriteAllText(Path.Combine(supplierCertificatesDir, certificateFile), "Это тестовый сертификат", Encoding.GetEncoding(1251));

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

            var task = new CertificateTask();

            task.CertificateSource = certificateSource;
            task.CatalogProduct    = Catalog.Find(catalog.Id);
            task.SerialNumber      = DocumentLine.EmptySerialNumber;
            task.DocumentLine      = realDocumentLine;
            task.Save();

            documentLine.CertificateFilename = Path.GetFileNameWithoutExtension(certificateFile);
            documentLine.Save();

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

            ProcessTestHandler();

            var processedTask = CertificateTask.Queryable.FirstOrDefault(t => t.Id == task.Id);

            Assert.That(processedTask, Is.Null, "Не была удалена задача на создание сертификата после обработки");

            var certificate =
                TestCertificate.Queryable.FirstOrDefault(c => c.CatalogProduct.Id == catalog.Id && c.SerialNumber == DocumentLine.EmptySerialNumber);

            Assert.That(certificate, Is.Not.Null, "Не был создан сертификат");
            Assert.That(certificate.CertificateFiles.Count, Is.EqualTo(1), "Не были добавлены файлы сертификата");
            Assert.That(certificate.CertificateFiles[0].OriginFilename, Is.EqualTo(certificateFile), "Не совпадает оригинальное имя файла сертификата");
            Assert.That(certificate.CertificateFiles[0].CertificateSource.Id, Is.EqualTo(certificateSource.Id), "Не совпадает источник файла сертификата");
            Assert.That(certificate.CertificateFiles[0].ExternalFileId, Is.Not.Null.Or.Empty, "Не установлено поле ExternalFileId");
            Assert.That(certificate.CertificateFiles[0].ExternalFileId, Is.EqualTo(certificate.CertificateFiles[0].OriginFilename), "Поле ExternalFileId не совпадает с OriginFilename (только для AptekaHoldingVoronezhCertificateSource)");

            var file = Path.Combine(destinationDir, certificate.CertificateFiles[0].Id + ".tif");

            Assert.That(File.Exists(file), "Не скопирован файл {0} сертификата", file);
            Assert.That(File.Exists(Path.Combine(supplierCertificatesDir, certificateFile)), "Удален файл сертификата из исходной папки");

            documentLine.Refresh();
            Assert.That(documentLine.Certificate.Id, Is.EqualTo(certificate.Id), "В позиции документа не установлена ссылка на сертификат");
        }
        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();
            }
        }
        public void UseExistsCertificateFiles()
        {
            Clean();

            var certificateSource = CreateRealSourceForSupplier(supplier);

            var destinationDir = Settings.Default.CertificatePath;

            //Удаляем файлы, которые имеют Id = 0
            var zeroFiles = Directory.GetFiles(destinationDir, "0.*");

            foreach (var zeroFile in zeroFiles)
            {
                File.Delete(zeroFile);
            }

            //Создаем существующий файл сертификата
            var existsSerialNumber       = Path.GetRandomFileName();
            var existsFileId             = Path.GetRandomFileName();
            var existsCertificateCatalog = TestCatalogProduct.Queryable.First();

            var existsCertificate = new Certificate()
            {
                CatalogProduct = Catalog.Find(existsCertificateCatalog.Id),
                SerialNumber   = existsSerialNumber
            };
            var existsCertificateFile = existsCertificate.NewFile();

            existsCertificateFile.CertificateSource = certificateSource;
            existsCertificateFile.OriginFilename    = existsFileId;
            existsCertificateFile.ExternalFileId    = existsFileId;
            existsCertificateFile.Extension         = ".tif";
            existsCertificate.Save();

            File.WriteAllText(Path.Combine(destinationDir, existsCertificateFile.Id + ".tif"), "Это тестовый сертификат", Encoding.GetEncoding(1251));

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

            var supplierCertificatesDir = Path.Combine(Settings.Default.FTPOptBoxPath, supplier.Id.ToString().PadLeft(3, '0'), "Certificats");

            if (Directory.Exists(supplierCertificatesDir))
            {
                Directory.Delete(supplierCertificatesDir, true);
            }
            Directory.CreateDirectory(supplierCertificatesDir);


            var documentLine = CreateBodyLine(serialNumber, product);

            //Файл сертификата в новой разбираемой позиции должен быть таким же
            var certificateFile = existsFileId;

            File.WriteAllText(Path.Combine(supplierCertificatesDir, certificateFile), "Это тестовый сертификат", Encoding.GetEncoding(1251));

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

            var task = new CertificateTask(certificateSource, realDocumentLine);

            task.Save();

            documentLine.CertificateFilename = Path.GetFileNameWithoutExtension(certificateFile);
            documentLine.Save();

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

            ProcessTestHandler();

            var processedTask = CertificateTask.Queryable.FirstOrDefault(t => t.Id == task.Id);

            Assert.That(processedTask, Is.Null, "Не была удалена задача на создание сертификата после обработки");

            var certificate =
                TestCertificate.Queryable.FirstOrDefault(c => c.CatalogProduct.Id == catalog.Id && c.SerialNumber == serialNumber);

            Assert.That(certificate, Is.Not.Null, "Не был создан сертификат");
            Assert.That(certificate.CertificateFiles.Count, Is.EqualTo(1), "Не были добавлены файлы сертификата");
            Assert.That(certificate.CertificateFiles[0].OriginFilename, Is.EqualTo(certificateFile), "Не совпадает оригинальное имя файла сертификата");
            Assert.That(certificate.CertificateFiles[0].CertificateSource.Id, Is.EqualTo(certificateSource.Id), "Не совпадает источник файла сертификата");
            Assert.That(certificate.CertificateFiles[0].ExternalFileId, Is.Not.Null.Or.Empty, "Не установлено поле ExternalFileId");
            Assert.That(certificate.CertificateFiles[0].ExternalFileId, Is.EqualTo(certificate.CertificateFiles[0].OriginFilename), "Поле ExternalFileId не совпадает с OriginFilename (только для AptekaHoldingVoronezhCertificateSource)");

            Assert.That(File.Exists(Path.Combine(destinationDir, certificate.CertificateFiles[0].Id + ".tif")), "Не скопирован файл сертификата");
            Assert.That(File.Exists(Path.Combine(supplierCertificatesDir, certificateFile)), "Удален файл сертификата из исходной папки");

            documentLine.Refresh();
            Assert.That(documentLine.Certificate.Id, Is.EqualTo(certificate.Id), "В позиции документа не установлена ссылка на сертификат");

            Assert.That(certificate.CertificateFiles[0].Id, Is.EqualTo(existsCertificateFile.Id), "Не совпадает Id на существующий файл сертификата");
            Assert.That(certificate.CertificateFiles[0].Certificates.Count, Is.EqualTo(2), "Неожидаемое кол-во связанных сертификатов");

            var filesByExternalFileId = CertificateFile.Queryable.Where(f => f.ExternalFileId == existsFileId).ToList();

            Assert.That(filesByExternalFileId.Count, Is.EqualTo(1), "Имеются повторения файлов сертификатов по ExternalFileId: {0}", existsFileId);

            var zeroFilesAfteParse = Directory.GetFiles(destinationDir, "0.*");

            Assert.That(zeroFilesAfteParse.Length, Is.EqualTo(0), "Имеются файлы с Id = 0: {0}", zeroFilesAfteParse.Implode());
        }
Exemple #9
0
        public void CreateTaskWithUniqueKeyAndCorrect()
        {
            var certificateSource   = CreateSourceForSupplier();
            var documentLine        = CreateBodyLine();
            var catalog             = TestCatalogProduct.Queryable.First();
            var serialNumber        = "Мама мыла раму";
            var anotherSerialNumber = "Папа мыла раму";
            var realDocumentLine    = Document.Find(documentLine.Waybill.Id).Lines[0];

            using (new TransactionScope()) {
                var certificateTasks =
                    CertificateTask.Queryable.Where(c => c.SerialNumber.Equals(serialNumber)).ToList();
                certificateTasks.ForEach(c => c.Delete());
            }

            using (new TransactionScope()) {
                var certificateTasks =
                    CertificateTask.Queryable.Where(c => c.SerialNumber.Equals(anotherSerialNumber)).ToList();
                certificateTasks.ForEach(c => c.Delete());
            }

            var task = new CertificateTask();

            using (new TransactionScope()) {
                task.CertificateSource = certificateSource;
                task.CatalogProduct    = Catalog.Find(catalog.Id);
                task.SerialNumber      = serialNumber;
                task.DocumentLine      = realDocumentLine;
                task.Save();
            }

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

            var doubleDocumentLine     = CreateBodyLine();
            var doubleRealDocumentLine = Document.Find(documentLine.Waybill.Id).Lines[0];

            var doubleTask = new CertificateTask {
                CertificateSource = certificateSource,
                CatalogProduct    = task.CatalogProduct,
                SerialNumber      = "мАМА мыла рАМУ",
                DocumentLine      = doubleRealDocumentLine
            };

            using (var transaction = new TransactionScope()) {
                //Если в транзакции возникает ошибка DuplicateEntry, то транзакция откатывается
                //поэтому перед сохранением надо проверять, что такое задание не существует
                var existsTask = CertificateTask.Exists(
                    DetachedCriteria.For <CertificateTask>()
                    .Add(Restrictions.Eq("CertificateSource.Id", task.CertificateSource.Id))
                    .Add(Restrictions.Eq("CatalogProduct.Id", task.CatalogProduct.Id))
                    .Add(Restrictions.Eq("SerialNumber", doubleTask.SerialNumber)));

                if (existsTask)
                {
                    doubleTask.SerialNumber = anotherSerialNumber;
                }

                doubleTask.Save();

                transaction.VoteCommit();
            }

            Assert.That(doubleTask.Id, Is.GreaterThan(0));
            Assert.That(doubleTask.Id, Is.Not.EqualTo(task.Id));
        }