private static void PopulateSelectFromDate(CourseFiltersViewModel viewModel) { if (viewModel.StartDate == StartDate.SelectDateFrom && DateTime.TryParse( $"{viewModel.StartDateYear}-{viewModel.StartDateMonth}-{viewModel.StartDateDay}", out var chosenDate)) { viewModel.StartDateFrom = chosenDate; } }
public static void Dfc9208ActiveFiltersViewTests(CourseFiltersViewModel viewModel) { viewModel = viewModel ?? new CourseFiltersViewModel(); // Assign var searchResultsView = new _MVC_Views_CourseSearchResults_ActiveFilters_cshtml(); // Act var htmlDom = searchResultsView.RenderAsHtml(viewModel); // Assert if (viewModel.CourseHours != CourseHours.All) { AssertTagInnerTextValue(htmlDom, viewModel.CourseHoursDisplayName, "p"); } if (viewModel.CourseType != CourseType.All) { AssertTagInnerTextValue(htmlDom, viewModel.CourseTypeDisplayName, "p"); } if (viewModel.StartDate == StartDate.Anytime) { AssertTagInnerTextValueDoesNotExist(htmlDom, viewModel.ActiveFiltersStartingFromText, "span"); } else { AssertTagInnerTextValue(htmlDom, viewModel.ActiveFiltersStartingFromText, "span"); } if (viewModel.StartDate == StartDate.FromToday) { AssertTagInnerTextValue(htmlDom, DateTime.Now.ToString(Constants.CourseSearchFrontEndStartDateFormat), "p"); } if (viewModel.StartDate == StartDate.SelectDateFrom) { AssertTagInnerTextValue(htmlDom, viewModel.StartDateFrom.ToString(Constants.CourseSearchFrontEndStartDateFormat), "p"); } if (!string.IsNullOrWhiteSpace(viewModel.Location)) { AssertTagInnerTextValue(htmlDom, viewModel.Location, "p"); } if (!string.IsNullOrWhiteSpace(viewModel.Provider)) { AssertTagInnerTextValue(htmlDom, viewModel.Provider, "p"); AssertTagInnerTextValue(htmlDom, viewModel.ActiveFiltersProvidedByText, "span"); } if (viewModel.IsDistanceLocation) { AssertTagInnerTextValue(htmlDom, $"{viewModel.Distance} {viewModel.ActiveFiltersMilesText}", "p"); } }
public void GetActiveFilterOptionsTest(CourseFiltersViewModel courseFiltersModel, Dictionary <string, string> expectedDictionary) { //Assign var courseSearchConverter = new CourseSearchViewModelService(); //Act var result = courseSearchConverter.GetActiveFilterOptions(courseFiltersModel); //Assert result.Should().BeEquivalentTo(expectedDictionary); }
public void SearchTermIsHTMLEncodedWhenReturnedToUser() { var courseSearchResponse = new CourseSearchResult { Courses = GetCourses(0), ResultProperties = new CourseSearchResultProperties { Page = 1, TotalPages = 1, TotalResultCount = 0 } }; var searchFilter = new CourseFiltersViewModel() { Location = null, SearchTerm = "<script>alert('here')</script>" }; // setupFakes A.CallTo(() => fakeCourseSearchService.SearchCoursesAsync(A <CourseSearchProperties> ._)).Returns(courseSearchResponse); var searchProperties = new CourseSearchProperties { }; // Assign var controller = new CourseSearchResultsController(fakeApplicationLogger, fakeCourseSearchService, asyncHelper, fakeCourseSearchViewModelService, fakeWebAppContext, mapperCfg) { }; // Act var controllerResult = controller.WithCallTo(contrl => contrl.Index(searchFilter, searchProperties)); // Assert controllerResult.ShouldRenderView("SearchResults").WithModel <CourseSearchResultsViewModel>( vm => { vm.NoTrainingCoursesFoundText.Should().Contain(HttpUtility.HtmlEncode(searchFilter.SearchTerm)); }); }
public void LocationToPostcodeTest(string location, string expectedPostCode, string expectedTown) { var courseSearchResponse = new CourseSearchResult { Courses = GetCourses(1), ResultProperties = new CourseSearchResultProperties { Page = 1, TotalPages = 1, TotalResultCount = 1 } }; var searchProperties = new CourseSearchProperties(); var searchFilter = new CourseFiltersViewModel() { Location = location, SearchTerm = "AnySearchTerm" }; // setupFakes A.CallTo(() => fakeCourseSearchService.SearchCoursesAsync(A <CourseSearchProperties> ._)).Returns(courseSearchResponse); // Assign var controller = new CourseSearchResultsController(fakeApplicationLogger, fakeCourseSearchService, asyncHelper, fakeCourseSearchViewModelService, fakeWebAppContext, mapperCfg) { }; // Act var controllerResult = controller.WithCallTo(contrl => contrl.Index(searchFilter, searchProperties)); // Assert controllerResult.ShouldRenderView("SearchResults").WithModel <CourseSearchResultsViewModel>( vm => { vm.CourseFiltersModel.Postcode.Should().BeEquivalentTo(expectedPostCode); vm.CourseFiltersModel.Town.Should().BeEquivalentTo(expectedTown); }); }
public void OrderByDistanceWithNoPostcodeTest() { var courseSearchResponse = new CourseSearchResult { Courses = GetCourses(2), ResultProperties = new CourseSearchResultProperties { Page = 1, TotalPages = 1, TotalResultCount = 2 } }; var searchFilter = new CourseFiltersViewModel() { Location = null, SearchTerm = "AnySearchTerm" }; // setupFakes A.CallTo(() => fakeCourseSearchService.SearchCoursesAsync(A <CourseSearchProperties> ._)).Returns(courseSearchResponse); var searchProperties = new CourseSearchProperties { OrderedBy = CourseSearchOrderBy.Distance }; // Assign var controller = new CourseSearchResultsController(fakeApplicationLogger, fakeCourseSearchService, asyncHelper, fakeCourseSearchViewModelService, fakeWebAppContext, mapperCfg) { }; // Act var controllerResult = controller.WithCallTo(contrl => contrl.Index(searchFilter, searchProperties)); // Assert controllerResult.ShouldRenderView("SearchResults").WithModel <CourseSearchResultsViewModel>(); A.CallTo(() => fakeCourseSearchViewModelService.GetOrderByLinks(A <string> ._, CourseSearchOrderBy.Distance)).MustHaveHappened(); }
public void Dfc9208FiltersViewTests(CourseFiltersViewModel viewModel) { viewModel = viewModel ?? new CourseFiltersViewModel(); // Assign var searchResultsView = new _MVC_Views_CourseSearchResults_Filters_cshtml(); // Act var htmlDom = searchResultsView.RenderAsHtml(viewModel); // Assert AssertTagInnerTextValue(htmlDom, viewModel.StartDateSectionText, "h2"); AssertTagInnerTextValue(htmlDom, viewModel.CourseHoursSectionText, "h2"); AssertTagInnerTextValue(htmlDom, viewModel.CourseTypeSectionText, "h2"); AssertTagInnerTextValue(htmlDom, viewModel.ApplyFiltersText, "button"); AssertElementExistsByAttributeAndValue(htmlDom, "input", "name", nameof(CourseFiltersViewModel.Location)); AssertElementExistsByAttributeAndValue(htmlDom, "input", "name", nameof(CourseFiltersViewModel.Provider)); AssertElementExistsByAttributeAndTypeAndValue(htmlDom, "input", "name", nameof(CourseFiltersViewModel.CourseHours), "radio"); AssertElementIsSelectedByAttributeAndValue(htmlDom, "input", "value", viewModel.CourseHours.ToString()); AssertElementExistsByAttributeAndTypeAndValue(htmlDom, "input", "name", nameof(CourseFiltersViewModel.StartDate), "radio"); AssertElementIsSelectedByAttributeAndValue(htmlDom, "input", "value", viewModel.StartDate.ToString()); AssertElementExistsByAttributeAndTypeAndValue(htmlDom, "input", "name", nameof(CourseFiltersViewModel.CourseType), "radio"); AssertElementIsSelectedByAttributeAndValue(htmlDom, "input", "value", viewModel.CourseType.ToString()); }
public void IndexTests(CourseFiltersViewModel searchFilter, string resetFilterText, string pageTitle, string courseSearchResultsPage, string courseDetailsPage, CourseSearchOrderBy orderBy, CourseSearchResult courseSearchResponse) { courseSearchResponse = courseSearchResponse ?? new CourseSearchResult(); searchFilter = searchFilter ?? new CourseFiltersViewModel(); // setupFakes A.CallTo(() => fakeCourseSearchService.SearchCoursesAsync(A <CourseSearchProperties> ._)).Returns(courseSearchResponse); var searchProperties = new CourseSearchProperties { OrderedBy = orderBy }; // Assign var controller = new CourseSearchResultsController(fakeApplicationLogger, fakeCourseSearchService, asyncHelper, fakeCourseSearchViewModelService, fakeWebAppContext, mapperCfg) { ResetFilterText = resetFilterText, PageTitle = pageTitle, CourseSearchResultsPage = courseSearchResultsPage, CourseDetailsPage = courseDetailsPage, RecordsPerPage = 40, AdvancedLoanProviderLabel = nameof(CourseSearchResultsController.AdvancedLoanProviderLabel), LocationLabel = nameof(CourseSearchResultsController.LocationLabel), ProviderLabel = nameof(CourseSearchResultsController.ProviderLabel), StartDateLabel = nameof(CourseSearchResultsController.StartDateLabel), OrderByText = nameof(CourseSearchResultsController.OrderByText), StartDateOrderByText = nameof(CourseSearchResultsController.StartDateOrderByText), DistanceOrderByText = nameof(CourseSearchResultsController.DistanceOrderByText), RelevanceOrderByText = nameof(CourseSearchResultsController.RelevanceOrderByText), NoTrainingCoursesFoundText = nameof(CourseSearchResultsController.NoTrainingCoursesFoundText), ApplyFiltersText = nameof(CourseSearchResultsController.ApplyFiltersText), CourseTypeSectionText = nameof(CourseSearchResultsController.CourseTypeSectionText), CourseHoursSectionText = nameof(CourseSearchResultsController.CourseHoursSectionText), StartDateSectionText = nameof(CourseSearchResultsController.StartDateSectionText), SearchForCourseNameText = nameof(CourseSearchResultsController.SearchForCourseNameText), WithinText = nameof(CourseSearchResultsController.WithinText), Only1619CoursesText = nameof(CourseSearchResultsController.Only1619CoursesText), StartDateExampleText = nameof(CourseSearchResultsController.StartDateExampleText) }; // Act var controllerResult = controller.WithCallTo(contrl => contrl.Index( searchFilter, searchProperties)); // Assert controllerResult.ShouldRenderView("SearchResults").WithModel <CourseSearchResultsViewModel>( vm => { vm.PageTitle.Should().BeEquivalentTo(controller.PageTitle); vm.ResetFiltersText.Should().BeEquivalentTo(controller.ResetFilterText); vm.ResetFilterUrl.OriginalString.Should().NotBeEmpty(); }); if (!string.IsNullOrWhiteSpace(searchFilter.SearchTerm)) { A.CallTo(() => fakeCourseSearchService.SearchCoursesAsync(A <CourseSearchProperties> ._)).MustHaveHappened(); if (courseSearchResponse.Courses.Any()) { A.CallTo(() => fakeCourseSearchViewModelService.GetOrderByLinks(A <string> ._, A <CourseSearchOrderBy> ._)).MustHaveHappened(); A.CallTo(() => fakeCourseSearchViewModelService.SetupViewModelPaging(A <CourseSearchResultsViewModel> ._, A <CourseSearchResult> ._, A <string> ._, A <int> ._)).MustHaveHappened(); } } else { A.CallTo(() => fakeCourseSearchService.SearchCoursesAsync(A <CourseSearchProperties> ._)).MustNotHaveHappened(); A.CallTo(() => fakeCourseSearchViewModelService.GetOrderByLinks(A <string> ._, A <CourseSearchOrderBy> ._)).MustNotHaveHappened(); A.CallTo(() => fakeCourseSearchViewModelService.SetupViewModelPaging(A <CourseSearchResultsViewModel> ._, A <CourseSearchResult> ._, A <string> ._, A <int> ._)).MustNotHaveHappened(); } }
public ActionResult Index(CourseFiltersViewModel filtersInput, CourseSearchProperties inputSearchProperties) { var cleanedSearchTerm = filtersInput.SearchTerm.ReplaceSpecialCharacters(Constants.CourseSearchInvalidCharactersRegexPattern); var courseSearchResults = new CourseSearchResultsViewModel { CourseFiltersModel = filtersInput, ResetFilterUrl = new Uri($"{CourseSearchResultsPage}?{nameof(CourseSearchFilters.SearchTerm)}={filtersInput.SearchTerm}", UriKind.RelativeOrAbsolute), NoTrainingCoursesFoundText = NoTrainingCoursesFoundText.Replace(SearchTermTokenToReplace, $"'{HttpUtility.HtmlEncode(filtersInput.SearchTerm)}'"), }; CourseSearchOrderBy originalCourseSearchOrderBy = inputSearchProperties.OrderedBy; if (!filtersInput.IsDistanceLocation) { filtersInput.Town = filtersInput.Location; //Make CD API behave the same way as tribal if there is no postcode, the order by relevence if distance is selected. if (inputSearchProperties.OrderedBy == CourseSearchOrderBy.Distance) { inputSearchProperties.OrderedBy = CourseSearchOrderBy.Relevance; } } else { filtersInput.Postcode = filtersInput.Location; } if (!string.IsNullOrEmpty(cleanedSearchTerm)) { //create a new object if invoked from landing page var courseSearchProperties = inputSearchProperties ?? new CourseSearchProperties(); courseSearchProperties.Count = RecordsPerPage; courseSearchProperties.Filters = mapper.Map <CourseSearchFilters>(filtersInput); courseSearchProperties.Filters.DistanceSpecified = filtersInput.IsDistanceLocation && (filtersInput.Distance > 0); ReplaceSpecialCharactersOnFreeTextFields(courseSearchProperties.Filters); var combinedDate = $"{filtersInput.StartDateYear}/{filtersInput.StartDateMonth}/{filtersInput.StartDateDay}"; if (DateTime.TryParse(combinedDate, out DateTime result)) { courseSearchProperties.Filters.StartDateFrom = result; } var response = asyncHelper.Synchronise(() => courseSearchService.SearchCoursesAsync(courseSearchProperties)); if (response.Courses.Any()) { foreach (var course in response.Courses) { course.CourseLink = $"{CourseDetailsPage}?{nameof(CourseDetails.CourseId)}={course.CourseId}&r={course.RunId}&referralPath={context.GetUrlEncodedPathAndQuery()}"; courseSearchResults.Courses.Add(new CourseListingViewModel { Course = course, AdvancedLoanProviderLabel = AdvancedLoanProviderLabel, LocationLabel = LocationLabel, ProviderLabel = ProviderLabel, StartDateLabel = StartDateLabel }); } response.ResultProperties.OrderedBy = originalCourseSearchOrderBy; SetupResultsViewModel(courseSearchResults, response); } SetupStartDateDisplayData(courseSearchResults); } SetupWidgetLabelsAndTextDefaults(courseSearchResults); return(View("SearchResults", courseSearchResults)); }