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_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_inactive_user_receives_saved_search(self): self.assertEqual(len(mail.outbox), 0) self.user.is_active = False self.user.save() saved_search = SavedSearchFactory(user=self.user) saved_search.send_email() self.assertEqual(len(mail.outbox), 1)
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 setUp(self): self.staff_user = UserFactory() group = Group.objects.get(name=CompanyUser.GROUP_NAME) self.staff_user.groups.add(group) self.staff_user.save() self.company = CompanyFactory() self.company.save() self.admin = CompanyUserFactory(user=self.staff_user, company=self.company) self.admin.save() self.microsite = MicrositeFactory(company=self.company) self.microsite.save() self.client = TestClient() self.client.login_user(self.staff_user) self.candidate_user = UserFactory(email="*****@*****.**") SavedSearchFactory(user=self.candidate_user, url='http://test.jobs/search?q=django', label='test Jobs') self.candidate_user.save() for i in range(5): # Create 5 new users user = UserFactory(email='*****@*****.**' % i) for search in SEARCH_OPTS: # Create 15 new searches and assign three per user SavedSearchFactory(user=user, url='http://test.jobs/search?q=%s' % search, label='%s Jobs' % search)
def test_email_contains_activate_link(self): search = SavedSearchFactory(user=self.user) self.assertTrue(self.user.is_active) search.send_email() email = mail.outbox.pop() self.assertFalse('activate your account' in email.body) self.user.is_active = False self.user.save() search.send_email() email = mail.outbox.pop() self.assertTrue('activate your account' in email.body)
def test_unicode_in_saved_search(self): """Tests that saved search urls with unicode don't cause errors.""" search = SavedSearchFactory( user=self.user, url=u"warehouse.jobs/search?location=Roswell%2C+GA&q=Delivery+I" "+%E2%80%93+Material+Handler%2FDriver+Helper+%E2%80%93+3rd" "+Shift%2C+Part-time") try: search.send_email() except UnicodeEncodeError as e: self.fail(e)
def test_send_initial_email(self): search = SavedSearchFactory(user=self.user, is_active=False, url='www.my.jobs/search?q=new+search') search.send_initial_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("My.jobs New Saved Search" in email.subject, True) self.assertTrue("table" in email.body) self.assertTrue(email.to[0] in email.body)
def test_email_profile_completion(self): search = SavedSearchFactory(user=self.user) search.send_email() self.assertEqual(len(settings.PROFILE_COMPLETION_MODULES), 6) self.assert_modules_in_hrefs(settings.PROFILE_COMPLETION_MODULES) PrimaryNameFactory(user=self.user) search.send_email() new_modules = [module for module in settings.PROFILE_COMPLETION_MODULES if module != 'name'] self.assertEqual(len(new_modules), 5) self.assert_modules_in_hrefs(new_modules)
def test_anonymous_delete_searches(self): search = SavedSearchFactory(user=self.user) Session.objects.all().delete() # Navigating to the 'delete saved search' page while logged out... response = self.client.get( reverse('delete_saved_search') + '?id=' + str(search.id)) path = response.request.get('PATH_INFO') + "?id=" + str(search.id) self.assertRedirects(response, reverse('home') + '?next=' + path) self.assertEqual(models.SavedSearch.objects.count(), 1) # or with the wrong email address... response = self.client.get( reverse('delete_saved_search') + '?id=' + str( search.id) + '&[email protected]') # results in being redirected to the login page and no searches being # deleted self.assertRedirects(response, reverse('home')) self.assertEqual(models.SavedSearch.objects.count(), 1) response = self.client.get( reverse('delete_saved_search') + '?id=%s&verify=%s' % ( search.id, self.user.user_guid)) self.assertEqual(models.SavedSearch.objects.count(), 0) # assertRedirects follows any redirect and waits for a 200 status code; # anonymous users will always redirect, never returning a 200. self.client.login_user(self.user) self.assertRedirects(response, reverse( 'saved_search_main_query') + '?d=' + str(urllib2.quote( search.label)))
def test_viewing_feed_on_bad_search(self): search = SavedSearchFactory(user=self.user, url='http://404.com', feed='http://404.com/feed/json') response = self.client.get(reverse( 'view_full_feed') + '?id=%s' % search.id) self.assertIn('The domain for this saved search is no longer valid.', response.content)
def test_widget_with_saved_search_v2(self): search = SavedSearchFactory(user=self.user) response = self.client.get(reverse('saved_search_widget') + '?url=%s&v2=1&callback=callback' % ( search.url, )) response_text = '<form class=\\"enter_email\\">' self.assertTrue(response_text in response.content)
def test_send_link_appearance(self): """ The button to manually send a saved search should not be displayed when DEBUG=False. If the url is guessed, nothing bad should happen. """ self.user.is_superuser = True self.user.save() saved_search = SavedSearchFactory(user=self.user) partner_search = PartnerSavedSearchFactory(user=self.user, created_by=self.user) ContactFactory(partner=partner_search.partner, user=self.user) for search in [saved_search, partner_search]: full_feed = reverse('view_full_feed') + '?id=%s' % search.id send_url = reverse('send_saved_search') + '?id=%s' % search.id if hasattr(search, 'partnersavedsearch'): send_url += '&is_pss=True' self.client.login_user(self.user) response = self.client.get(full_feed) self.assertNotIn('>Send</a>', response.content) send = self.client.get(send_url) self.assertEqual(send.status_code, 404) self.assertEqual(len(mail.outbox), 0) settings.DEBUG = True self.client.login_user(self.user) response = self.client.get(full_feed) self.assertIn('>Send</a>', response.content) send = self.client.get(send_url) self.assertEqual(send.status_code, 302) self.assertEqual(len(mail.outbox), 1) mail.outbox = [] settings.DEBUG = False
def test_saved_search_invitation_context(self): """ Test that creating an invitation context from a saved search instance produces a context with a message, the saved search itself, an unsent initial email, and whether that saved search is text only. """ saved_search = SavedSearchFactory(user=self.user, text_only=True) context = invitation_context(saved_search) self.assertEqual(context, { "message": " in order to begin receiving their available job " "opportunities on a regular basis.", "saved_search": saved_search, "initial_search_email": saved_search.initial_email(send=False), "text_only": saved_search.text_only})
def test_send_update_email(self): search = SavedSearchFactory(user=self.user, is_active=False, url='www.my.jobs/search?q=new+search') search.send_update_email('Your search is updated') self.assertEqual(len(mail.outbox), 1) log = SavedSearchLog.objects.get() self.assertTrue('Jobs are not sent' in log.reason) 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("My.jobs Saved Search Updated" in email.subject, True) self.assertTrue("table" in email.body) self.assertTrue("Your search is updated" in email.body) self.assertTrue(email.to[0] in email.body)
def setUp(self): super(SavedSearchSendingTests, self).setUp() self.feed = 'http://rushenterprises-veterans.jobs/alabama/usa/jobs/feed/rss' self.saved_search = SavedSearchFactory(user=self.user, feed=self.feed, frequency='D') 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, feed=self.feed, frequency='D', created_by=self.user, provider=self.company, partner=self.partner) mail.outbox = []
def test_add_or_activate_function_activates_search(self): """ Test to ensure the add_or_activate_saved_search function adds a search when provided a user and an valid URL of a search that user has and is inactive """ new_ss = SavedSearchFactory(user=self.user, is_active=False) self.assertEqual(new_ss.is_active, False, msg="New search was active. Factory did not set" " it to inactive!") count_user_searches = SavedSearch.objects.filter( user=self.user).count() self.assertEqual( count_user_searches, 1, msg="Expected 1 searches for user, got %s! Factory may" " not have created search" % count_user_searches) saved_search = add_or_activate_saved_search(self.user, new_ss.url) ss_reload = SavedSearch.objects.get() self.assertEqual(new_ss, ss_reload, msg="There was a problem reloading saved search from" "the database. Original and reload do not match!") self.assertEqual(ss_reload.is_active, True, msg="Reloaded search was inactive! Function did not" " activate it!")
def test_saved_search_new_job_indicator(self): """ Partner saved searches should include indicators for unseen jobs, while job seeker saved searches should not. """ new_job_indicator = '>New! <' search = SavedSearchFactory(user=self.user) search.send_email() search_email = mail.outbox.pop() new_jobs = self.num_occurrences(search_email.body, new_job_indicator) self.assertEqual(len(new_jobs), 0) self.partner_search.send_email() partner_search_email = mail.outbox.pop() new_jobs = self.num_occurrences(partner_search_email.body, new_job_indicator) self.assertEqual(len(new_jobs), 1)
def test_send_link_respects_permissions(self): # The send_saved_search view requires that DEBUG be enabled. settings.DEBUG = True self.user.is_superuser = True self.user.save() search = SavedSearchFactory(user=self.user) search_2 = SavedSearchFactory(user=UserFactory(email='*****@*****.**')) send_url = reverse('send_saved_search') + '?id=%s' self.assertEqual(len(mail.outbox), 0) response = self.client.get(send_url % search.pk) self.assertEqual(response.status_code, 302) self.assertEqual(len(mail.outbox), 1) response = self.client.get(send_url % search_2.pk) self.assertEqual(response.status_code, 302) self.assertEqual(len(mail.outbox), 2) settings.DEBUG = False
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_get_unsent_jobs(self): """ When sending a saved search email, we should retrieve all new jobs since last send, not all new jobs based on frequency. """ self.patcher.stop() self.patcher = patch('urllib2.urlopen', return_file(time_=datetime.datetime.now() - datetime.timedelta(days=3))) self.mock_urlopen = self.patcher.start() last_sent = datetime.datetime.now() - datetime.timedelta(days=3) search = SavedSearchFactory(frequency='D', last_sent=last_sent, user=self.user, email=self.user.email) search.send_email() self.assertEqual(len(mail.outbox), 1)
def test_widget_with_saved_search(self): search = SavedSearchFactory(user=self.user) response = self.client.get(reverse('saved_search_widget') + '?url=%s&callback=callback' % ( search.url, )) edit_url = '\\"https://secure.my.jobs%s?id=%s\\"' % ( reverse('edit_search'), search.pk) self.assertTrue(edit_url in response.content)
def test_get_unsent_jobs(self): """ When sending a saved search email, we should retrieve all new jobs since last send, not all new jobs based on frequency. """ self.patcher.stop() self.patcher = patch( 'urllib2.urlopen', return_file(time_=datetime.datetime.now() - datetime.timedelta(days=3))) self.mock_urlopen = self.patcher.start() last_sent = datetime.datetime.now() - datetime.timedelta(days=3) search = SavedSearchFactory(frequency='D', last_sent=last_sent, user=self.user, email=self.user.email) search.send_email() self.assertEqual(len(mail.outbox), 1)
def test_saved_search_invitation_context(self): """ Test that creating an invitation context from a saved search instance produces a context with a message, the saved search itself, an unsent initial email, and whether that saved search is text only. """ saved_search = SavedSearchFactory(user=self.user, text_only=True) context = invitation_context(saved_search) self.assertEqual( context, { "message": " in order to begin receiving their available job " "opportunities on a regular basis.", "saved_search": saved_search, "initial_search_email": saved_search.initial_email(send=False), "text_only": saved_search.text_only })
def test_initial_email(self): search = SavedSearchFactory(user=self.user, is_active=False, url='www.my.jobs/search?q=new+search') search.initial_email() self.assertEqual(len(mail.outbox), 1) self.assertEqual(SavedSearchLog.objects.count(), 1) log = SavedSearchLog.objects.get() self.assertTrue('Jobs are not sent' in log.reason) 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("My.jobs New Saved Search" in email.subject, True) self.assertTrue("table" in email.body) self.assertTrue(email.to[0] in email.body) # Search url appears twice - once displaying the saved search source # and once in the view link. self.assertEqual(email.body.count(search.url), 2)
def test_delete_owned_search(self): search = SavedSearchFactory(user=self.user) self.assertEqual(models.SavedSearch.objects.count(), 1) response = self.client.get( reverse('delete_saved_search')+'?id=%s' % search.id) self.assertEqual(models.SavedSearch.objects.count(), 0) self.assertRedirects(response, reverse( 'saved_search_main_query')+'?d='+str(urllib2.quote( search.label)))
def test_unsubscribe_unowned_search(self): """ Attempting to unsubscribe using a search that isn't yours should result in nothing happening to the search """ user = UserFactory(email='*****@*****.**') search = SavedSearchFactory(user=user) response = self.client.get(reverse('unsubscribe')+'?id=%s' % search.id) search = models.SavedSearch.objects.get(id=search.id) self.assertTrue(search.is_active) self.assertEqual(response.status_code, 404)
def test_delete_unowned_search(self): """ Attempting to delete a search that isn't yours should result in nothing happening to the search """ user = UserFactory(email='*****@*****.**') search = SavedSearchFactory(user=user) response = self.client.get( reverse('delete_saved_search') + '?id=%s' % search.id) self.assertEqual(models.SavedSearch.objects.count(), 1) self.assertEqual(response.status_code, 404)
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_unsubscribe_owned_search(self): """ Unsubscribing an owned saved search should result in that search being deactivated """ search = SavedSearchFactory(user=self.user) self.assertTrue(search.is_active) response = self.client.get(reverse('unsubscribe')+'?id=%s' % search.id) search = models.SavedSearch.objects.get(id=search.id) self.assertFalse(search.is_active) self.assertTemplateUsed(response, 'mysearches/saved_search_disable.html')
def test_saved_search_invitation_message(self): """ Tests that saved search invitation emails are formatted correctly. """ saved_search = SavedSearchFactory(user=self.user) invitation = InvitationFactory(inviting_user=self.user) invitation.send(saved_search) email = mail.outbox.pop() self.assertIn( "in order to begin receiving their available job " "opportunities on a regular basis", email.body)
def test_saved_search_all_jobs_link(self): search = SavedSearchFactory(user=self.user) search.send_email() email = mail.outbox.pop() # When search.url does not start with my.jobs, use it as the all jobs # link self.assertFalse(search.url.startswith('http://my.jobs')) self.assertNotEqual(email.body.find(search.url), -1) # When search.url starts with my.jobs, strip /feed/rss from search.feed # if it exists and use that as the all jobs link search.url = 'http://my.jobs/' + '1' * 32 search.save() search.send_email() email = mail.outbox.pop() self.assertEqual(email.body.find(search.url), -1) self.assertNotEqual( email.body.find(search.feed.replace('/feed/rss', '')), -1)
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().day last_week = today - 7 if last_week <= 0: last_week += 31 digest = SavedSearchDigestFactory(user=self.user, is_active=True) search = SavedSearchFactory(user=self.user, is_active=True, frequency='M', day_of_month=last_week) 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_partner_saved_search_in_digest(self): """ Saved search digests bypass the SavedSearch.send_email method. Ensure that partner saved searches are recorded when sent in a digest. """ SavedSearchFactory(user=self.user) self.assertEqual(ContactRecord.objects.count(), 1) self.digest.send_email() self.assertEqual(SavedSearchLog.objects.count(), 2) self.assertEqual(ContactRecord.objects.count(), 2) email = mail.outbox[0] self.assertFalse("Your profile is %s%% complete" % self.user.profile_completion in email.body) log = SavedSearchLog.objects.last() self.assertTrue(log.was_sent)
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 setUp(self): super(CronEventTests, self).setUp() # I'm using SavedSearch for these tests, but you can use any # model with a DateTimeField for the "*_with_field" option, and # any object for the "*_no_field" option. # It might actually be worth using additional object types # in future tests. yesterday = datetime.now() - timedelta(1) self.saved_search = SavedSearchFactory(last_sent=yesterday) model = self.saved_search._meta.model self.saved_search_contenttype = ContentType.objects.get_for_model(model) cron_kwargs = {'model': self.saved_search_contenttype} self.cron_event_no_field = factories.CronEventFactory(**cron_kwargs) cron_kwargs['field'] = 'last_sent' self.cron_event_with_field = factories.CronEventFactory(**cron_kwargs)
def test_saved_search_all_jobs_link(self): search = SavedSearchFactory(user=self.user) search.send_email() email = mail.outbox.pop() # When search.url does not start with my.jobs, use it as the all jobs # link self.assertFalse(search.url.startswith('http://my.jobs')) self.assertNotEqual(email.body.find(search.url), -1) # When search.url starts with my.jobs, strip /feed/rss from search.feed # if it exists and use that as the all jobs link search.url = 'http://my.jobs/' + '1'*32 search.save() search.send_email() email = mail.outbox.pop() self.assertEqual(email.body.find(search.url), -1) self.assertNotEqual(email.body.find(search.feed.replace('/feed/rss', '')), -1)
class SavedSearchSendingTests(MyJobsBase): def setUp(self): super(SavedSearchSendingTests, self).setUp() self.feed = 'http://rushenterprises-veterans.jobs/alabama/usa/jobs/feed/rss' self.user = UserFactory() self.saved_search = SavedSearchFactory(user=self.user, feed=self.feed, frequency='D') 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, feed=self.feed, frequency='D', created_by=self.user, provider=self.company, partner=self.partner) mail.outbox = [] @patch('urllib2.urlopen') def test_all_jobs_new(self, urlopen_mock): mock_obj = Mock() mock_obj.read.side_effect = [jobs, jobs, jobs] urlopen_mock.return_value = mock_obj three_days_ago = datetime.datetime.now() - datetime.timedelta(days=365) self.partner_search.last_sent = three_days_ago self.saved_search.last_sent = three_days_ago self.partner_search.save() self.saved_search.save() # All of the jobs were sent within the past year, so if we set # last_sent to one year ago all of the jobs should be old. self.saved_search.send_email() email = mail.outbox.pop() self.assertIn('Showing the top 3 jobs', email.body) self.partner_search.send_email() email = mail.outbox.pop() self.assertIn('Showing the top 3 jobs', email.body) @patch('urllib2.urlopen') def test_some_jobs_new(self, urlopen_mock): mock_obj = Mock() mock_obj.read.side_effect = [jobs, jobs, jobs] urlopen_mock.return_value = mock_obj three_days_ago = datetime.datetime.now() - datetime.timedelta(days=3) self.partner_search.last_sent = three_days_ago self.saved_search.last_sent = three_days_ago self.partner_search.save() self.saved_search.save() # One job was sent within the past 3 days, so if we set last_sent to # three days ago one of the jobs should be old. self.saved_search.send_email() email = mail.outbox.pop() self.assertIn('Showing the top job', email.body) self.partner_search.send_email() email = mail.outbox.pop() self.assertIn('Showing the top 3 jobs', email.body) @patch('urllib2.urlopen') def test_no_jobs_new(self, urlopen_mock): mock_obj = Mock() mock_obj.read.side_effect = [jobs, jobs, jobs] urlopen_mock.return_value = mock_obj self.partner_search.last_sent = datetime.datetime.now() self.saved_search.last_sent = datetime.datetime.now() self.partner_search.save() self.saved_search.save() # All jobs were sent over 2 days ago, so if we set last_sent to # today none of the jobs should be old. self.saved_search.send_email() self.assertEqual(len(mail.outbox), 0) self.partner_search.send_email() email = mail.outbox.pop() self.assertIn('Showing the top 3 jobs', email.body) @patch('urllib2.urlopen') def test_partner_saved_search_backfill(self, urlopen_mock): mock_obj = Mock() mock_obj.read.side_effect = [jobs, jobs, jobs, jobs, jobs, jobs] urlopen_mock.return_value = mock_obj # Make it so there should be no new jobs. self.partner_search.last_sent = datetime.datetime.now() self.partner_search.save() # jobs_per_email is default, so all 3 should get sent. self.partner_search.send_email() email = mail.outbox.pop() self.assertIn('Showing the top 3 jobs', email.body) self.partner_search.jobs_per_email = 2 self.partner_search.save() self.partner_search.send_email() email = mail.outbox.pop() self.assertIn('Showing the top 2 jobs', email.body) self.partner_search.jobs_per_email = 1 self.partner_search.save() self.partner_search.send_email() email = mail.outbox.pop() self.assertIn('Showing the top job', email.body) @patch('urllib2.urlopen') def test_no_jobs(self, urlopen_mock): mock_obj = Mock() mock_obj.read.side_effect = [no_jobs, no_jobs, no_jobs] urlopen_mock.return_value = mock_obj self.saved_search.send_email() self.assertEqual(len(mail.outbox), 0) self.partner_search.send_email() email = mail.outbox.pop() self.assertIn('There are no results for today!', email.body)
def test_saved_search_no_jobs(self): search = SavedSearchFactory(feed='http://google.com', user=self.user) search.send_email() self.assertEqual(len(mail.outbox), 0)
class CronEventTests(MyJobsBase): def setUp(self): super(CronEventTests, self).setUp() # I'm using SavedSearch for these tests, but you can use any # model with a DateTimeField for the "*_with_field" option, and # any object for the "*_no_field" option. # It might actually be worth using additional object types # in future tests. yesterday = datetime.now() - timedelta(1) self.saved_search = SavedSearchFactory(last_sent=yesterday) model = self.saved_search._meta.model self.saved_search_contenttype = ContentType.objects.get_for_model(model) cron_kwargs = {'model': self.saved_search_contenttype} self.cron_event_no_field = factories.CronEventFactory(**cron_kwargs) cron_kwargs['field'] = 'last_sent' self.cron_event_with_field = factories.CronEventFactory(**cron_kwargs) def test_cron_event_schedule_task_no_field(self): today = datetime.now().date() task = self.cron_event_no_field.schedule_task(self.saved_search) self.assertEqual(task.object_id, self.saved_search.id) self.assertEqual(task.object_model, self.saved_search_contenttype) self.assertEqual(task.related_event, self.cron_event_no_field) self.assertEqual(task.scheduled_for.date(), today) self.assertEqual(task.scheduled_at.date(), today) self.assertIsNone(task.completed_on) def test_cron_event_schedule_task_with_field(self): yesterday = (datetime.now() - timedelta(1)).date() today = datetime.now().date() task = self.cron_event_with_field.schedule_task(self.saved_search) self.assertEqual(task.object_id, self.saved_search.id) self.assertEqual(task.object_model, self.saved_search_contenttype) self.assertEqual(task.related_event, self.cron_event_with_field) self.assertEqual(task.scheduled_for.date(), yesterday) self.assertEqual(task.scheduled_at.date(), today) self.assertIsNone(task.completed_on) def test_scheduled_for_with_field(self): """ CronEvents that have an associated field should schedule from the time contained within the associated field. """ tomorrow = datetime.now() + timedelta(1) self.saved_search.last_sent = tomorrow self.saved_search.save() self.cron_event_with_field.minutes = 60*25 self.cron_event_with_field.save() should_be_scheduled_for = (tomorrow + timedelta(1)).date() task = self.cron_event_with_field.schedule_task(self.saved_search) self.assertEqual(task.scheduled_for.date(), should_be_scheduled_for) def test_scheduled_for_no_field(self): """ CronEvents that don't have an associated field should instead be scheduled based on the current time. """ self.cron_event_no_field.minutes = 60 self.cron_event_no_field.save() should_be_scheduled_for = datetime.now() + timedelta(minutes=60) should_be_scheduled_for = should_be_scheduled_for.date() task = self.cron_event_no_field.schedule_task(self.saved_search) self.assertEqual(task.scheduled_for.date(), should_be_scheduled_for)