public async Task Given_ShopperHistory_When_Sort_Returns_MostBoughtProductsFirst() { // Arrange. var shopperHistory = new List <ShopperHistoryResponse> { new ShopperHistoryResponse { CustomerId = "1", Products = new List <Product> { new Product { Name = "a", Quantity = 2d }, new Product { Name = "b", Quantity = 3d } } }, new ShopperHistoryResponse { CustomerId = "2", Products = new List <Product> { new Product { Name = "a", Quantity = 1d }, new Product { Name = "b", Quantity = 1d }, new Product { Name = "c", Quantity = 1d } } }, }; _shopperHistoryRepository.Get(Arg.Any <string>()).Returns(shopperHistory); var productsToSort = new List <Product> { new Product { Name = "a" }, new Product { Name = "b" }, new Product { Name = "d" }, }; // Act. var result = await _sut.Sort(SortOptions.RECOMMENDED, productsToSort); // Assert. result[0].Should().Be(productsToSort[1]); result[1].Should().Be(productsToSort[0]); result[2].Should().Be(productsToSort[2]); }
public async Task <IReadOnlyList <Product> > Sort(SortOptions option, List <Product> products) { var shopperHistory = await _shopperHistoryRepository.Get(_configuration["UserToken"]); var productIdAndPurchaseCountMap = GetProductIdPurchaseCountMap(shopperHistory); return((from eachProduct in products join eachPurchaseHisotry in productIdAndPurchaseCountMap on eachProduct.Name equals eachPurchaseHisotry.Item1 into gj from subPurchaseHistory in gj.DefaultIfEmpty() select new { Product = eachProduct, PurchaseCount = subPurchaseHistory == null ? 0d : subPurchaseHistory.Item2 }) .OrderByDescending(r => r.PurchaseCount) .Select(r => r.Product) .ToList()); }