def setUp(self): super(PartnerSavedSearchTests, self).setUp() self.digest = SavedSearchDigestFactory(user=self.user) self.company = CompanyFactory() self.partner = PartnerFactory(owner=self.company) self.contact = ContactFactory(user=self.user, partner=self.partner) self.partner_search = PartnerSavedSearchFactory(user=self.user, created_by=self.user, provider=self.company, partner=self.partner) # Partner searches are normally created with a form, which creates # invitations as a side effect. We're not testing the form, so we # can fake an invitation here. invitation = Invitation.objects.create( invitee_email=self.partner_search.email, invitee=self.partner_search.user, inviting_user=self.partner_search.created_by, inviting_company=self.partner_search.partner.owner, added_saved_search=self.partner_search) invitation.send(self.partner_search) self.num_occurrences = lambda text, search_str: [ match.start() for match in re.finditer(search_str, text) ] # classes and ids may get stripped out when pynliner inlines css. # all jobs contain a default (blank) icon, so we can search for that if # we want a job count self.job_icon = 'http://png.nlx.org/100x50/logo.gif'
def test_requeue_weekly_saved_search(self): """ Tests that weekly saved searches are requeued correctly individually in addition to as part of a digest. """ today = datetime.date.today() two_days_ago = today.isoweekday() - 2 two_month_days_ago = today.day - 2 if two_days_ago <= 0: # Dates can't be negative or zero two_days_ago += 7 if two_month_days_ago == 0: # According to mysearches/models.py, we can't have saved searches on # the 31st. If two_month_days_ago==0, this would be the 31st. two_days_ago -= 1 digest = SavedSearchDigestFactory(user=self.user, is_active=True) search = SavedSearchFactory(user=self.user, is_active=True, frequency='W', day_of_week=two_days_ago) self.requeue(search, digest) digest.is_active = False digest.save() search.last_sent = None search.save() mail.outbox = [] self.requeue(search, digest)
def test_send_search_digest_email(self): SavedSearchDigestFactory(user=self.user) send_search_digests() self.assertEqual(len(mail.outbox), 0) self.assertEqual(SavedSearchLog.objects.count(), 1) log = SavedSearchLog.objects.get() self.assertTrue('No saved searches' in log.reason) self.assertFalse(log.was_sent) search1 = SavedSearchFactory(user=self.user) self.assertIsNone(search1.last_sent) send_search_digests() self.assertIsNotNone(SavedSearch.objects.get(pk=search1.pk).last_sent) self.assertEqual(len(mail.outbox), 1) self.assertEqual(SavedSearchLog.objects.count(), 2) log = SavedSearchLog.objects.last() self.assertTrue(log.was_sent) search2 = SavedSearchFactory(user=self.user) self.assertIsNone(search2.last_sent) send_search_digests() self.assertIsNotNone(SavedSearch.objects.get(pk=search2.pk).last_sent) self.assertEqual(len(mail.outbox), 2) self.assertEqual(SavedSearchLog.objects.count(), 3) log = SavedSearchLog.objects.last() self.assertTrue(log.was_sent) email = mail.outbox.pop() self.assertEqual(email.from_email, 'My.jobs Saved Search <*****@*****.**>') self.assertEqual(email.to, [self.user.email]) self.assertEqual(email.subject, "Your Saved Search Digest") self.assertTrue("table" in email.body) self.assertTrue(email.to[0] in email.body)
def test_requeue_monthly_saved_search(self): """ Tests that monthly saved searches are requeued correctly individually in addition to as part of a digest. """ today = datetime.date.today() two_days_ago = today.day - 2 if two_days_ago < 0: two_days_ago += 31 elif two_days_ago == 0: two_days_ago = 30 digest = SavedSearchDigestFactory(user=self.user, is_active=True) search = SavedSearchFactory(user=self.user, is_active=True, frequency='M', day_of_month=two_days_ago) self.requeue(search, digest) digest.is_active = False digest.save() search.last_sent = None search.save() mail.outbox = [] self.requeue(search, digest)
def test_send_search_digest_send_if_none(self): SavedSearchDigestFactory(user=self.user, send_if_none=True) send_search_digests() self.assertEqual(len(mail.outbox), 0) SavedSearchFactory(user=self.user) send_search_digests() self.assertEqual(len(mail.outbox), 1)
def test_saved_search_digest_no_jobs(self): self.digest = SavedSearchDigestFactory(user=self.user, is_active=True) for x in range(0, 5): SavedSearchFactory(user=self.user, feed='http://google.com') self.digest.send_email() self.assertEqual(SavedSearchLog.objects.count(), 1) log = SavedSearchLog.objects.get() self.assertTrue('saved searches have no jobs' in log.reason) self.assertFalse(log.was_sent) self.assertEqual(len(mail.outbox), 0)
def test_send_search_digest_email(self): digest = SavedSearchDigestFactory(user=self.user) digest.send_email() self.assertEqual(len(mail.outbox), 0) SavedSearchFactory(user=self.user) digest.send_email() self.assertEqual(len(mail.outbox), 1) email = mail.outbox.pop() self.assertEqual(email.from_email, settings.SAVED_SEARCH_EMAIL) self.assertEqual(email.to, [self.user.email]) self.assertEqual(email.subject, "Your Daily Saved Search Digest") self.assertTrue("table" in email.body) self.assertTrue(email.to[0] in email.body)
def test_digest_email_has_unsubscription_options(self): """ Tests the same basic functionality as the previous method but only includes two unsubscribe links. """ digest = SavedSearchDigestFactory(user=self.user) SavedSearchFactory(user=self.user) digest.send_email() self.num_emails += 1 self.assertEqual(len(mail.outbox), self.num_emails, msg=("Model {model} did not send " "an email").format( model=SavedSearchDigestFactory._meta.model)) self.assert_unsub_link(expected_num_links=2)
def test_delete_owned_searches_by_digest(self): """ Deleting with a saved search digest should result in all of the user's saved searches being deleted """ digest = SavedSearchDigestFactory(user=self.user) searches = [] for url in ['www.my.jobs/search?q=python', 'jobs.jobs/search?q=django']: searches.append(SavedSearchFactory(url=url, user=self.user)) self.assertEqual(models.SavedSearch.objects.count(), 2) response = self.client.get(reverse('delete_saved_search')+'?id=digest') self.assertEqual(models.SavedSearch.objects.count(), 0) self.assertRedirects(response, reverse( 'saved_search_main_query')+'?d=all')
def test_errors_dont_disable_searches(self): """ We should retry sending saved searches but exceeding our maximum number of retries should not disable those searches. """ self.mock_urlopen.side_effect = ValueError("bork bork bork") SavedSearchDigestFactory(user=self.user) search = SavedSearchFactory(user=self.user, feed='www.my.jobs') # Celery raises a retry that makes the test fail. In reality # everything is fine, so ignore the retry. try: send_search_digests() except RetryTaskError: pass self.assertEqual(len(mail.outbox), 0) search = SavedSearch.objects.get(pk=search.pk) self.assertTrue(search.is_active)
def test_unsubscribe_digest(self): """ Unsubscribing a saved search digest should result in all of the owner's saved searches being disabled """ digest = SavedSearchDigestFactory(user=self.user) searches = [] for url in ['www.my.jobs/search?q=python', 'jobs.jobs/search?q=django']: searches.append(SavedSearchFactory(url=url, user=self.user)) for search in searches: self.assertTrue(search.is_active) response = self.client.get(reverse('unsubscribe')+'?id=digest') searches = list(models.SavedSearch.objects.all()) for search in searches: self.assertFalse(search.is_active) self.assertTemplateUsed(response, 'mysearches/saved_search_disable.html') self.assertEqual(response.status_code, 200)
def test_send_search_email(self): SavedSearchDigestFactory(user=self.user, is_active=False) search = SavedSearchFactory(user=self.user, is_active=True, frequency='D', url='www.my.jobs/jobs?q=new+search') send_search_digests() self.assertEqual(len(mail.outbox), 1) self.assertEqual(SavedSearchLog.objects.count(), 1) log = SavedSearchLog.objects.get() self.assertTrue(log.was_sent) email = mail.outbox.pop() self.assertEqual(email.from_email, 'My.jobs Saved Search <*****@*****.**>') self.assertEqual(email.to, [self.user.email]) self.assertEqual(email.subject, search.label) self.assertTrue("table" in email.body) self.assertTrue(email.to[0] in email.body) self.assertNotEqual(email.body.find(search.url), -1, "Search url was not found in email body") self.assertTrue("Your profile is %s%% complete" % self.user.profile_completion in email.body)