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(); }
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(); }
/// <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); }
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(); }
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(); }
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); }