예제 #1
0
        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]);
        }
예제 #2
0
        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());
        }