public CourseListInput GetCourseSearchInput(string courseName, CourseSearchProperties courseSearchProperties) { if (courseSearchProperties == null) { throw new ArgumentNullException(nameof(courseSearchProperties)); } var apiRequest = new CourseListInput { CourseListRequest = new CourseListRequestStructure { CourseSearchCriteria = new SearchCriteriaStructure { APIKey = configuration.GetConfig <string>(Constants.CourseSearchApiKey), SubjectKeyword = courseName, EarliestStartDate = null, AttendanceModes = convertTribalCodesService.GetTribalAttendanceModes(string.Join(",", courseSearchProperties.Filters.Attendance ?? new List <string>())), StudyModes = convertTribalCodesService.GetTribalStudyModes(string.Join(",", courseSearchProperties.Filters.StudyMode ?? new List <string>())), DFE1619Funded = courseSearchProperties.Filters.Only1619Courses ? "Y" : null, AttendancePatterns = convertTribalCodesService.GetTribalAttendancePatterns(string.Join(",", courseSearchProperties.Filters.AttendancePattern ?? new List <string>())), ProviderKeyword = courseSearchProperties.Filters.Provider, Distance = courseSearchProperties.Filters.Distance, DistanceSpecified = courseSearchProperties.Filters.DistanceSpecified, Location = courseSearchProperties.Filters.Location }, RecordsPerPage = courseSearchProperties.Count.ToString(), PageNo = courseSearchProperties.Page.ToString(), SortBy = GetSortType(courseSearchProperties.OrderedBy), SortBySpecified = true } }; return(apiRequest); }
public CourseListInput GetCourseSearchInput(CourseSearchProperties courseSearchProperties) { if (courseSearchProperties == null) { throw new ArgumentNullException(nameof(courseSearchProperties)); } var apiRequest = new CourseListInput { CourseListRequest = new CourseListRequestStructure { CourseSearchCriteria = new SearchCriteriaStructure { APIKey = configuration.GetConfig <string>(Constants.CourseSearchApiKey), SubjectKeyword = courseSearchProperties.Filters.SearchTerm, EarliestStartDate = courseBusinessRules.GetEarliestStartDate(courseSearchProperties.Filters.StartDate, courseSearchProperties.Filters.StartDateFrom), AttendanceModes = convertTribalCodes.GetTribalAttendanceModes(courseSearchProperties.Filters.CourseType), StudyModes = convertTribalCodes.GetTribalStudyModes(courseSearchProperties.Filters.CourseHours), ProviderKeyword = courseSearchProperties.Filters.Provider, Distance = courseSearchProperties.Filters.DistanceSpecified ? courseSearchProperties.Filters.Distance : default(float), DistanceSpecified = courseSearchProperties.Filters.DistanceSpecified, Location = courseSearchProperties.Filters.Location }, RecordsPerPage = courseSearchProperties.Count.ToString(), PageNo = courseSearchProperties.Page.ToString(), SortBy = GetSortType(courseSearchProperties.OrderedBy), SortBySpecified = true } }; return(apiRequest); }
public async Task <CourseSearchResult> SearchCoursesAsync(CourseSearchProperties courseSearchProperties) { if (string.IsNullOrWhiteSpace(courseSearchProperties.Filters.SearchTerm)) { return(await Task.FromResult <CourseSearchResult>(null)); } var response = new CourseSearchResult(); var request = buildTribalMessage.GetCourseSearchInput(courseSearchProperties); auditRepository.CreateAudit(request); var apiResult = await serviceHelper.UseAsync <ServiceInterface, CourseListOutput>(async x => await tolerancePolicy.ExecuteAsync(() => x.CourseListAsync(request), Constants.CourseSearchEndpointConfigName, FaultToleranceType.CircuitBreaker), Constants.CourseSearchEndpointConfigName); auditRepository.CreateAudit(apiResult); response.ResultProperties.TotalPages = Convert.ToInt32(apiResult?.CourseListResponse?.ResultInfo?.NoOfPages); response.ResultProperties.TotalResultCount = Convert.ToInt32(apiResult?.CourseListResponse?.ResultInfo?.NoOfRecords); response.ResultProperties.Page = Convert.ToInt32(apiResult?.CourseListResponse?.ResultInfo?.PageNo); response.Courses = apiResult?.ConvertToSearchCourse(); response.ResultProperties.OrderedBy = courseSearchProperties.OrderedBy; return(response); }
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 async Task CourseSearch() { var courseSearchRequest = new CourseSearchProperties() { Filters = new CourseSearchFilters { SearchTerm = "maths", StartDate = StartDate.FromToday, StartDateFrom = DateTime.Today }, }; var courseSearchService = new CourseSearchApiService(this.findACourseClient, this.auditService, this.mapper); var searchResponse = await courseSearchService.SearchCoursesAsync(courseSearchRequest).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 void GetCourseSearchInputTest(CourseSearchProperties courseSearchProperties, CourseListInput expectedCourseListInput) { // Assign var buildTribalMessageService = new TribalMessageBuilder(fakeConvertTribalCodesService, fakeConfiguration, fakeCourseBusinessRules); //Act var result = buildTribalMessageService.GetCourseSearchInput(courseSearchProperties); //Assert result.Should().BeEquivalentTo(expectedCourseListInput); A.CallTo(() => fakeConvertTribalCodesService.GetTribalAttendanceModes(A <CourseType> ._)).MustHaveHappened(); A.CallTo(() => fakeCourseBusinessRules.GetEarliestStartDate(A <StartDate> ._, A <DateTime> ._)).MustHaveHappened(); A.CallTo(() => fakeConvertTribalCodesService.GetTribalStudyModes(A <CourseHours> ._)).MustHaveHappened(); A.CallTo(() => fakeConfiguration.GetConfig <string>(A <string> ._)).MustHaveHappened(1, Times.Exactly); }
public void GetCourseSearchInputTest(string courseName, CourseSearchProperties courseSearchProperties, CourseListInput expectedCourseListInput) { // Assign var buildTribalMessageService = new BuildTribalMessageService(fakeConvertTribalCodesService, fakeConfiguration); //Act var result = buildTribalMessageService.GetCourseSearchInput(courseName, courseSearchProperties); //Assert result.Should().BeEquivalentTo(expectedCourseListInput); A.CallTo(() => fakeConvertTribalCodesService.GetTribalAttendanceModes(A <string> ._)).MustHaveHappened(); A.CallTo(() => fakeConvertTribalCodesService.GetTribalAttendancePatterns(A <string> ._)).MustHaveHappened(); A.CallTo(() => fakeConvertTribalCodesService.GetTribalStudyModes(A <string> ._)).MustHaveHappened(); A.CallTo(() => fakeConfiguration.GetConfig <string>(A <string> ._)).MustHaveHappened(1, Times.Exactly); }
public async Task CourseSearch() { var courseSearchRequest = new CourseSearchProperties { Filters = new CourseSearchFilters { SearchTerm = "Surveying" }, OrderedBy = CourseSearchOrderBy.Relevance, }; var courseSearchService = new CourseSearchApiService(findACourseClient, auditService, mapper); var searchResponse = await courseSearchService.SearchCoursesAsync(courseSearchRequest).ConfigureAwait(false); searchResponse.Should().NotBeNull(); }
public async Task SearchCoursesAsyncWhenEmptyStringKeywordsSentThenNullIsReturned() { // Arrange var courseSearchProperties = new CourseSearchProperties { Filters = new CourseSearchFilters { SearchTerm = string.Empty }, }; // Act var result = await defaultCourseSearchService.SearchCoursesAsync(courseSearchProperties).ConfigureAwait(false); // Assert Assert.Null(result); }
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 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 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 async Task <CourseSearchResult> RetrieveData(CourseSearchProperties properties) { return(await courseSearchApiService.SearchCoursesAsync(properties).ConfigureAwait(false)); }
public ActionResult Index(string searchTerm, string attendance, string studyMode, string attendancePattern, string location, string sortBy, string startDate, string provider, bool only1619Courses = false, int page = 1) { var viewModel = new CourseSearchResultsViewModel { SearchTerm = searchTerm }; var cleanCourseName = StringManipulationExtension.ReplaceSpecialCharacters(searchTerm, InvalidCharactersRegexPattern); if (!string.IsNullOrEmpty(cleanCourseName)) { var courseSearchProperties = new CourseSearchProperties { Page = page, Count = RecordsPerPage, OrderedBy = GetSortBy(sortBy), Filters = new CourseSearchFilters { Attendance = attendance?.Split(','), StudyMode = studyMode?.Split(','), Only1619Courses = only1619Courses, AttendancePattern = attendancePattern?.Split(','), Location = StringManipulationExtension.ReplaceSpecialCharacters(location, InvalidCharactersRegexPattern), Provider = StringManipulationExtension.ReplaceSpecialCharacters(provider, InvalidCharactersRegexPattern), StartDate = startDate } }; var response = asyncHelper.Synchronise(() => courseSearchService.SearchCoursesAsync(cleanCourseName, courseSearchProperties)); if (response.Courses.Any()) { foreach (var course in response.Courses) { course.CourseUrl = $"{CourseDetailsPage}?courseid={course.CourseId}"; viewModel.Courses.Add(new CourseListingViewModel { Course = course, AdvancedLoanProviderLabel = AdvancedLoanProviderLabel, LocationLabel = LocationLabel, ProviderLabel = ProviderLabel, StartDateLabel = StartDateLabel }); } var pathQuery = Request?.Url?.PathAndQuery; if (!string.IsNullOrWhiteSpace(pathQuery) && pathQuery.IndexOf("&page=", StringComparison.InvariantCultureIgnoreCase) > 0) { pathQuery = pathQuery.Substring(0, pathQuery.IndexOf("&page=", StringComparison.InvariantCultureIgnoreCase)); } courseSearchViewModelService.SetupPaging(viewModel, response, pathQuery, RecordsPerPage, CourseSearchResultsPage); SetupSearchLinks(searchTerm, viewModel, pathQuery, response.ResultProperties.OrderedBy); } // SetupFilterDisplayData(attendance, studymode, qualificationLevel, distance, dfe1619Funded, pattern, location, startDate, provider, viewModel); } viewModel.NoTrainingCoursesFoundText = string.IsNullOrWhiteSpace(searchTerm) ? string.Empty : NoTrainingCoursesFoundText; SetupWidgetDefaults(viewModel); return(View("SearchResults", viewModel)); }
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)); }
public async Task <CourseSearchResult> SearchCoursesAsync(CourseSearchProperties courseSearchProperties) { var result = await tolerancePolicy.ExecuteAsync(async() => await apiService.SearchCoursesAsync(mapper.Map <FindACourseClient.CourseSearchProperties>(courseSearchProperties)).ConfigureAwait(false), Constants.CourseSearchEndpointConfigName, FaultToleranceType.CircuitBreaker).ConfigureAwait(false); return(mapper.Map <CourseSearchResult>(result)); }
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(); } }