Exemple #1
0
        public void GithubHookConsumer_HandlingSameHookInParallelThreads_EachFileSavedOnlyOnce()
        {
            ISalesHandlerFactory fileHandlerFactory = new TestGithubSalesHandlerFactory(DependencyContainer.Container);
            IHookConsumer        hookConsumer       = DependencyContainer.Container.Resolve <IHookConsumer>(new ResolverOverride[]
            {
                new ParameterOverride(typeof(ISalesHandlerFactory), fileHandlerFactory),
                new ParameterOverride("githubRepoToken", Token),
                new ParameterOverride("hookParser", new GithubHookParser(f => FileNameValidator.Validate(f)))
            });
            IHookConsumer hookConsumer2 = DependencyContainer.Container.Resolve <IHookConsumer>(new ResolverOverride[]
            {
                new ParameterOverride(typeof(ISalesHandlerFactory), fileHandlerFactory),
                new ParameterOverride("githubRepoToken", Token),
                new ParameterOverride("hookParser", new GithubHookParser(f => FileNameValidator.Validate(f)))
            });

            using (ISalesUnitOfWork unitOfWork = DependencyContainer.Container.Resolve <ISalesUnitOfWork>())
            {
                lock (lockObject)
                {
                    unitOfWork.Customers.Delete(x => true);
                    unitOfWork.Products.Delete(x => true);
                    unitOfWork.SourceFiles.Delete(x => true);
                    unitOfWork.Sales.Delete(x => true);
                    unitOfWork.ErrorFiles.Delete(x => true);
                    unitOfWork.SaveChanges();
                    string hookJson = File.ReadAllText("../../Data/hook1.json");

                    var task1 = hookConsumer.ConsumeHookAsync(hookJson);
                    var task2 = hookConsumer2.ConsumeHookAsync(hookJson);
                    Task.WaitAll(task1, task2);

                    int customersCountAfter   = unitOfWork.Customers.Get().Count();
                    int productsCountAfter    = unitOfWork.Products.Get().Count();
                    int sourceFilesCountAfter = unitOfWork.SourceFiles.Get().Count();
                    int salesCountAfter       = unitOfWork.Sales.Get().Count();
                    int errorsCountAfter      = unitOfWork.ErrorFiles.Get().Count();
                    Assert.AreEqual(5, customersCountAfter);
                    Assert.AreEqual(4, productsCountAfter);
                    Assert.AreEqual(2, sourceFilesCountAfter);
                    Assert.AreEqual(10, salesCountAfter);
                    Assert.IsTrue(errorsCountAfter >= 2);
                }
            }
        }
Exemple #2
0
        protected IList <Sale> GetSalesAndSaveProductsAndCustomers(SourceFile sourceFile, IEnumerable <SaleDto> saleDetailsData)
        {
            List <Sale> sales    = new List <Sale>();
            var         mapper   = Mappings.GetMapper();
            bool        gotMutex = false;

            try
            {
                foreach (var saleDto in saleDetailsData)
                {
                    Sale sale = mapper.Map <SaleDto, Sale>(saleDto);
                    sale.SourceFile = sourceFile;
                    gotMutex        = customersAndProductsSaveMutex.WaitOne();
                    if (!gotMutex)
                    {
                        throw new ThreadInterruptedException("Could not get mutex.");
                    }
                    sale.Customer = unitOfWork.Customers.Add(sale.Customer);
                    sale.Product  = unitOfWork.Products.Add(sale.Product);
                    unitOfWork.SaveChanges();

                    customersAndProductsSaveMutex.ReleaseMutex();
                    gotMutex = false;
                    sales.Add(sale);
                }

                return(sales);
            }
            catch (Exception)
            {
                unitOfWork.DiscardChanges();
                return(new Sale[0]);
            }
            finally
            {
                if (gotMutex)
                {
                    customersAndProductsSaveMutex.ReleaseMutex();
                }
            }
        }
Exemple #3
0
        public void GithubHookConsumer_DbHasCorrectData_WhenHandlingGoodHook()
        {
            ISalesHandlerFactory fileHandlerFactory = new TestGithubSalesHandlerFactory(DependencyContainer.Container);
            IHookConsumer        hookConsumer       = DependencyContainer.Container.Resolve <IHookConsumer>(new ResolverOverride[]
            {
                new ParameterOverride(typeof(ISalesHandlerFactory), fileHandlerFactory),
                new ParameterOverride("githubRepoToken", Token),
                new ParameterOverride("hookParser", new GithubHookParser(f => FileNameValidator.Validate(f)))
            });

            using (ISalesUnitOfWork unitOfWork = DependencyContainer.Container.Resolve <ISalesUnitOfWork>())
            {
                lock (lockObject)
                {
                    unitOfWork.Customers.Delete(x => true);
                    unitOfWork.Products.Delete(x => true);
                    unitOfWork.SourceFiles.Delete(x => true);
                    unitOfWork.Sales.Delete(x => true);
                    unitOfWork.ErrorFiles.Delete(x => true);
                    unitOfWork.SaveChanges();
                    string hookJson = File.ReadAllText("../../Data/hook1.json");

                    hookConsumer.ConsumeHookAsync(hookJson).GetAwaiter().GetResult();

                    int customersCountAfter   = unitOfWork.Customers.Get().Count();
                    int productsCountAfter    = unitOfWork.Products.Get().Count();
                    int sourceFilesCountAfter = unitOfWork.SourceFiles.Get().Count();
                    int salesCountAfter       = unitOfWork.Sales.Get().Count();
                    int errorsCountAfter      = unitOfWork.ErrorFiles.Get().Count();
                    Assert.AreEqual(5, customersCountAfter);
                    Assert.AreEqual(4, productsCountAfter);
                    Assert.AreEqual(2, sourceFilesCountAfter);
                    Assert.AreEqual(10, salesCountAfter);
                    Assert.AreEqual(2, errorsCountAfter);
                }
            }
        }
Exemple #4
0
        public void AddNewSaleWithNewProduct_AddsProduct()
        {
            using (ISalesUnitOfWork unitOfWork = DependencyContainer.Container.Resolve <ISalesUnitOfWork>())
            {
                SourceFile sourceFile = new SourceFile()
                {
                    FileName = "shit",
                    FileDate = DateTime.UtcNow
                };

                Customer customer1 = new Customer()
                {
                    CustomerName = "Customer"
                };
                Product product1 = new Product()
                {
                    ProductName = "Product"
                };

                Sale sale1 = new Sale()
                {
                    SourceFile = sourceFile,
                    Customer   = customer1,
                    Product    = product1,
                    SaleDate   = DateTime.UtcNow,
                    TotalSum   = 10
                };

                Customer customer2 = new Customer()
                {
                    CustomerName = "Customer 2"
                };
                Product product2 = new Product()
                {
                    ProductName = "Product 2"
                };

                Sale sale2 = new Sale()
                {
                    SourceFile = sourceFile,
                    Customer   = customer1,
                    Product    = product2,
                    SaleDate   = DateTime.UtcNow,
                    TotalSum   = 122
                };

                var added = unitOfWork.Sales.AddRange(new Sale[] { sale1, sale2 });

                int oldSalesCount     = unitOfWork.Sales.Get().Count();
                int oldCustomersCount = unitOfWork.Customers.Get().Count();
                int oldProductCount   = unitOfWork.Products.Get().Count();
                int res = unitOfWork.SaveChanges();

                int salesCount     = unitOfWork.Sales.Get().Count();
                int customersCount = unitOfWork.Customers.Get().Count();
                int productCount   = unitOfWork.Products.Get().Count();

                Assert.AreEqual(2 + oldSalesCount, salesCount);
                Assert.AreEqual(1 + oldCustomersCount, customersCount);
                Assert.AreEqual(2 + oldProductCount, productCount);
            }
        }