public void ReturnProductDetails()
        {
            //Arrange
            var mockLogger     = new Mock <ILogger <WalmartProductDataController> >();
            var mockApiService = new Mock <IWalmartApiService>();

            var itemId      = 123;
            var productName = "tylenol a";

            var productLookupApiResponse = new WalmartApiResponse <ProductLookupResult>
            {
                HasError = false,
                Response = new ProductLookupResult
                {
                    items = new List <FullResponseItem>
                    {
                        new FullResponseItem
                        {
                            ItemId           = itemId, BrandName = "", CategoryNode = "", CategoryPath = "", CustomerRating = 5, CustomerRatingImage = "",
                            LargeImage       = "", LongDescription = "", Marketplace = true, MediumImage = "", ModelNumber = "", Msrp = 3.3M,
                            Name             = productName, NumReviews = "4", ParentItemId = 1, ProductUrl = "", SalePrice = 3.1M, ShortDescription = "",
                            StandardShipRate = 1.2M, ThumbnailImage = "", Upc = ""
                        }
                    }
                }
            };

            mockApiService.Setup(s => s.GetProductDetailAsync(
                                     It.Is <ProductLookupRequestInput>(lookupParam => lookupParam.ids.Count == 1 &&
                                                                       lookupParam.ids.Contains(123))))
            .Returns(Task <WalmartApiResponse <ProductLookupResult> > .FromResult(productLookupApiResponse));


            var controller = new WalmartProductDataController(mockApiService.Object, mockLogger.Object);

            //Act
            var result = (ProductInfoFull)((OkObjectResult)controller.ProductLookup(itemId).Result).Value;

            //Assert
            Assert.Equal(itemId, result.ItemId);
            Assert.Equal(result.Name, result.Name);
            mockApiService.VerifyAll();
        }
        public void ReturnOkObjectActionResult()
        {
            //Arrange
            var mockLogger     = new Mock <ILogger <WalmartProductDataController> >();
            var mockApiService = new Mock <IWalmartApiService>();

            var itemId = 123;

            var productLookupApiResponse = new WalmartApiResponse <ProductLookupResult>
            {
                HasError = false,
                Response = new ProductLookupResult
                {
                    items = new List <FullResponseItem>
                    {
                        new FullResponseItem
                        {
                            ItemId = itemId
                        }
                    }
                }
            };

            mockApiService.Setup(s => s.GetProductDetailAsync(
                                     It.Is <ProductLookupRequestInput>(lookupParam => lookupParam.ids.Count == 1 &&
                                                                       lookupParam.ids.Contains(123))))
            .Returns(Task <WalmartApiResponse <ProductLookupResult> > .FromResult(productLookupApiResponse));
            var controller = new WalmartProductDataController(mockApiService.Object, mockLogger.Object);

            //Act
            var result = controller.ProductLookup(itemId).Result;

            //Assert
            Assert.IsType <OkObjectResult>(result);
            mockApiService.VerifyAll();
        }
        public void ReturnProductRecommendations()
        {
            //Arrange
            var mockLogger     = new Mock <ILogger <WalmartProductDataController> >();
            var mockApiService = new Mock <IWalmartApiService>();

            var itemId = 2321;

            var recommendationApiResponse = new WalmartApiResponse <List <FullResponseItem> >
            {
                HasError = false,
                Response = new List <FullResponseItem> {
                    new FullResponseItem
                    {
                        ItemId = 651
                    },
                    new FullResponseItem
                    {
                        ItemId = 221
                    }
                }
            };

            var productLookupApiResponse = new WalmartApiResponse <ProductLookupResult>
            {
                HasError = false,
                Response = new ProductLookupResult
                {
                    items = new List <FullResponseItem>
                    {
                        new FullResponseItem
                        {
                            ItemId           = 651, BrandName = "", CategoryNode = "", CategoryPath = "", CustomerRating = 5, CustomerRatingImage = "",
                            LargeImage       = "", LongDescription = "", Marketplace = true, MediumImage = "", ModelNumber = "", Msrp = 3.3M,
                            Name             = "advil pm", NumReviews = "4", ParentItemId = 1, ProductUrl = "", SalePrice = 3.1M, ShortDescription = "",
                            StandardShipRate = 1.2M, ThumbnailImage = "", Upc = ""
                        },
                        new FullResponseItem
                        {
                            ItemId           = 221, BrandName = "", CategoryNode = "", CategoryPath = "", CustomerRating = 2, CustomerRatingImage = "",
                            LargeImage       = "", LongDescription = "", Marketplace = true, MediumImage = "", ModelNumber = "", Msrp = 2.3M,
                            Name             = "Tylenol cold & flu syrup", NumReviews = "4", ParentItemId = 4, ProductUrl = "", SalePrice = 2.1M, ShortDescription = "",
                            StandardShipRate = 1.1M, ThumbnailImage = "", Upc = ""
                        }
                    }
                }
            };

            mockApiService.Setup(s => s.GetProductRecommendationAsync(It.Is <int>(val => val == itemId)))
            .Returns(Task <WalmartApiResponse <List <FullResponseItem> > > .FromResult(recommendationApiResponse));

            mockApiService.Setup(s => s.GetProductDetailAsync(
                                     It.Is <ProductLookupRequestInput>(lookupParam => lookupParam.ids.Count == 2 &&
                                                                       lookupParam.ids.Contains(651) && lookupParam.ids.Contains(221))))
            .Returns(Task <WalmartApiResponse <ProductLookupResult> > .FromResult(productLookupApiResponse));


            var controller = new WalmartProductDataController(mockApiService.Object, mockLogger.Object);

            //Act
            var result = (List <ProductInfoFull>)((OkObjectResult)controller.ProductRecommendations(itemId).Result).Value;

            //Assert
            Assert.Equal(2, result.Count);
            Assert.Single <ProductInfoFull>(result, item => item.ItemId == 651 && item.Name == "advil pm");
            Assert.Single <ProductInfoFull>(result, item => item.ItemId == 221 && item.Name == "Tylenol cold & flu syrup");
            mockApiService.VerifyAll();
        }
        public void ReturnProductsForQuery()
        {
            //Arrange
            var mockLogger     = new Mock <ILogger <WalmartProductDataController> >();
            var mockApiService = new Mock <IWalmartApiService>();

            var query             = "tylenol";
            var sort              = SearchRequestSortType.bestseller;
            var searchApiResponse = new WalmartApiResponse <SearchResult <FullResponseItem> > {
                HasError = false,
                Response = new SearchResult <FullResponseItem>
                {
                    items = new List <FullResponseItem>
                    {
                        new FullResponseItem
                        {
                            ItemId = 123
                        },
                        new FullResponseItem
                        {
                            ItemId = 456
                        }
                    }
                }
            };
            var productLookupApiResponse = new WalmartApiResponse <ProductLookupResult>
            {
                HasError = false,
                Response = new ProductLookupResult
                {
                    items = new List <FullResponseItem>
                    {
                        new FullResponseItem
                        {
                            ItemId           = 123, BrandName = "", CategoryNode = "", CategoryPath = "", CustomerRating = 5, CustomerRatingImage = "",
                            LargeImage       = "", LongDescription = "", Marketplace = true, MediumImage = "", ModelNumber = "", Msrp = 3.3M,
                            Name             = "tylenol a", NumReviews = "4", ParentItemId = 1, ProductUrl = "", SalePrice = 3.1M, ShortDescription = "",
                            StandardShipRate = 1.2M, ThumbnailImage = "", Upc = ""
                        },
                        new FullResponseItem
                        {
                            ItemId           = 456, BrandName = "", CategoryNode = "", CategoryPath = "", CustomerRating = 2, CustomerRatingImage = "",
                            LargeImage       = "", LongDescription = "", Marketplace = true, MediumImage = "", ModelNumber = "", Msrp = 2.3M,
                            Name             = "tylenol b", NumReviews = "4", ParentItemId = 4, ProductUrl = "", SalePrice = 2.1M, ShortDescription = "",
                            StandardShipRate = 1.1M, ThumbnailImage = "", Upc = ""
                        }
                    }
                }
            };


            mockApiService.Setup(s => s.SearchProductsAsync(
                                     It.Is <SearchRequestInput>(searchParam => searchParam.query == query && searchParam.sort == sort)))
            .Returns(Task <WalmartApiResponse <SearchResult <FullResponseItem> > > .FromResult(searchApiResponse));
            mockApiService.Setup(s => s.GetProductDetailAsync(
                                     It.Is <ProductLookupRequestInput>(lookupParam => lookupParam.ids.Count == 2 &&
                                                                       lookupParam.ids.Contains(123) &&
                                                                       lookupParam.ids.Contains(456))))
            .Returns(Task <WalmartApiResponse <ProductLookupResult> > .FromResult(productLookupApiResponse));


            var controller = new WalmartProductDataController(mockApiService.Object, mockLogger.Object);

            //Act
            var result = (List <ProductInfoFull>)((OkObjectResult)controller.Search(query, sort).Result).Value;

            //Assert
            Assert.Equal(2, result.Count);
            Assert.Single <ProductInfoFull>(result, item => item.ItemId == 123);
            Assert.Single <ProductInfoFull>(result, item => item.ItemId == 456);
            mockApiService.VerifyAll();
        }