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)); }
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]); }
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)); }
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); }
void IJobAdsRepository.CreateJobAdSearchExecution(JobAdSearchExecution execution, int maxResults) { using (var dc = CreateContext()) { dc.JobSearchEntities.InsertOnSubmit(execution.Map(maxResults, _criteriaPersister)); dc.SubmitChanges(); } }
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); }
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)); } }
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), }); }
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]); }
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()); }
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); }
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); }
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."); }
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. } }
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(); }
void IJobAdSearchesCommand.CreateJobAdSearchExecution(JobAdSearchExecution execution) { execution.Prepare(); execution.Validate(); _repository.CreateJobAdSearchExecution(execution, MaxExecutionResults); }