Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    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!")
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
    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
Example #7
0
 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)
Example #8
0
 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)
Example #9
0
    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)))
Example #10
0
 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)
Example #11
0
    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
Example #12
0
 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)
Example #13
0
    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)
Example #14
0
    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)))
Example #15
0
    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)
Example #16
0
    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)
Example #17
0
    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)
Example #18
0
    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)
Example #19
0
    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)
Example #20
0
    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)
Example #21
0
    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)
Example #22
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')
Example #23
0
 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)
Example #24
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)
Example #26
0
    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')
Example #27
0
 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 = []
Example #28
0
    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)
Example #29
0
    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_unsubscribe_multiple_times(self):
        """
        We used to filter on active saved searches when unsubscribing. Removing
        that filter but only updating the database to toggle is_active to False
        if it isn't already enables users to unsubscribe from a single saved
        search multiple times.

        One example use case is if the user forgot that they unsubscribed from
        a given search already and clicks again. Previously, we would show a
        generic 404 page.
        """
        search = SavedSearchFactory(user=self.user)
        response = self.client.get(
            reverse('unsubscribe') + '?id={id_}'.format(id_=search.pk))
        self.assertEqual(response.status_code, 200)
        response = self.client.get(
            reverse('unsubscribe') + '?id={id_}'.format(id_=search.pk))
        self.assertEqual(response.status_code, 200)