Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
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));
        }
        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();
        }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
        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));
            });
        }
Exemplo n.º 12
0
        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();
        }
Exemplo n.º 13
0
        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));
        }
Exemplo n.º 18
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();
            }
        }