public async Task <IActionResult> Search(int id, [FromQuery] BarSearchViewModel vm)
        {
            var allCities = (await cityServices.GetAllDTOAsync());

            vm.AllCities = new List <SelectListItem>();
            vm.AllCities.Add(new SelectListItem("Select...", ""));

            allCities.ForEach(c => vm.AllCities.Add(new SelectListItem(c.Name, c.Id.ToString())));

            if (string.IsNullOrEmpty(vm.NameKey) && vm.MinRating == null && vm.CityId == null)
            {
                return(View(vm));
            }
            var dto = new BarSearchDTO
            {
                NameKey   = vm.NameKey,
                CityId    = vm.CityId,
                MinRating = vm.MinRating
            };

            vm.Paging.Count = await barServices.SerchResultCountAsync(dto);

            vm.Paging.ItemsPerPage = itemsPerPage;
            vm.Paging.CurrentPage  = id == 0 ? 1 : id;

            vm.Result = (await barServices.SearchAsync(dto, itemsPerPage, vm.Paging.CurrentPage))
                        .Select(b => b.MapToViewModel());

            return(View(vm));
        }
        public async Task <List <BarInListDTO> > SearchAsync(BarSearchDTO dto, int itemsPerPage, int currentPage)
        {
            var resultDTO = await context.Bars
                            .Include(b => b.Address)
                            .ThenInclude(a => a.City)
                            .Include(b => b.BarReviews)
                            .Include(b => b.BarReviews)
                            .FilterByName(dto.NameKey)
                            .FilterByCity(dto.CityId)
                            .FilterByRating(dto.MinRating)
                            .Select(bar => new BarInListDTO
            {
                Id            = bar.Id,
                Name          = bar.Name,
                ImagePath     = bar.ImagePath,
                Address       = bar.Address.Name,
                City          = bar.Address.City.Name,
                AverageRating = bar.BarReviews
                                .Where(r => r.Rating != null)
                                .Select(r => r.Rating)
                                .Average()
            })
                            .Skip((currentPage - 1) * itemsPerPage)
                            .Take(itemsPerPage)
                            .ToListAsync();

            return(resultDTO);
        }
        public async Task <int> SerchResultCountAsync(BarSearchDTO dto)
        {
            var resultCount = await context.Bars
                              .Include(b => b.Address)
                              .ThenInclude(a => a.City)
                              .Include(b => b.BarReviews)
                              .Include(b => b.BarReviews)
                              .FilterByName(dto.NameKey)
                              .FilterByCity(dto.CityId)
                              .FilterByRating(dto.MinRating)
                              .CountAsync();

            return(resultCount);
        }
        public async Task ReturnCount_WhenSearchByMultipleParameters()
        {
            var barFactoryMock         = new Mock <IBarFactory>();
            var barCocktailFactoryMock = new Mock <IBarCocktailFactory>();
            var imagaUrlTest           = "https://www.google.com/";

            var bar1TestName = "abC";
            var bar2TestName = "Def";
            var bar3TestName = "Bci";
            var bar4TestName = "jkl";

            var city1Name = "Sofia";
            var city2Name = "Varna";

            var options = TestUtilities.GetOptions(nameof(ReturnCount_WhenSearchByMultipleParameters));

            using (var arrangeContext = new CocktailMagicianDb(options))
            {
                arrangeContext.Cities.AddRange(new List <City>
                {
                    new City {
                        Name = city1Name
                    },
                    new City {
                        Name = city2Name
                    }
                });
                await arrangeContext.SaveChangesAsync();

                var city1Id = await arrangeContext.Cities.Where(c => c.Name == city1Name).Select(c => c.Id).FirstAsync();

                var city2Id = await arrangeContext.Cities.Where(c => c.Name == city2Name).Select(c => c.Id).FirstAsync();

                var address1Test = new Address
                {
                    Name      = "Address1Test",
                    CityId    = city1Id,
                    Latitude  = 1.1,
                    Longitude = 1.1
                };

                var address2Test = new Address
                {
                    Name      = "Address2Test",
                    CityId    = city2Id,
                    Latitude  = 1.1,
                    Longitude = 1.1
                };

                var bar1 = new Bar
                {
                    Name       = bar1TestName,
                    ImagePath  = imagaUrlTest,
                    Address    = address1Test,
                    BarReviews = new List <BarReview>
                    {
                        new BarReview {
                            Rating = 3
                        }
                    }
                };

                var bar2 = new Bar
                {
                    Name       = bar2TestName,
                    ImagePath  = imagaUrlTest,
                    Address    = address2Test,
                    BarReviews = new List <BarReview>
                    {
                        new BarReview {
                            Rating = 4
                        }
                    }
                };

                var bar3 = new Bar
                {
                    Name       = bar3TestName,
                    ImagePath  = imagaUrlTest,
                    Address    = address1Test,
                    BarReviews = new List <BarReview>
                    {
                        new BarReview {
                            Rating = 4
                        }
                    }
                };

                var bar4 = new Bar
                {
                    Name       = bar4TestName,
                    ImagePath  = imagaUrlTest,
                    Address    = address1Test,
                    BarReviews = new List <BarReview>
                    {
                        new BarReview {
                            Rating = 5
                        }
                    }
                };

                arrangeContext.Bars.AddRange(new List <Bar> {
                    bar1, bar2, bar3, bar4
                });
                await arrangeContext.SaveChangesAsync();
            }

            using (var assertContext = new CocktailMagicianDb(options))
            {
                var substringToSearch = "Bc";
                var cityIdToSearch    = await assertContext.Cities.Where(c => c.Name == city1Name).Select(c => c.Id).FirstAsync();

                var minRatingToSearch = 4;

                var dtoTest = new BarSearchDTO
                {
                    CityId    = cityIdToSearch,
                    MinRating = minRatingToSearch,
                    NameKey   = substringToSearch
                };

                var sut         = new BarServices(assertContext, barFactoryMock.Object, barCocktailFactoryMock.Object);
                var resultCount = await sut.SerchResultCountAsync(dtoTest);

                Assert.AreEqual(1, resultCount);
            }
        }
Example #5
0
        public async Task SearchByName()
        {
            var barFactoryMock         = new Mock <IBarFactory>();
            var barCocktailFactoryMock = new Mock <IBarCocktailFactory>();
            var imagaUrlTest           = "https://www.google.com/";
            var bar1TestName           = "abC";
            var bar2TestName           = "Def";
            var bar3TestName           = "Bci";
            var bar4TestName           = "jkl";


            var addressTest = new Address
            {
                Name = "AddressTest",
                //City = new City { Name = "SofiaTest" },
                Latitude  = 1.1,
                Longitude = 1.1
            };

            var options = TestUtilities.GetOptions(nameof(SearchByName));

            using (var arrangeContext = new CocktailMagicianDb(options))
            {
                arrangeContext.Cities.AddRange(new List <City>
                {
                    new City {
                        Name = "Sofia"
                    },
                    new City {
                        Name = "Varna"
                    }
                });
                await arrangeContext.SaveChangesAsync();

                var city1Id = await arrangeContext.Cities.Where(c => c.Name == "Sofia").Select(c => c.Id).FirstAsync();

                var city2Id = await arrangeContext.Cities.Where(c => c.Name == "Varna").Select(c => c.Id).FirstAsync();

                var bar1 = new Bar
                {
                    Name       = bar1TestName,
                    ImagePath  = imagaUrlTest,
                    Address    = addressTest,
                    BarReviews = new List <BarReview>
                    {
                        new BarReview {
                            Rating = 3
                        }
                    }
                };
                bar1.Address.CityId = city1Id;

                var bar2 = new Bar
                {
                    Name       = bar2TestName,
                    ImagePath  = imagaUrlTest,
                    Address    = addressTest,
                    BarReviews = new List <BarReview>
                    {
                        new BarReview {
                            Rating = 4
                        }
                    }
                };
                bar2.Address.CityId = city1Id;

                var bar3 = new Bar
                {
                    Name       = bar3TestName,
                    ImagePath  = imagaUrlTest,
                    Address    = addressTest,
                    BarReviews = new List <BarReview>
                    {
                        new BarReview {
                            Rating = 4
                        }
                    }
                };
                bar3.Address.CityId = city2Id;

                var bar4 = new Bar
                {
                    Name       = bar4TestName,
                    ImagePath  = imagaUrlTest,
                    Address    = addressTest,
                    BarReviews = new List <BarReview>
                    {
                        new BarReview {
                            Rating = 5
                        }
                    }
                };
                bar3.Address.CityId = city2Id;

                arrangeContext.Bars.AddRange(new List <Bar> {
                    bar1, bar2, bar3, bar4
                });
                await arrangeContext.SaveChangesAsync();
            }

            using (var assertContext = new CocktailMagicianDb(options))
            {
                var substringToSearch = "Bc";

                var dtoTest = new BarSearchDTO
                {
                    CityId    = null,
                    MinRating = null,
                    NameKey   = substringToSearch
                };

                var sut    = new BarServices(assertContext, barFactoryMock.Object, barCocktailFactoryMock.Object);
                var result = await sut.SearchAsync(dtoTest, 5, 1);

                Assert.AreEqual(2, result.Count());
                Assert.IsFalse(result.Any(c => !c.Name.Contains(substringToSearch, StringComparison.OrdinalIgnoreCase)));
            }
        }