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); } } }
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(); } } }
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); } } }
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); } }