Beispiel #1
0
        public void TestDeleteSearchExecutionSharedCriteria()
        {
            // For some older searches the criteria are shared between searches and executions.

            var search = new JobAdSearch {
                Name = SearchName, Criteria = CreateCriteria(0)
            };
            var ownerId = Guid.NewGuid();

            _jobAdSearchesCommand.CreateJobAdSearch(ownerId, search);

            var execution = new JobAdSearchExecution {
                Criteria = CreateCriteria(0), Results = new JobAdSearchResults(), Context = "xxx"
            };

            _jobAdSearchesCommand.CreateJobAdSearchExecution(execution);

            UpdateCriteriaId(search.Id, execution.Criteria.Id);

            // Delete.

            _jobAdSearchesCommand.DeleteJobAdSearch(ownerId, search.Id);

            Assert.IsNull(_jobAdSearchesQuery.GetJobAdSearch(search.Id));
            AssertExecution(execution, _jobAdSearchesQuery.GetJobAdSearchExecution(execution.Id));
        }
Beispiel #2
0
        private void CreateResults(IEmployer employer, JobAdSearchExecution search, int results, bool useLongForms)
        {
            // Create jobs.

            var jobAdIds = new Guid[results];

            for (var index = 0; index < results; ++index)
            {
                var jobAd = _jobAdsCommand.PostTestJobAd(employer);

                if (useLongForms)
                {
                    jobAd.Title = LongJobTitle;
                    _locationQuery.ResolvePostalSuburb(jobAd.Description.Location, _australia, LongLocation);
                    jobAd.Description.Content = LongContent;
                    _jobAdsCommand.UpdateJobAd(jobAd);
                }

                jobAdIds[index] = jobAd.Id;
            }

            // Create the results.

            search.Results = new JobAdSearchResults {
                TotalMatches = results, JobAdIds = jobAdIds.ToList()
            };
        }
        public void TestCreateJobAdSearchExecutionWithSearchId()
        {
            // Create the search.

            var ownerId = Guid.NewGuid();
            var search  = new JobAdSearch
            {
                Criteria = CreateCriteria(0),
                Name     = SearchName,
            };

            _jobAdSearchesCommand.CreateJobAdSearch(ownerId, search);

            // Create the execution.

            var execution = new JobAdSearchExecution
            {
                Criteria   = search.Criteria.Clone(),
                Context    = "Test",
                SearcherId = Guid.NewGuid(),
                SearchId   = search.Id,
                Results    = new JobAdSearchResults
                {
                    JobAdIds = new List <Guid> {
                        Guid.NewGuid()
                    },
                    TotalMatches = 1,
                }
            };

            _jobAdSearchesCommand.CreateJobAdSearchExecution(execution);

            AssertExecution(execution, _jobAdSearchesQuery.GetJobAdSearchExecution(execution.Id));
            AssertExecution(execution, _jobAdSearchesQuery.GetJobAdSearchExecutions(execution.SearcherId.Value, 100)[0]);
        }
Beispiel #4
0
        public void TestGetJobAdSearches()
        {
            var criteria = new JobAdSearchCriteria {
                AdTitle = "jobTitle"
            };

            criteria.SetKeywords("keywords");
            var execution = new JobAdSearchExecution
            {
                SearcherId = Guid.NewGuid(),
                Criteria   = criteria,
                Context    = "AdvancedJobSearchContext",
                StartTime  = DateTime.Now.AddDays(-1),
                Results    = new JobAdSearchResults()
            };

            _jobAdSearchesCommand.CreateJobAdSearchExecution(execution);

            criteria = new JobAdSearchCriteria {
                AdTitle = "Developer"
            };
            criteria.SetKeywords("Microsoft");
            execution = new JobAdSearchExecution
            {
                SearcherId = Guid.NewGuid(),
                Criteria   = criteria,
                Context    = "AdvancedJobSearchContext",
                StartTime  = DateTime.Now.AddDays(-1),
                Results    = new JobAdSearchResults()
            };
            _jobAdSearchesCommand.CreateJobAdSearchExecution(execution);

            Assert.AreEqual(2, _jobAdSearchReportsQuery.GetJobAdSearches(DayRange.Yesterday));
        }
Beispiel #5
0
        private JobAdSearchExecution Search(JobAdSearch search, JobAdSearchAlert alert)
        {
            // Set the criteria recency to ensure only recently added jobs are included in the alert results.

            var criteria = search.Criteria.Clone();

            criteria.Recency = DateTime.Now - alert.LastRunTime;

            // Run the search as the owner.

            var member = new Member {
                Id = search.OwnerId
            };

            // Search.

            var execution = new JobAdSearchExecution
            {
                SearcherId = search.OwnerId,
                Criteria   = search.Criteria,
                Context    = "Alert",
                Results    = _executeJobAdSearchCommand.Search(member, criteria, new Range(0, MaximumResults)).Results,
            };

            // Update the last run time for next time.

            _jobAdSearchAlertsCommand.UpdateLastRunTime(search.Id, DateTime.Now);
            return(execution);
        }
Beispiel #6
0
 void IJobAdsRepository.CreateJobAdSearchExecution(JobAdSearchExecution execution, int maxResults)
 {
     using (var dc = CreateContext())
     {
         dc.JobSearchEntities.InsertOnSubmit(execution.Map(maxResults, _criteriaPersister));
         dc.SubmitChanges();
     }
 }
Beispiel #7
0
 protected static void AssertExecution(JobAdSearchExecution expectedExecution, JobAdSearchExecution execution)
 {
     Assert.AreEqual(expectedExecution.Context, execution.Context);
     Assert.AreEqual(expectedExecution.Criteria, execution.Criteria);
     Assert.AreEqual(expectedExecution.SearcherId, execution.SearcherId);
     Assert.AreEqual(expectedExecution.SearcherIp, execution.SearcherIp);
     Assert.AreEqual(expectedExecution.SearchId, execution.SearchId);
 }
Beispiel #8
0
        private void SendAlert(ICommunicationUser user, Guid savedJobSearchId, JobAdSearchExecution execution, JobAdSearchCriteria criteria, JobAdSearchCriteria originalCriteria)
        {
            if (execution == null || execution.Results == null || execution.Results.JobAdIds.Count == 0)
            {
                return;
            }

            var emailResults = CreateEmailResults(execution.Results, criteria, MaximumResults);

            if (emailResults.Count > 0)
            {
                _emailsCommand.TrySend(new JobSearchAlertEmail(user, execution.Results.JobAdIds.Count, emailResults, originalCriteria, savedJobSearchId));
            }
        }
Beispiel #9
0
 public static JobSearchEntity Map(this JobAdSearchExecution execution, int maxResults, ICriteriaPersister criteriaPersister)
 {
     return(new JobSearchEntity
     {
         id = execution.Id,
         context = execution.Context,
         startTime = execution.StartTime == null ? DateTime.Now : execution.StartTime.Value,
         duration = execution.Duration == null ? 0 : execution.Duration.Value.Ticks,
         searcherId = execution.SearcherId,
         searcherIp = execution.SearcherIp,
         savedSearchId = execution.SearchId,
         channelId = execution.ChannelId,
         appId = execution.AppId,
         JobSearchCriteriaSetEntity = execution.Criteria.MapTo <JobSearchCriteriaSetEntity, JobSearchCriteriaEntity, JobAdSearchCriteria>(criteriaPersister, true),
         JobSearchResultSetEntity = execution.Results.Map(maxResults),
     });
 }
Beispiel #10
0
        private TemplateEmail SendIt(ICommunicationUser member, JobAdSearchExecution search, bool resetLastSentTime)
        {
            var templateEmail = new JobSearchAlertEmail(member, search.Results.TotalMatches, CreateEmailResults(search.Results, search.Criteria, MaximumResults), search.Criteria, Guid.Empty);

            _emailsCommand.TrySend(templateEmail);

            if (resetLastSentTime)
            {
                // The last sent time will mean that an email might not be sent.
                // These tests are looking at  the contents so bypass that.

                var definition = _settingsQuery.GetDefinition(templateEmail.Definition);
                _settingsCommand.SetLastSentTime(member.Id, definition.Id, null);
            }

            return(templateEmail);
        }
        public void TestCreateJobAdSearchExecution()
        {
            var execution = new JobAdSearchExecution
            {
                SearcherId = Guid.NewGuid(),
                Criteria   = CreateCriteria(0),
                Context    = "Test",
                Results    = new JobAdSearchResults
                {
                    JobAdIds = new List <Guid> {
                        Guid.NewGuid()
                    },
                    TotalMatches = 1,
                }
            };

            _jobAdSearchesCommand.CreateJobAdSearchExecution(execution);

            AssertExecution(execution, _jobAdSearchesQuery.GetJobAdSearchExecution(execution.Id));
            AssertExecution(execution, _jobAdSearchesQuery.GetJobAdSearchExecutions(execution.SearcherId.Value, 100)[0]);
        }
Beispiel #12
0
        private string GetBody(string bodyTemplate, TemplateEmail templateEmail, JobAdSearchExecution search, Guid userId, bool isAnonymous)
        {
            var body = new StringBuilder(bodyTemplate);

            body.Replace("$(InsecureRootPath)", InsecureRootPath);
            body.Replace("$(ViewAllUrl)", GetTinyUrl(templateEmail, false, "~/search/jobs", new QueryStringGenerator(new JobAdSearchCriteriaConverter(_locationQuery, _industriesQuery)).GenerateQueryString(search.Criteria)));
            body.Replace("$(EditAlertsUrl)", GetTinyUrl(templateEmail, true, "~/members/searches/saved"));
            body.Replace("$(Date)", DateTime.Now.ToShortDateString());
            body.Replace("$(ManageEmailsUrl)", GetTinyUrl(templateEmail, true, "~/members/settings"));
            body.Replace("$(ContactUsUrl)", GetTinyUrl(templateEmail, false, "~/contactus"));
            body.Replace("$(UnsubscribeUrl)", isAnonymous ? GetTinyUrl(templateEmail, false, "~/members/searches/" + search.Id + "/delete") : GetTinyUrl(templateEmail, false, "~/accounts/settings/unsubscribe", "userId", userId.ToString("N"), "category", "MemberAlert"));
            body.Replace("$(TrackingUrl)", GetTrackingPixelUrl(templateEmail));

            for (var i = 0; i < search.Results.JobAdIds.Count; i++)
            {
                body.Replace("$(JobAdUrl" + i.ToString("D2") + ")",
                             GetTinyUrl(templateEmail, false, "~/jobs/" + search.Results.JobAdIds[i]));
            }

            return(body.ToString());
        }
Beispiel #13
0
        private void CreateTestSavedJobSearchAlert(IHasId <Guid> jobSearcher, string jobTitle, LocationReference location, int?distance, DateTime whenSaved)
        {
            var criteria = new JobAdSearchCriteria
            {
                AdTitle  = jobTitle,
                Location = location,
                Distance = distance
            };

            var execution = new JobAdSearchExecution {
                SearcherId = jobSearcher.Id, Criteria = criteria, Context = "Test"
            };

            execution.Results = _executeJobAdSearchCommand.Search(null, execution.Criteria, null).Results;

            _jobAdSearchesCommand.CreateJobAdSearchExecution(execution);

            var search = new JobAdSearch {
                OwnerId = jobSearcher.Id, Name = "Test Search Alert", Criteria = execution.Criteria.Clone()
            };

            _jobAdSearchAlertsCommand.CreateJobAdSearchAlert(jobSearcher.Id, search, whenSaved);
        }
Beispiel #14
0
        private JobAdSearch CreateTestSavedJobSearchAlert(Guid jobSearcherId, string jobTitle, DateTime whenSaved)
        {
            var criteria = new JobAdSearchCriteria
            {
                AdTitle = jobTitle,
            };

            var execution = new JobAdSearchExecution {
                SearcherId = jobSearcherId, Criteria = criteria, Context = "Search"
            };

            execution.Results = _executeJobAdSearchCommand.Search(null, execution.Criteria, null).Results;

            _jobAdSearchesCommand.CreateJobAdSearchExecution(execution);

            var search = new JobAdSearch {
                OwnerId = jobSearcherId, Name = "Test Search Alert", Criteria = execution.Criteria.Clone()
            };

            _jobAdSearchAlertsCommand.CreateJobAdSearchAlert(jobSearcherId, search, whenSaved);

            return(search);
        }
Beispiel #15
0
        private JobAdSearchExecution PerformJobSearchUntilYouGetResults(IHasId <Guid> searcher, JobAdSearchCriteria criteria, int expectedResultCount)
        {
            const int maxAttempts = 100;
            const int delayMs     = 500;

            // If at first you don't succeed... wait for the full-text catalog to get updated and try again!

            for (var i = 0; i < maxAttempts; i++)
            {
                var execution = new JobAdSearchExecution {
                    SearcherId = searcher == null ? (Guid?)null : searcher.Id, Criteria = criteria, Context = "Search"
                };
                execution.Results = _executeJobAdSearchCommand.Search(null, execution.Criteria, null).Results;
                if (execution.Results.TotalMatches == expectedResultCount)
                {
                    return(execution);
                }

                Thread.Sleep(delayMs);
            }

            throw new ApplicationException("The job search has not returned " + expectedResultCount + " results as expected, even after "
                                           + maxAttempts + " attempts.");
        }
Beispiel #16
0
        private void SaveSearch(SearchContext context, IHasId <Guid> member, JobAdSearchResults results, JobAdSearchCriteria criteria, int page)
        {
            try
            {
                var userAgent = HttpContext.Request.UserAgent;

                //never log monitoring calls
                if (!string.IsNullOrEmpty(userAgent) && userAgent.Contains("LinkmeMonitoring"))
                {
                    return;
                }

                var app       = ActivityContext.Channel.App;
                var execution = new JobAdSearchExecution
                {
                    Context  = context.ToString(),
                    Criteria = criteria.Clone(),
                    Results  = new JobAdSearchResults
                    {
                        JobAdIds     = page == 1 ? results.JobAdIds : new List <Guid>(),
                        TotalMatches = results.TotalMatches
                    },
                    SearcherId = member == null ? (Guid?)null : member.Id,
                    SearchId   = null,
                    ChannelId  = app.ChannelId,
                    AppId      = app.Id,
                    StartTime  = DateTime.Now,
                };

                _jobAdSearchesCommand.CreateJobAdSearchExecution(execution);
            }
            catch (Exception)
            {
                // Never fail for this.
            }
        }
Beispiel #17
0
        private void AssertMail(TemplateEmail templateEmail, ICommunicationUser member, JobAdSearchExecution search, string bodyTemplate)
        {
            var email = _emailServer.AssertEmailSent();

            // Assert addresses.

            email.AssertAddresses(Return, Return, member);
            AssertCompatibleAddresses(email);

            // Assert subject.

            email.AssertSubject(GetSubject(search.Criteria, MaximumSubjectLength));

            // Assert body.

            email.AssertHtmlViewChecks(null, false, null);
            email.AssertHtmlView(GetBody(bodyTemplate, templateEmail, search, member.Id, member.UserType == UserType.Anonymous));

            // Assert attachments.

            email.AssertNoAttachments();
        }
Beispiel #18
0
 void IJobAdSearchesCommand.CreateJobAdSearchExecution(JobAdSearchExecution execution)
 {
     execution.Prepare();
     execution.Validate();
     _repository.CreateJobAdSearchExecution(execution, MaxExecutionResults);
 }