public void CategoryMappingTest()
        {
            const ApprenticeshipSearchMode searchMode = ApprenticeshipSearchMode.Category;
            const string keywords            = "chef";
            const string location            = "Warwick";
            const int    withinDistance      = 15;
            const string apprenticeshipLevel = "Advanced";
            const string category            = "MFP";
            var          subCategories       = new[] { "513", "540" };
            const string searchField         = "JobTitle";

            var savedSearch = new SavedSearchBuilder()
                              .WithSearchMode(searchMode)
                              .WithKeywords(keywords)
                              .WithLocation(location)
                              .WithinDistance(withinDistance)
                              .WithApprenticeshipLevel(apprenticeshipLevel)
                              .WithCategory(category)
                              .WithSubCategories(subCategories)
                              .WithSearchField(searchField)
                              .Build();

            var parameters = SearchParametersFactory.Create(savedSearch);

            parameters.Should().NotBeNull();
            parameters.Keywords.Should().BeNullOrEmpty();
            parameters.Location.Should().NotBeNull();
            parameters.Location.Name.Should().Be(location);
            parameters.SearchRadius.Should().Be(withinDistance);
            parameters.ApprenticeshipLevel.Should().Be(apprenticeshipLevel);
            parameters.CategoryCode.Should().Be(category);
            parameters.SubCategoryCodes.Should().BeEquivalentTo(subCategories);
            parameters.SearchField.Should().Be(ApprenticeshipSearchField.All);
        }
        public void LatLongTest()
        {
            var savedSearch = new SavedSearchBuilder().WithLatLong(1.1, 2.1).Build();
            var parameters  = SearchParametersFactory.Create(savedSearch);

            parameters.Location.Should().NotBeNull();
            parameters.Location.GeoPoint.Should().NotBeNull();
            parameters.Location.GeoPoint.Latitude.Should().Be(1.1);
            parameters.Location.GeoPoint.Longitude.Should().Be(2.1);
        }
        public void DefaultsTest()
        {
            var savedSearch = new SavedSearchBuilder().Build();
            var parameters  = SearchParametersFactory.Create(savedSearch);

            parameters.Should().NotBeNull();
            parameters.PageSize.Should().Be(5);
            parameters.PageNumber.Should().Be(1);
            parameters.SortType.Should().Be(VacancySearchSortType.RecentlyAdded);
            parameters.VacancyLocationType.Should().Be(ApprenticeshipLocationType.NonNational);
        }
        public void ProcessCandidateSavedSearches(CandidateSavedSearches candidateSavedSearches)
        {
            var candidateId = candidateSavedSearches.CandidateId;

            var user = _userReadRepository.Get(candidateId);

            if (!user.IsActive())
            {
                return;
            }

            var candidate = _candidateReadRepository.Get(candidateId);

            if (!candidate.ShouldSendSavedSearchAlerts())
            {
                return;
            }

            var savedSearches = _savedSearchReadRepository.GetForCandidate(candidateId);

            if (savedSearches == null || !savedSearches.Any(s => s.AlertsEnabled))
            {
                return;
            }

            foreach (var savedSearch in savedSearches)
            {
                if (!HasGeoLocation(savedSearch))
                {
                    continue;
                }

                var searchParameters = SearchParametersFactory.Create(savedSearch);
                var searchResults    = _vacancySearchProvider.FindVacancies(searchParameters);
                var results          = searchResults.Results.ToList();

                if (results.Count == 0)
                {
                    _logService.Info("Saved search with id {0} returned no results", savedSearch.EntityId);
                    continue;
                }

                var resultsHash = results.GetResultsHash();

                if (savedSearch.LastResultsHash != resultsHash)
                {
                    _logService.Info("Saved search with id {0} returned new results", savedSearch.EntityId);

                    //Results are new
                    savedSearch.LastResultsHash = resultsHash;
                    //todo: once we have the vacancy posted date (March 2015) we may store this instead of the processed date
                    savedSearch.DateProcessed = DateTime.UtcNow;

                    if (savedSearch.AlertsEnabled)
                    {
                        var savedSearchAlert = _savedSearchAlertRepository.GetUnsentSavedSearchAlert(savedSearch) ?? new SavedSearchAlert {
                            Parameters = savedSearch
                        };
                        savedSearchAlert.Results = results;

                        _savedSearchAlertRepository.Save(savedSearchAlert);
                    }

                    _savedSearchWriteRepository.Save(savedSearch);
                }
            }
        }