private static void ReplaceSpecialCharactersOnFreeTextFields(CourseSearchFilters courseSearchFilters) { courseSearchFilters.SearchTerm = courseSearchFilters.SearchTerm.ReplaceSpecialCharacters(Constants.CourseSearchInvalidCharactersRegexPattern); courseSearchFilters.Location = courseSearchFilters.Location.ReplaceSpecialCharacters(Constants.CourseSearchInvalidCharactersRegexPattern); courseSearchFilters.Town = courseSearchFilters.Town.ReplaceSpecialCharacters(Constants.CourseSearchInvalidCharactersRegexPattern); courseSearchFilters.Provider = courseSearchFilters.Provider.ReplaceSpecialCharacters(Constants.CourseSearchInvalidCharactersRegexPattern); }
public ActionResult Index(CourseSearchFilters model) { if (model == null) { return(Redirect(CourseSearchResultsPage)); } return(Redirect(queryStringBuilder.BuildPathAndQueryString(CourseSearchResultsPage, model))); }
public async Task <CourseSearchResult> GetFilteredData(CourseSearchFilters filters, CourseSearchOrderBy orderBy, int pageSize) { var criteriaProperties = new CourseSearchProperties { Filters = filters, OrderedBy = orderBy, Page = pageSize, }; return(await repository.RetrieveData(criteriaProperties).ConfigureAwait(false)); }
public void CheckIfFilteredDataReturnsData() { //Arrange var repository = A.Fake <IFindACourseRepository>(); var courseProperties = new CourseSearchProperties { Page = 1, }; courseProperties.Filters.SearchTerm = "Maths"; courseProperties.Filters.CourseType = new List <CourseType> { CourseType.All }; courseProperties.Filters.CourseHours = new List <CourseHours> { CourseHours.All }; var courseSearchFilters = new CourseSearchFilters { SearchTerm = "Maths", CourseType = new List <CourseType> { CourseType.All }, CourseHours = new List <CourseHours> { CourseHours.All }, }; var returnedCourseData = new CourseSearchResult { Courses = new List <Course> { new Course { Title = "Maths", CourseId = "1", AttendancePattern = "Online", }, }, }; var findACourseService = new FindACourseService(repository); A.CallTo(() => repository.RetrieveData(A <CourseSearchProperties> .Ignored)).Returns(returnedCourseData); //Act var result = findACourseService.GetFilteredData(courseSearchFilters, CourseSearchOrderBy.Relevance, 1).Result; //Assert A.CallTo(() => repository.RetrieveData(A <CourseSearchProperties> .Ignored)).MustHaveHappenedOnceExactly(); Assert.Equal(returnedCourseData, result); }
public async Task <IActionResult> SearchCourse(string searchTerm) { logService.LogInformation($"{nameof(this.SearchCourse)} has been called"); var model = new BodyViewModel(); var courseSearchFilters = new CourseSearchFilters { CourseType = new List <CourseType> { CourseType.All }, CourseHours = new List <CourseHours> { CourseHours.All }, StartDate = StartDate.Anytime, CourseStudyTime = new List <Fac.AttendancePattern> { Fac.AttendancePattern.Undefined }, SearchTerm = string.IsNullOrEmpty(searchTerm) ? string.Empty : searchTerm, }; model.SideBar = GetSideBarViewModel(); model.SideBar.OrderByOptions = ListFilters.GetOrderByOptions(); model.CurrentSearchTerm = searchTerm; model.SideBar.CurrentSearchTerm = searchTerm; model.RequestPage = 1; try { model.Results = await findACourseService.GetFilteredData(courseSearchFilters, CourseSearchOrderBy.StartDate, 1).ConfigureAwait(true); } catch (Exception ex) { logService.LogError($"{nameof(this.SearchCourse)} threw an exception" + ex.Message); } logService.LogInformation($"{nameof(this.SearchCourse)} generated the model and ready to pass to the view"); return(Results(model)); }
private static BodyViewModel GenerateModel(BodyViewModel model) { var courseTypeList = new List <CourseType>(); var courseHoursList = new List <CourseHours>(); var courseStudyTimeList = new List <Fac.AttendancePattern>(); var selectedStartDateValue = StartDate.Anytime; float selectedDistanceValue = 10; if (model.SelectedDistanceValue != null) { var resultString = Regex.Match(model.SelectedDistanceValue, @"\d+").Value; _ = float.TryParse(resultString, out selectedDistanceValue); } if (model.SideBar.CourseType != null && model.SideBar.CourseType.SelectedIds.Any()) { courseTypeList = ConvertToEnumList <CourseType>(model.SideBar.CourseType.SelectedIds); } if (model.SideBar.CourseHours != null && model.SideBar.CourseHours.SelectedIds.Any()) { courseHoursList = ConvertToEnumList <CourseHours>(model.SideBar.CourseHours.SelectedIds); } if (model.SideBar.CourseStudyTime != null && model.SideBar.CourseStudyTime.SelectedIds.Any()) { courseStudyTimeList = ConvertToEnumList <Fac.AttendancePattern>(model.SideBar.CourseStudyTime.SelectedIds); } if (model.SideBar.SelectedOrderByValue != null) { _ = Enum.TryParse(model.SideBar.SelectedOrderByValue.Replace(" ", string.Empty), true, out CourseSearchOrderBy sortedByCriteria); model.CourseSearchOrderBy = sortedByCriteria; } else { var sortedByCriteria = CourseSearchOrderBy.Relevance; model.CourseSearchOrderBy = sortedByCriteria; } var courseSearchFilters = new CourseSearchFilters { SearchTerm = model.CurrentSearchTerm, CourseType = courseTypeList, CourseHours = courseHoursList, StartDate = selectedStartDateValue, CourseStudyTime = courseStudyTimeList, Distance = selectedDistanceValue, }; model.SideBar.FiltersApplied = model.FromPaging ? model.SideBar.FiltersApplied : true; switch (model.SideBar.StartDateValue) { case "Next 3 months": courseSearchFilters.StartDateTo = DateTime.Today.AddMonths(3); courseSearchFilters.StartDateFrom = DateTime.Today; courseSearchFilters.StartDate = StartDate.SelectDateFrom; break; case "In 3 to 6 months": courseSearchFilters.StartDateFrom = DateTime.Today.AddMonths(3); courseSearchFilters.StartDateTo = DateTime.Today.AddMonths(6); courseSearchFilters.StartDate = StartDate.SelectDateFrom; break; case "More than 6 months": courseSearchFilters.StartDateFrom = DateTime.Today.AddMonths(6); courseSearchFilters.StartDate = StartDate.SelectDateFrom; break; default: courseSearchFilters.StartDate = StartDate.Anytime; break; } if (!string.IsNullOrEmpty(model.SideBar.TownOrPostcode)) { if (model.SideBar.TownOrPostcode.IsPostcode()) { courseSearchFilters.PostCode = NormalizePostcode(model.SideBar.TownOrPostcode); courseSearchFilters.Distance = selectedDistanceValue; courseSearchFilters.DistanceSpecified = true; } else { courseSearchFilters.Town = "\u0022" + model.SideBar.TownOrPostcode + "\u0022"; } } // Enter filters criteria here model.RequestPage = (model.RequestPage > 1) ? model.RequestPage : 1; model.CourseSearchFilters = courseSearchFilters; return(model); }
public string BuildRedirectPathAndQueryString(string courseSearchResultsPage, string searchTerm, CourseSearchFilters courseSearchFilters) { if (courseSearchFilters == null) { return(courseSearchResultsPage); } var parameters = new Dictionary <string, string>(); if (!string.IsNullOrWhiteSpace(searchTerm) || !string.IsNullOrWhiteSpace(courseSearchFilters.Provider)) { if (!string.IsNullOrWhiteSpace(searchTerm)) { parameters.Add(nameof(searchTerm), StringManipulationExtension.GetUrlEncodedString(searchTerm)); } if (!string.IsNullOrWhiteSpace(courseSearchFilters.Provider)) { parameters.Add(nameof(courseSearchFilters.Provider), StringManipulationExtension.GetUrlEncodedString(courseSearchFilters.Provider)); } if (courseSearchFilters.Attendance.Any()) { parameters.Add(nameof(courseSearchFilters.Attendance), string.Join(",", courseSearchFilters.Attendance)); } if (courseSearchFilters.Only1619Courses) { parameters.Add(nameof(courseSearchFilters.Only1619Courses), "true"); } if (!string.IsNullOrWhiteSpace(courseSearchFilters.Location)) { parameters.Add(nameof(CourseSearchFilters.Location), StringManipulationExtension.GetUrlEncodedString(courseSearchFilters.Location)); } if (courseSearchFilters.AttendancePattern.Any()) { parameters.Add(nameof(CourseSearchFilters.AttendancePattern), string.Join(",", courseSearchFilters.AttendancePattern)); } //parameters.Add(nameof(CourseSearchFilters.StartDate), "anytime"); if (courseSearchFilters.StudyMode.Any()) { parameters.Add(nameof(CourseSearchFilters.StudyMode), string.Join(",", courseSearchFilters.StudyMode)); } } var queryParameters = string.Join("&", parameters.Select(kvp => $"{kvp.Key}={kvp.Value}")); return($"{courseSearchResultsPage}?{queryParameters}"); }