From 0a5c25c6ea7659ab3ce85f74c0fc5b322e7ee126 Mon Sep 17 00:00:00 2001 From: Chris Rossi Date: Fri, 20 Dec 2013 09:56:30 -0500 Subject: [PATCH] 100% test coverage for mailusers. --- .../management/commands/linkedin_mailusers.py | 28 +++---- .../commands/tests/test_mailusers.py | 80 +++++++++++++++++-- 2 files changed, 87 insertions(+), 21 deletions(-) diff --git a/lms/djangoapps/linkedin/management/commands/linkedin_mailusers.py b/lms/djangoapps/linkedin/management/commands/linkedin_mailusers.py index 6a81b617a9..67a98e4344 100644 --- a/lms/djangoapps/linkedin/management/commands/linkedin_mailusers.py +++ b/lms/djangoapps/linkedin/management/commands/linkedin_mailusers.py @@ -57,13 +57,10 @@ 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]) @@ -86,19 +83,18 @@ class Command(BaseCommand): course.org, # Partner's name course.number, # Certificate's name 'gf' if grandfather else 'T']) - query = { - 'pfCertificationName': certificate.name, - 'pfAuthorityName': self.api.config['COMPANY_NAME'], - 'pfAuthorityId': self.api.config['COMPANY_ID'], - 'pfCertificationUrl': certificate.download_url, - 'pfLicenseNo': certificate.course_id, - 'pfCertStartDate': course.start.strftime('%Y%mI'), - 'pfCertFuture': certificate.created_date.strftime('%Y%m'), - '_mSplash': '1', - 'trk': tracking_code, - 'startTask': 'CERTIFICATION_name', - 'force': 'true', - } + query = [ + ('pfCertificationName', certificate.name), + ('pfAuthorityName', self.api.config['COMPANY_NAME']), + ('pfAuthorityId', self.api.config['COMPANY_ID']), + ('pfCertificationUrl', certificate.download_url), + ('pfLicenseNo', certificate.course_id), + ('pfCertStartDate', course.start.strftime('%Y%mI')), + ('pfCertFuture', certificate.created_date.strftime('%Y%m')), + ('_mSplash', '1'), + ('trk', tracking_code), + ('startTask', 'CERTIFICATION_NAME'), + ('force', 'true'),] return 'http://www.linkedin.com/profile/guided?' + urllib.urlencode(query) def send_grandfather_email(self, user, certificates): diff --git a/lms/djangoapps/linkedin/management/commands/tests/test_mailusers.py b/lms/djangoapps/linkedin/management/commands/tests/test_mailusers.py index 7a7afa1f2e..1018758cb2 100644 --- a/lms/djangoapps/linkedin/management/commands/tests/test_mailusers.py +++ b/lms/djangoapps/linkedin/management/commands/tests/test_mailusers.py @@ -1,11 +1,13 @@ """ Test email scripts. """ +import datetime import json import mock from certificates.models import GeneratedCertificate from django.contrib.auth.models import User +from django.core import mail from django.test import TestCase from student.models import UserProfile @@ -22,7 +24,8 @@ class MailusersTests(TestCase): def setUp(self): courses = { - 'TEST1': mock.Mock(org='TestX', number='1'), + 'TEST1': mock.Mock(org='TestX', number='1', + start=datetime.datetime(2010, 5, 12, 2, 42)), 'TEST2': mock.Mock(org='TestX', number='2'), 'TEST3': mock.Mock(org='TestX', number='3'), } @@ -32,19 +35,22 @@ class MailusersTests(TestCase): patcher.start() self.addCleanup(patcher.stop) - self.fred = fred = User(username='fred') + self.fred = fred = User(username='fred', email='fred@bedrock.gov') fred.save() UserProfile(user=fred, name='Fred Flintstone').save() LinkedIn(user=fred, has_linkedin_account=True).save() - self.barney = barney = User(username='barney') + self.barney = barney = User( + username='barney', email='barney@bedrock.gov') barney.save() LinkedIn(user=barney, has_linkedin_account=True).save() UserProfile(user=barney, name='Barney Rubble').save() - cert1 = GeneratedCertificate( + self.cert1 = cert1 = GeneratedCertificate( status='downloadable', user=fred, - course_id='TEST1') + course_id='TEST1', + name='TestX/Intro101', + download_url='http://test.foo/test') cert1.save() cert2 = GeneratedCertificate( status='downloadable', @@ -67,6 +73,28 @@ class MailusersTests(TestCase): json.loads(self.fred.linkedin.emailed_courses), ['TEST1', 'TEST2']) self.assertEqual( json.loads(self.barney.linkedin.emailed_courses), ['TEST3']) + self.assertEqual(len(mail.outbox), 3) + self.assertEqual(mail.outbox[0].from_email, 'The Team ') + self.assertEqual( + mail.outbox[0].to, ['Fred Flintstone ']) + self.assertEqual( + mail.outbox[1].to, ['Fred Flintstone ']) + self.assertEqual( + mail.outbox[2].to, ['Barney Rubble ']) + + @mock.patch.dict('django.conf.settings.LINKEDIN_API', + {'EMAIL_WHITELIST': ['barney@bedrock.gov']}) + def test_mail_users_with_whitelist(self): + """ + Test emailing users. + """ + fut = mailusers.Command().handle + fut() + self.assertEqual( + json.loads(self.barney.linkedin.emailed_courses), ['TEST3']) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual( + mail.outbox[0].to, ['Barney Rubble ']) def test_mail_users_grandfather(self): """ @@ -78,6 +106,11 @@ class MailusersTests(TestCase): json.loads(self.fred.linkedin.emailed_courses), ['TEST1', 'TEST2']) self.assertEqual( json.loads(self.barney.linkedin.emailed_courses), ['TEST3']) + self.assertEqual(len(mail.outbox), 2) + self.assertEqual( + mail.outbox[0].to, ['Fred Flintstone ']) + self.assertEqual( + mail.outbox[1].to, ['Barney Rubble ']) def test_mail_users_only_new_courses(self): """ @@ -93,3 +126,40 @@ class MailusersTests(TestCase): json.loads(fred.linkedin.emailed_courses), ['TEST1', 'TEST2']) self.assertEqual( json.loads(self.barney.linkedin.emailed_courses), ['TEST3']) + self.assertEqual(len(mail.outbox), 2) + self.assertEqual( + mail.outbox[0].to, ['Fred Flintstone ']) + self.assertEqual( + mail.outbox[1].to, ['Barney Rubble ']) + + def test_mail_users_barney_has_no_new_courses(self): + """ + Test emailing users, making sure they are only emailed about new + certificates. + """ + self.barney.linkedin.emailed_courses = json.dumps(['TEST3']) + self.barney.linkedin.save() + fut = mailusers.Command().handle + fut() + fred = User.objects.get(username='fred') + self.assertEqual( + json.loads(fred.linkedin.emailed_courses), ['TEST1', 'TEST2']) + self.assertEqual( + json.loads(self.barney.linkedin.emailed_courses), ['TEST3']) + self.assertEqual(len(mail.outbox), 2) + self.assertEqual( + mail.outbox[0].to, ['Fred Flintstone ']) + self.assertEqual( + mail.outbox[1].to, ['Fred Flintstone ']) + + def test_certificate_url(self): + self.cert1.created_date = datetime.datetime(2010, 8, 15, 0, 0) + self.cert1.save() + fut = mailusers.Command().certificate_url + self.assertEqual(fut(self.cert1), + 'http://www.linkedin.com/profile/guided?' + 'pfCertificationName=TestX%2FIntro101&pfAuthorityName=edX&' + 'pfAuthorityId=0000000&' + 'pfCertificationUrl=http%3A%2F%2Ftest.foo%2Ftest&pfLicenseNo=TEST1&' + 'pfCertStartDate=201005I&pfCertFuture=201008&_mSplash=1&' + 'trk=eml-prof-TestX-1-T&startTask=CERTIFICATION_NAME&force=true')