public void ExecuteSearch(bool alertsEnabled)
        {
            var candidateId          = Guid.NewGuid();
            var candidateSavedSearch = new CandidateSavedSearches {
                CandidateId = candidateId
            };

            var savedSearchReadRepository = new Mock <ISavedSearchReadRepository>();

            savedSearchReadRepository.Setup(r => r.GetForCandidate(candidateId)).Returns(new Fixture().Build <SavedSearch>().With(s => s.AlertsEnabled, alertsEnabled).CreateMany(3).ToList());
            var userReadRepository = new Mock <IUserReadRepository>();

            userReadRepository.Setup(r => r.Get(candidateId)).Returns(new UserBuilder(candidateId).Activated(true).Build);
            var candidateReadRepository = new Mock <ICandidateReadRepository>();

            candidateReadRepository.Setup(r => r.Get(candidateId)).Returns(new CandidateBuilder(candidateId).EnableSavedSearchAlertsViaEmailAndText(true).Build);
            var vacancySearchProvider = new Mock <IVacancySearchProvider <ApprenticeshipSearchResponse, ApprenticeshipSearchParameters> >();
            ApprenticeshipSearchParameters searchParameters = null;

            vacancySearchProvider.Setup(p => p.FindVacancies(It.IsAny <ApprenticeshipSearchParameters>()))
            .Returns(new ApprenticeshipSearchResultsBuilder().WithResultCount(3).Build)
            .Callback <ApprenticeshipSearchParameters>(p => { searchParameters = p; });
            var processor = new SavedSearchProcessorBuilder().With(savedSearchReadRepository).With(userReadRepository).With(candidateReadRepository).With(vacancySearchProvider).Build();

            processor.ProcessCandidateSavedSearches(candidateSavedSearch);

            if (alertsEnabled)
            {
                vacancySearchProvider.Verify(sp => sp.FindVacancies(It.IsAny <ApprenticeshipSearchParameters>()), Times.Exactly(3));
                searchParameters.Should().NotBeNull();
            }
            else
            {
                vacancySearchProvider.Verify(sp => sp.FindVacancies(It.IsAny <ApprenticeshipSearchParameters>()), Times.Never);
                searchParameters.Should().BeNull();
            }
        }
        public void FindLocation(bool latLongSpecified, bool locationFound)
        {
            var candidateId          = Guid.NewGuid();
            var candidateSavedSearch = new CandidateSavedSearches {
                CandidateId = candidateId
            };

            var savedSearchReadRepository = new Mock <ISavedSearchReadRepository>();
            List <SavedSearch> savedSearches;

            if (latLongSpecified)
            {
                savedSearches = new Fixture().Build <SavedSearch>().With(s => s.AlertsEnabled, true).CreateMany(3).ToList();
            }
            else
            {
                savedSearches = new Fixture().Build <SavedSearch>()
                                .With(s => s.Latitude, null)
                                .With(s => s.Longitude, null)
                                .With(s => s.AlertsEnabled, true)
                                .CreateMany(3).ToList();
            }
            savedSearchReadRepository.Setup(r => r.GetForCandidate(candidateId)).Returns(savedSearches);
            var userReadRepository = new Mock <IUserReadRepository>();

            userReadRepository.Setup(r => r.Get(candidateId)).Returns(new UserBuilder(candidateId).Activated(true).Build);
            var candidateReadRepository = new Mock <ICandidateReadRepository>();

            candidateReadRepository.Setup(r => r.Get(candidateId)).Returns(new CandidateBuilder(candidateId).EnableSavedSearchAlertsViaEmailAndText(true).Build);
            var locationSearchService = new Mock <ILocationSearchService>();

            if (locationFound)
            {
                locationSearchService.Setup(s => s.FindLocation(It.IsAny <string>())).Returns(new Fixture().Build <Location>().CreateMany(3));
            }
            var vacancySearchProvider = new Mock <IVacancySearchProvider <ApprenticeshipSearchResponse, ApprenticeshipSearchParameters> >();
            ApprenticeshipSearchParameters searchParameters = null;

            vacancySearchProvider.Setup(p => p.FindVacancies(It.IsAny <ApprenticeshipSearchParameters>()))
            .Returns(new ApprenticeshipSearchResultsBuilder().WithResultCount(3).Build)
            .Callback <ApprenticeshipSearchParameters>(p => { searchParameters = p; });
            var savedSearchWriteRepository = new Mock <ISavedSearchWriteRepository>();
            var processor = new SavedSearchProcessorBuilder().With(savedSearchReadRepository).With(userReadRepository).With(candidateReadRepository).With(locationSearchService).With(vacancySearchProvider).With(savedSearchWriteRepository).Build();

            processor.ProcessCandidateSavedSearches(candidateSavedSearch);

            if (latLongSpecified)
            {
                locationSearchService.Verify(l => l.FindLocation(It.IsAny <string>()), Times.Never);
                savedSearchWriteRepository.Verify(p => p.Save(It.IsAny <SavedSearch>()), Times.Exactly(3));
                searchParameters.Should().NotBeNull();
                vacancySearchProvider.Verify(sp => sp.FindVacancies(It.IsAny <ApprenticeshipSearchParameters>()), Times.Exactly(3));
            }
            else
            {
                locationSearchService.Verify(l => l.FindLocation(It.IsAny <string>()), Times.Exactly(3));
                if (locationFound)
                {
                    //One save to update lat/long and one for the new results. 3 searches x 2 = 6
                    savedSearchWriteRepository.Verify(p => p.Save(It.IsAny <SavedSearch>()), Times.Exactly(6));
                    searchParameters.Should().NotBeNull();
                    vacancySearchProvider.Verify(sp => sp.FindVacancies(It.IsAny <ApprenticeshipSearchParameters>()), Times.Exactly(3));
                }
                else
                {
                    savedSearchWriteRepository.Verify(p => p.Save(It.IsAny <SavedSearch>()), Times.Never);
                    searchParameters.Should().BeNull();
                    vacancySearchProvider.Verify(sp => sp.FindVacancies(It.IsAny <ApprenticeshipSearchParameters>()), Times.Never);
                }
            }
        }