public void GetOrderByLinksTest(string searchUrl, CourseSearchOrderBy courseSearchSortBy, OrderByLinks expectedOrderByLinks)
        {
            //Assign
            var courseSearchConverter = new CourseSearchViewModelService();

            //Act
            var result = courseSearchConverter.GetOrderByLinks(searchUrl, courseSearchSortBy);

            //Assert
            result.Should().BeEquivalentTo(expectedOrderByLinks);
        }
        public OrderByLinks GetOrderByLinks(string resultsPage, CourseSearchOrderBy orderBy)
        {
            var partialQueryString = context.GetQueryStringExcluding(new[] { $"{nameof(CourseSearchProperties.OrderedBy)}" });

            return(new OrderByLinks
            {
                OrderBy = orderBy,
                OrderByRelevanceUrl = new Uri($"{resultsPage}?{partialQueryString.ToString()}&{nameof(CourseSearchProperties.OrderedBy)}={nameof(CourseSearchOrderBy.Relevance)}", UriKind.RelativeOrAbsolute),
                OrderByDistanceUrl = new Uri($"{resultsPage}?{partialQueryString.ToString()}&{nameof(CourseSearchProperties.OrderedBy)}={nameof(CourseSearchOrderBy.Distance)}", UriKind.RelativeOrAbsolute),
                OrderByStartDateUrl = new Uri($"{resultsPage}?{partialQueryString.ToString()}&{nameof(CourseSearchProperties.OrderedBy)}={nameof(CourseSearchOrderBy.StartDate)}", UriKind.RelativeOrAbsolute)
            });
        }
        public void GetOrderByLinksTest(string searchUrl, CourseSearchOrderBy courseSearchSortBy, OrderByLinks expectedOrderByLinks)
        {
            //Assign
            var fakeWebAppContext     = A.Fake <IWebAppContext>();
            var courseSearchConverter = new CourseSearchResultsViewModelBullder(fakeWebAppContext);

            A.CallTo(() => fakeWebAppContext.GetQueryStringExcluding(A <IEnumerable <string> > ._)).Returns("a=b");

            //Act
            var result = courseSearchConverter.GetOrderByLinks(searchUrl, courseSearchSortBy);

            //Assert
            result.Should().BeEquivalentTo(expectedOrderByLinks);
        }
예제 #4
0
        private static SortType GetSortType(CourseSearchOrderBy courseSearchSortBy)
        {
            switch (courseSearchSortBy)
            {
            case CourseSearchOrderBy.Distance:
                return(SortType.D);

            case CourseSearchOrderBy.StartDate:
                return(SortType.S);

            default:
            case CourseSearchOrderBy.Relevance:
                return(SortType.A);
            }
        }
        public void Dfc7055OrderLinksViewTests(CourseSearchOrderBy courseSearchSortBy)
        {
            // Assign
            var searchResultsView = new _MVC_Views_CourseSearchResults_OrderByLinks_cshtml();
            var viewModel         = new OrderByLinks
            {
                OrderBy = courseSearchSortBy,
                StartDateOrderByText = nameof(OrderByLinks.StartDateOrderByText),
                DistanceOrderByText  = nameof(OrderByLinks.DistanceOrderByText),
                RelevanceOrderByText = nameof(OrderByLinks.RelevanceOrderByText)
            };

            // Act
            var htmlDom = searchResultsView.RenderAsHtml(viewModel);

            // Assert
            switch (courseSearchSortBy)
            {
            case CourseSearchOrderBy.Relevance:
                AssertTagInnerTextValue(htmlDom, viewModel.RelevanceOrderByText, "span");
                break;

            case CourseSearchOrderBy.Distance:
                AssertTagInnerTextValue(htmlDom, viewModel.DistanceOrderByText, "span");
                break;

            default:
            case CourseSearchOrderBy.StartDate:
                AssertTagInnerTextValue(htmlDom, viewModel.StartDateOrderByText, "span");
                break;
            }

            var orderList = new List <string>
            {
                viewModel.RelevanceOrderByText,
                viewModel.StartDateOrderByText,
                viewModel.DistanceOrderByText
            };

            AssertOrderOfTextDisplayed(
                htmlDom,
                orderList);
        }
예제 #6
0
        internal static int MapToSortBy(this CourseSearchOrderBy orderBy)
        {
            var result = SortBy.Undefined;

            switch (orderBy)
            {
            case CourseSearchOrderBy.Relevance:
                result = SortBy.Relevance;
                break;

            case CourseSearchOrderBy.StartDate:
                result = SortBy.AscendingStartDate;
                break;

            case CourseSearchOrderBy.Distance:
                result = SortBy.Distance;
                break;

            default:
                break;
            }

            return((int)result);
        }
예제 #7
0
        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));
        }
예제 #8
0
        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));
        }
        //private void SetupFilterLists(string attendance, string studyMode, string qualificationLevel, string pattern, string distance, string dfe1619Funded, string location, string startDate, string providerKeyword, TrainingCourseResultsViewModel viewModel)
        //{
        //    viewModel.CourseFiltersModel.Location = location;
        //    viewModel.CourseFiltersModel.ProviderKeyword = providerKeyword;
        //    viewModel.CourseFiltersModel.AttendanceSelectedList =
        //        courseSearchConverter.GetFilterSelectItems(
        //            $"{nameof(CourseFiltersModel)}.{nameof(CourseFiltersModel.AttendanceMode)}", AttendanceModesSource.Split(','), attendance);

        //    viewModel.CourseFiltersModel.PatternSelectedList =
        //        courseSearchConverter.GetFilterSelectItems(
        //            $"{nameof(CourseFiltersModel)}.{nameof(CourseFiltersModel.AttendancePattern)}", AttendancePatternModesSource.Split(','), pattern);

        //    viewModel.CourseFiltersModel.QualificationSelectedList =
        //        courseSearchConverter.GetFilterSelectItems(
        //            $"{nameof(CourseFiltersModel)}.{nameof(CourseFiltersModel.QualificationLevel)}", QualificationLevelSource.Split(','), qualificationLevel);

        //    viewModel.CourseFiltersModel.StudyModeSelectedList =
        //        courseSearchConverter.GetFilterSelectItems(
        //            $"{nameof(CourseFiltersModel)}.{nameof(CourseFiltersModel.StudyMode)}", StudyModesSource.Split(','), studyMode);

        //    viewModel.CourseFiltersModel.DistanceSelectedList =
        //        courseSearchConverter.GetFilterSelectItems(
        //            $"{nameof(CourseFiltersModel)}.{nameof(CourseFiltersModel.Distance)}", DistanceSource.Split(','), distance);

        //    viewModel.CourseFiltersModel.AgeSuitabilitySelectedList =
        //        courseSearchConverter.GetFilterSelectItems(
        //            $"{nameof(CourseFiltersModel)}.{nameof(CourseFiltersModel.AgeSuitability)}", AgeSuitabilitySource.Split(','), dfe1619Funded);

        //    viewModel.CourseFiltersModel.StartDateSelectedList =
        //        courseSearchConverter.GetFilterSelectItems(
        //            $"{nameof(CourseFiltersModel)}.{nameof(CourseFiltersModel.StartDate)}", StartDateSource.Split(','), startDate);
        //}
        private void SetupSearchLinks(string searchTerm, CourseSearchResultsViewModel viewModel, string pathQuery, CourseSearchOrderBy sortBy)
        {
            viewModel.OrderByLinks   = courseSearchViewModelService.GetOrderByLinks(pathQuery, sortBy);
            viewModel.ResetFilterUrl = new Uri($"{CourseSearchResultsPage}?searchterm={searchTerm}", UriKind.RelativeOrAbsolute);
        }