예제 #1
0
        public void SearchResultsShouldReturnEmptyList()
        {
            //arrange
            SearchServiceResult expectedResult = null;
          
            mockService.Setup(x => x.GetPaginatedResult(It.IsAny<string>(), It.IsAny<int>(), It.IsAny<int>(),
                It.IsAny<string>(), It.IsAny<bool>())).ReturnsAsync(expectedResult).Verifiable();            
            mockValidation.Setup(x => x.CleanText(It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<List<string>>(), It.IsAny<HashSet<char>>())).Returns("abc");
            mockUrlHelper.Setup(x => x.Action(It.IsAny<UrlActionContext>())).Returns((UrlActionContext uac) =>
                $"{uac.Controller}/{uac.Action}#{uac.Fragment}?" + string.Join("&",
                    new RouteValueDictionary(uac.Values).Select(p => p.Key + "=" + p.Value)));                    

            var tempData = new TempDataDictionary(new DefaultHttpContext(), Mock.Of<ITempDataProvider>());
            tempData["search"] = "";          
            //act
            var sut = new SearchController(mockService.Object, mockSession.Object, mockSettings.Object, mockValidation.Object);
            sut.Url = mockUrlHelper.Object;
            sut.TempData = tempData;

            var result = sut.SearchResults("search", null);

            //assert
            var viewResult = result as ViewResult;

            var model = viewResult.Model as SearchResultsVM;
            model.Count.Should().Be(0);
            model.ShowResults.Should().Be(true);
            mockService.Verify();
        }
예제 #2
0
        public void SearchResultsShouldGetCorrectFacetResult()
        {
            //arrange
            var expectedrecord = new Models.SearchResult
            {
                Id       = "testid",
                Name     = "test location",
                Address  = "test address",
                PostCode = "12345",
                Town     = "test town",
                Region   = "test region",
                Category = "test category"
            };
            var expectedResult = new SearchServiceResult()
            {
                Facets = new EditableList <string> {
                    "Test Facet"
                },
                Data = new List <Models.SearchResult>()
            };

            expectedResult.Data.Add(expectedrecord);

            var mockSession = new Mock <ISessionService>();
            var mockService = new Mock <ISearchService>();

            mockService.Setup(x => x.GetPaginatedResult(It.IsAny <string>(), It.IsAny <int>(), It.IsAny <int>(),
                                                        It.IsAny <string>(), It.IsAny <bool>())).ReturnsAsync(expectedResult).Verifiable();
            var mockSettings   = new Mock <IOptions <ApplicationSettings> >();
            var mockValidation = new Mock <IGdsValidation>();

            mockValidation.Setup(x => x.CleanText(It.IsAny <string>(), It.IsAny <bool>(), It.IsAny <List <string> >(), It.IsAny <HashSet <char> >())).Returns("abc");
            var mockUrlHelper = new Mock <IUrlHelper>();

            mockUrlHelper.Setup(x => x.Action(It.IsAny <UrlActionContext>())).Returns((UrlActionContext uac) =>
                                                                                      $"{uac.Controller}/{uac.Action}#{uac.Fragment}?" + string.Join("&",
                                                                                                                                                     new RouteValueDictionary(uac.Values).Select(p => p.Key + "=" + p.Value)));


            var tempData = new TempDataDictionary(new DefaultHttpContext(), Mock.Of <ITempDataProvider>());

            tempData["search"] = "";

            //act
            var sut = new SearchController(mockService.Object, mockSession.Object, mockSettings.Object, mockValidation.Object);

            sut.Url      = mockUrlHelper.Object;
            sut.TempData = tempData;

            var result = sut.SearchResults("search", 1, "TestFacet");

            //assert
            var viewResult = result as ViewResult;

            var model = viewResult.Model as SearchResultsVM;

            model.ShowResults.Should().Be(true);
            model.Facets.Count.Should().Be(1);
            mockService.Verify();
        }
예제 #3
0
        /// <summary>
        /// loads up the view model with paged data when there is a search string and page number
        /// otherwise it just returns a new view model with a show error flag
        /// </summary>
        /// <param name="search"></param>
        /// <param name="pageNo"></param>
        /// <param name="refinementFacets">comma separated list of selected facets to filter on</param>
        /// <returns></returns>
        private SearchResultsVM GetViewModel(string search, int pageNo, string refinementFacets, bool newSearch)
        {
            var returnViewModel = new SearchResultsVM();

            if (!string.IsNullOrEmpty(search) && pageNo > 0)
            {
                SearchServiceResult searchResult = null;
                try
                {
                    searchResult = _searchService.GetPaginatedResult(search, pageNo, _pageSize, refinementFacets, newSearch).Result;
                }
                catch
                {
                    return(null);//search is not working for some reason
                }
                returnViewModel.Data          = searchResult?.Data?.ToList() ?? new List <SearchResult>();
                returnViewModel.ShowResults   = true;
                returnViewModel.Search        = search;
                returnViewModel.PageSize      = _pageSize;
                returnViewModel.Count         = searchResult?.Count ?? 0;
                returnViewModel.Facets        = SubmissionHelper.ConvertList(searchResult?.Facets);
                returnViewModel.TypeOfService = searchResult?.Facets;
                returnViewModel.CurrentPage   = pageNo;

                if (returnViewModel.Facets != null && (!string.IsNullOrEmpty(refinementFacets)) && !newSearch)
                {
                    foreach (var facet in returnViewModel.Facets)
                    {
                        facet.Selected = (refinementFacets.Contains(facet.Text));
                    }
                }
            }

            return(returnViewModel);
        }
예제 #4
0
        public void SearchResultsShouldGetCorrectResult()
        {
            //arrange
            var expectedRecord = new Models.SearchResult
            {
                Id = "testid",
                Name = "test location",
                Address = "test address",
                PostCode = "12345",
                Town = "test town",
                Region = "test region",
                Category = "test category",
                Index = 1,
                Page = 1
            };
            var expectedResult = new SearchServiceResult() { Data = new List<SearchResult>() };
            expectedResult.Data.Add(expectedRecord);           
            mockService.Setup(x => x.GetPaginatedResult(It.IsAny<string>(), It.IsAny<int>(), It.IsAny<int>(),
                It.IsAny<string>(), It.IsAny<bool>())).ReturnsAsync(expectedResult).Verifiable();            
            mockUrlHelper.Setup(x => x.Action(It.IsAny<UrlActionContext>())).Returns((UrlActionContext uac) =>
                $"{uac.Controller}/{uac.Action}#{uac.Fragment}?" + string.Join("&",
                    new RouteValueDictionary(uac.Values).Select(p => p.Key + "=" + p.Value)));
            mockValidation.Setup(x => x.CleanText(It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<List<string>>(), It.IsAny<HashSet<char>>())).Returns("abc");
            
            
            var tempData = new TempDataDictionary(new DefaultHttpContext(), Mock.Of<ITempDataProvider>());
            tempData["search"] = "";
            //act
            var sut = new SearchController(mockService.Object, mockSession.Object, mockSettings.Object, mockValidation.Object);
            sut.Url = mockUrlHelper.Object;
            sut.TempData = tempData;
            var result = sut.SearchResults("search", null);

            //assert
            var viewResult = result as ViewResult;

            var model = viewResult.Model as SearchResultsVM;
            model.ShowResults.Should().Be(true);
            var resultToCompare = model.Data[0];
            resultToCompare.Id.Should().Be(expectedRecord.Id);
            resultToCompare.Name.Should().Be(expectedRecord.Name);
            resultToCompare.Address.Should().Be(expectedRecord.Address);
            resultToCompare.PostCode.Should().Be(expectedRecord.PostCode);
            resultToCompare.Town.Should().Be(expectedRecord.Town);
            resultToCompare.Region.Should().Be(expectedRecord.Region);
            resultToCompare.Category.Should().Be(expectedRecord.Category);
            resultToCompare.Index.Should().Be(1);
            resultToCompare.Page.Should().Be(1);
            mockService.Verify();
        }
예제 #5
0
        public void SearchResultsShouldNotApplyFacetsIfTwoSetsOfFacetsSupplied()
        {
            //arrange
            var search = "test search";
            var expectedrecord = new Models.SearchResult
            {
                Id = "testid",
                Name = "test location",
                Address = "test address",
                PostCode = "12345",
                Town = "test town",
                Region = "test region",
                Category = "test category"
            };
            var expectedResult = new SearchServiceResult() { Data = new List<SearchResult> { expectedrecord } };

            var facets = new List<SelectItem>
            {
                new SelectItem {Text = "Facet1", Selected = true},
                new SelectItem {Text = "Facet2", Selected = false},
                new SelectItem {Text = "Facet3", Selected = true},
                new SelectItem {Text = "Face41", Selected = false}
            };
            var facetsModal = new List<SelectItem>
            {
                new SelectItem {Text = "Facet1", Selected = true},
                new SelectItem {Text = "Facet2", Selected = true},
                new SelectItem {Text = "Facet3", Selected = false},
                new SelectItem {Text = "Face41", Selected = false}
            };
            
            var expectedTotalCount = facets.Count();
            var expectedSelectedCount = 0; //As we are passing content that should never be supplied, we want to never select facets to filter by.

            var facetsList = new EditableList<string>();
            facetsList.AddRange(facets.Select(x => x.Text));
            expectedResult.Facets = facetsList;


            mockSession.Setup(x => x.GetUserSearch()).Returns(search);

            mockService.Setup(x => x.GetPaginatedResult(It.IsAny<string>(), It.IsAny<int>(), It.IsAny<int>(),
                It.IsAny<string>(), It.IsAny<bool>())).ReturnsAsync(expectedResult).Verifiable();

            mockValidation.Setup(x => x.CleanText(It.IsAny<string>(), It.IsAny<bool>(), It.IsAny<List<string>>(), It.IsAny<HashSet<char>>())).Returns(search);

            mockUrlHelper.Setup(x => x.Action(It.IsAny<UrlActionContext>())).Returns((UrlActionContext uac) =>
                $"{uac.Controller}/{uac.Action}#{uac.Fragment}?" + string.Join("&",
                    new RouteValueDictionary(uac.Values).Select(p => p.Key + "=" + p.Value)));


            var tempData = new TempDataDictionary(new DefaultHttpContext(), Mock.Of<ITempDataProvider>());
            tempData["search"] = "";

            //act
            var sut = new SearchController(mockService.Object, mockSession.Object, mockSettings.Object, mockValidation.Object);
            sut.Url = mockUrlHelper.Object;
            sut.TempData = tempData;

            var result = sut.SearchResults(search, facets, facetsModal);

            //assert
            var viewResult = result as ViewResult;

            var model = viewResult.Model as SearchResultsVM;
            model.ShowResults.Should().Be(true);

            //check number of facets is correct
            model.Facets.Count.Should().Be(expectedTotalCount);
            model.FacetsModal.Count.Should().Be(expectedTotalCount);
            model.Facets.Count(x => x.Selected).Should().Be(expectedSelectedCount);
            model.FacetsModal.Count(x => x.Selected).Should().Be(expectedSelectedCount);

            //check the selected facets are correct - in this case no facets should be selected
            var selected = model.Facets.Where(x => x.Selected).Select(x => x.Text).ToList();
            selected.Should().BeEmpty();

            var selectedModal = model.FacetsModal.Where(x => x.Selected).Select(x => x.Text).ToList();
            selectedModal.Should().BeEmpty();

            mockService.Verify();
        }
예제 #6
0
        public async Task <SearchServiceResult> Search(SearchServiceParameter parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }

            IQueryable <Models.Service> services = _context.Services
                                                   .Include(p => p.Images)
                                                   .Include(p => p.Tags)
                                                   .Include(p => p.Shop)
                                                   .Include(p => p.Occurrence).ThenInclude(o => o.Days)
                                                   .Include(p => p.Comments);

            if (parameter.ShopIds != null && parameter.ShopIds.Any())
            {
                services = services.Where(p => parameter.ShopIds.Contains(p.ShopId));
            }

            if (parameter.ShopCategoryIds != null && parameter.ShopCategoryIds.Any())
            {
                services = services.Where(p => parameter.ShopCategoryIds.Contains(p.Shop.CategoryId));
            }

            if (parameter.Tags != null && parameter.Tags.Any())
            {
                services = services.Where(s => s.Tags.Count() > 0 && s.Tags.Any(t => parameter.Tags.Contains(t.TagName)));
            }

            if (parameter.NorthEast != null && parameter.SouthWest != null)
            {
                services = services.Where(p => p.Shop.Latitude >= parameter.SouthWest.Latitude && p.Shop.Latitude <= parameter.NorthEast.Latitude &&
                                          p.Shop.Longitude >= parameter.SouthWest.Longitude && p.Shop.Longitude <= parameter.NorthEast.Longitude);
            }

            if (!string.IsNullOrWhiteSpace(parameter.Name))
            {
                services = services.Where(p => p.Name.ToLowerInvariant().Contains(parameter.Name.ToLowerInvariant()));
            }

            if (parameter.FromDateTime != null && parameter.ToDateTime != null)
            {
                var days = GetDays(parameter.FromDateTime.Value, parameter.ToDateTime.Value);
                services = services.Where(p => p.Occurrence != null && p.Occurrence.StartDate <= parameter.FromDateTime && p.Occurrence.EndDate >= parameter.ToDateTime && p.Occurrence.Days.Any(d => days.Contains(d.DayId)));
            }

            if (parameter.Orders != null)
            {
                foreach (var order in parameter.Orders)
                {
                    services = Order(order, "total_score", s => s.TotalScore, services);
                    services = Order(order, "average_score", s => s.AverageScore, services);
                    services = Order(order, "price", s => s.Price, services);
                    services = Order(order, "update_datetime", s => s.UpdateDateTime, services);
                    services = Order(order, "create_datetime", s => s.CreateDateTime, services);
                }
            }

            var result = new SearchServiceResult
            {
                TotalResults = await services.CountAsync().ConfigureAwait(false),
                StartIndex   = parameter.StartIndex
            };

            if (parameter.IsPagingEnabled)
            {
                services = services.Skip(parameter.StartIndex).Take(parameter.Count);
            }

            result.Content = await services.Select(s => s.ToAggregate()).ToListAsync().ConfigureAwait(false);

            return(result);
        }