diff --git a/lms/djangoapps/linkedin/management/commands/linkedin_mailusers.py b/lms/djangoapps/linkedin/management/commands/linkedin_mailusers.py index 2eb5abb897..6a81b617a9 100644 --- a/lms/djangoapps/linkedin/management/commands/linkedin_mailusers.py +++ b/lms/djangoapps/linkedin/management/commands/linkedin_mailusers.py @@ -57,16 +57,19 @@ class Command(BaseCommand): emailed = json.loads(account.emailed_courses) certificates = GeneratedCertificate.objects.filter(user=user) certificates = certificates.filter(status='downloadable') + print 'HUH?', certificates certificates = [cert for cert in certificates if cert.course_id not in emailed] + print 'DUH?', certificates if not certificates: continue + print 'WTF?', emailed if grandfather: self.send_grandfather_email(user, certificates) emailed.extend([cert.course_id for cert in certificates]) else: for certificate in certificates: - self.send_email(user, certificate) + self.send_triggered_email(user, certificate) emailed.append(certificate.course_id) account.emailed_courses = json.dumps(emailed) account.save() diff --git a/lms/djangoapps/linkedin/management/commands/tests/test_mailusers.py b/lms/djangoapps/linkedin/management/commands/tests/test_mailusers.py index 273a2459fc..7a7afa1f2e 100644 --- a/lms/djangoapps/linkedin/management/commands/tests/test_mailusers.py +++ b/lms/djangoapps/linkedin/management/commands/tests/test_mailusers.py @@ -3,119 +3,93 @@ Test email scripts. """ import json import mock -import unittest +from certificates.models import GeneratedCertificate +from django.contrib.auth.models import User +from django.test import TestCase + +from student.models import UserProfile +from linkedin.models import LinkedIn from linkedin.management.commands import linkedin_mailusers as mailusers MODULE = 'linkedin.management.commands.linkedin_mailusers.' -class MailusersTests(unittest.TestCase): +class MailusersTests(TestCase): """ Test mail users command. """ - @mock.patch(MODULE + 'send_triggered_email') - @mock.patch(MODULE + 'GeneratedCertificate') - @mock.patch(MODULE + 'LinkedIn') - def test_mail_users(self, linkedin, certificates, send_email): + def setUp(self): + courses = { + 'TEST1': mock.Mock(org='TestX', number='1'), + 'TEST2': mock.Mock(org='TestX', number='2'), + 'TEST3': mock.Mock(org='TestX', number='3'), + } + def get_course_by_id(id): + return courses.get(id) + patcher = mock.patch(MODULE + 'get_course_by_id', get_course_by_id) + patcher.start() + self.addCleanup(patcher.stop) + + self.fred = fred = User(username='fred') + fred.save() + UserProfile(user=fred, name='Fred Flintstone').save() + LinkedIn(user=fred, has_linkedin_account=True).save() + self.barney = barney = User(username='barney') + barney.save() + LinkedIn(user=barney, has_linkedin_account=True).save() + UserProfile(user=barney, name='Barney Rubble').save() + + cert1 = GeneratedCertificate( + status='downloadable', + user=fred, + course_id='TEST1') + cert1.save() + cert2 = GeneratedCertificate( + status='downloadable', + user=fred, + course_id='TEST2') + cert2.save() + cert3 = GeneratedCertificate( + status='downloadable', + user=barney, + course_id='TEST3') + cert3.save() + + def test_mail_users(self): """ Test emailing users. """ fut = mailusers.Command().handle - cert1 = mock.Mock(course_id=1) - cert2 = mock.Mock(course_id=2) - cert3 = mock.Mock(course_id=3) - fred = mock.Mock( - emailed_courses="[]", - user=mock.Mock(certificates=[cert1, cert2])) - barney = mock.Mock( - emailed_courses="[]", - user=mock.Mock(certificates=[cert3])) - linkedin.objects.filter.return_value = [fred, barney] - - def filter_user(user): - "Mock querying the database." - queryset = mock.Mock() - queryset.filter.return_value = user.certificates - return queryset - - certificates.objects.filter = filter_user fut() self.assertEqual( - send_email.call_args_list, - [((fred.user, cert1),), - ((fred.user, cert2),), - ((barney.user, cert3),)]) - self.assertEqual(json.loads(fred.emailed_courses), [1, 2]) - self.assertEqual(json.loads(barney.emailed_courses), [3]) + json.loads(self.fred.linkedin.emailed_courses), ['TEST1', 'TEST2']) + self.assertEqual( + json.loads(self.barney.linkedin.emailed_courses), ['TEST3']) - @mock.patch(MODULE + 'send_grandfather_email') - @mock.patch(MODULE + 'GeneratedCertificate') - @mock.patch(MODULE + 'LinkedIn') - def test_mail_users_grandfather(self, linkedin, certificates, send_email): + def test_mail_users_grandfather(self): """ Test sending grandfather emails. """ fut = mailusers.Command().handle - cert1 = mock.Mock(course_id=1) - cert2 = mock.Mock(course_id=2) - cert3 = mock.Mock(course_id=3) - fred = mock.Mock( - emailed_courses="[]", - user=mock.Mock(certificates=[cert1, cert2])) - barney = mock.Mock( - emailed_courses="[]", - user=mock.Mock(certificates=[cert3])) - linkedin.objects.filter.return_value = [fred, barney] - - def filter_user(user): - "Mock querying the database." - queryset = mock.Mock() - queryset.filter.return_value = user.certificates - return queryset - - certificates.objects.filter = filter_user fut(grandfather=True) self.assertEqual( - send_email.call_args_list, - [((fred.user, [cert1, cert2]),), - ((barney.user, [cert3]),)]) - self.assertEqual(json.loads(fred.emailed_courses), [1, 2]) - self.assertEqual(json.loads(barney.emailed_courses), [3]) + json.loads(self.fred.linkedin.emailed_courses), ['TEST1', 'TEST2']) + self.assertEqual( + json.loads(self.barney.linkedin.emailed_courses), ['TEST3']) - @mock.patch(MODULE + 'send_triggered_email') - @mock.patch(MODULE + 'GeneratedCertificate') - @mock.patch(MODULE + 'LinkedIn') - def test_mail_users_only_new_courses(self, linkedin, certificates, - send_email): + def test_mail_users_only_new_courses(self): """ Test emailing users, making sure they are only emailed about new certificates. """ + self.fred.linkedin.emailed_courses = json.dumps(['TEST1']) + self.fred.linkedin.save() fut = mailusers.Command().handle - cert1 = mock.Mock(course_id=1) - cert2 = mock.Mock(course_id=2) - cert3 = mock.Mock(course_id=3) - fred = mock.Mock( - emailed_courses="[1]", - user=mock.Mock(certificates=[cert1, cert2])) - barney = mock.Mock( - emailed_courses="[]", - user=mock.Mock(certificates=[cert3])) - linkedin.objects.filter.return_value = [fred, barney] - - def filter_user(user): - "Mock querying the database." - queryset = mock.Mock() - queryset.filter.return_value = user.certificates - return queryset - - certificates.objects.filter = filter_user fut() + fred = User.objects.get(username='fred') self.assertEqual( - send_email.call_args_list, - [((fred.user, cert2),), - ((barney.user, cert3),)]) - self.assertEqual(json.loads(fred.emailed_courses), [1, 2]) - self.assertEqual(json.loads(barney.emailed_courses), [3]) + json.loads(fred.linkedin.emailed_courses), ['TEST1', 'TEST2']) + self.assertEqual( + json.loads(self.barney.linkedin.emailed_courses), ['TEST3']) diff --git a/lms/envs/test.py b/lms/envs/test.py index 9577fa571a..e718cc3f71 100644 --- a/lms/envs/test.py +++ b/lms/envs/test.py @@ -257,6 +257,13 @@ XQUEUE_PORT = 8040 YOUTUBE_PORT = 8031 LTI_PORT = 8765 +############################ LinkedIn Integration ############################# +INSTALLED_APPS += ('linkedin',) +LINKEDIN_API = { + 'COMPANY_NAME': 'edX', + 'COMPANY_ID': '0000000', + 'EMAIL_FROM': 'The Team ', +} ################### Make tests faster