Commit fd1d98f7 by Chris Rossi Committed by Diana Huang

Fix tests, one bug. Adopt a more Django-ish testing style.

parent dc5dfe62
...@@ -57,16 +57,19 @@ class Command(BaseCommand): ...@@ -57,16 +57,19 @@ class Command(BaseCommand):
emailed = json.loads(account.emailed_courses) emailed = json.loads(account.emailed_courses)
certificates = GeneratedCertificate.objects.filter(user=user) certificates = GeneratedCertificate.objects.filter(user=user)
certificates = certificates.filter(status='downloadable') certificates = certificates.filter(status='downloadable')
print 'HUH?', certificates
certificates = [cert for cert in certificates certificates = [cert for cert in certificates
if cert.course_id not in emailed] if cert.course_id not in emailed]
print 'DUH?', certificates
if not certificates: if not certificates:
continue continue
print 'WTF?', emailed
if grandfather: if grandfather:
self.send_grandfather_email(user, certificates) self.send_grandfather_email(user, certificates)
emailed.extend([cert.course_id for cert in certificates]) emailed.extend([cert.course_id for cert in certificates])
else: else:
for certificate in certificates: for certificate in certificates:
self.send_email(user, certificate) self.send_triggered_email(user, certificate)
emailed.append(certificate.course_id) emailed.append(certificate.course_id)
account.emailed_courses = json.dumps(emailed) account.emailed_courses = json.dumps(emailed)
account.save() account.save()
......
...@@ -3,119 +3,93 @@ Test email scripts. ...@@ -3,119 +3,93 @@ Test email scripts.
""" """
import json import json
import mock 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 from linkedin.management.commands import linkedin_mailusers as mailusers
MODULE = 'linkedin.management.commands.linkedin_mailusers.' MODULE = 'linkedin.management.commands.linkedin_mailusers.'
class MailusersTests(unittest.TestCase): class MailusersTests(TestCase):
""" """
Test mail users command. Test mail users command.
""" """
@mock.patch(MODULE + 'send_triggered_email') def setUp(self):
@mock.patch(MODULE + 'GeneratedCertificate') courses = {
@mock.patch(MODULE + 'LinkedIn') 'TEST1': mock.Mock(org='TestX', number='1'),
def test_mail_users(self, linkedin, certificates, send_email): '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. Test emailing users.
""" """
fut = mailusers.Command().handle 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() fut()
self.assertEqual( self.assertEqual(
send_email.call_args_list, json.loads(self.fred.linkedin.emailed_courses), ['TEST1', 'TEST2'])
[((fred.user, cert1),), self.assertEqual(
((fred.user, cert2),), json.loads(self.barney.linkedin.emailed_courses), ['TEST3'])
((barney.user, cert3),)])
self.assertEqual(json.loads(fred.emailed_courses), [1, 2])
self.assertEqual(json.loads(barney.emailed_courses), [3])
@mock.patch(MODULE + 'send_grandfather_email') def test_mail_users_grandfather(self):
@mock.patch(MODULE + 'GeneratedCertificate')
@mock.patch(MODULE + 'LinkedIn')
def test_mail_users_grandfather(self, linkedin, certificates, send_email):
""" """
Test sending grandfather emails. Test sending grandfather emails.
""" """
fut = mailusers.Command().handle 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) fut(grandfather=True)
self.assertEqual( self.assertEqual(
send_email.call_args_list, json.loads(self.fred.linkedin.emailed_courses), ['TEST1', 'TEST2'])
[((fred.user, [cert1, cert2]),), self.assertEqual(
((barney.user, [cert3]),)]) json.loads(self.barney.linkedin.emailed_courses), ['TEST3'])
self.assertEqual(json.loads(fred.emailed_courses), [1, 2])
self.assertEqual(json.loads(barney.emailed_courses), [3])
@mock.patch(MODULE + 'send_triggered_email') def test_mail_users_only_new_courses(self):
@mock.patch(MODULE + 'GeneratedCertificate')
@mock.patch(MODULE + 'LinkedIn')
def test_mail_users_only_new_courses(self, linkedin, certificates,
send_email):
""" """
Test emailing users, making sure they are only emailed about new Test emailing users, making sure they are only emailed about new
certificates. certificates.
""" """
self.fred.linkedin.emailed_courses = json.dumps(['TEST1'])
self.fred.linkedin.save()
fut = mailusers.Command().handle 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() fut()
fred = User.objects.get(username='fred')
self.assertEqual(
json.loads(fred.linkedin.emailed_courses), ['TEST1', 'TEST2'])
self.assertEqual( self.assertEqual(
send_email.call_args_list, json.loads(self.barney.linkedin.emailed_courses), ['TEST3'])
[((fred.user, cert2),),
((barney.user, cert3),)])
self.assertEqual(json.loads(fred.emailed_courses), [1, 2])
self.assertEqual(json.loads(barney.emailed_courses), [3])
...@@ -257,6 +257,13 @@ XQUEUE_PORT = 8040 ...@@ -257,6 +257,13 @@ XQUEUE_PORT = 8040
YOUTUBE_PORT = 8031 YOUTUBE_PORT = 8031
LTI_PORT = 8765 LTI_PORT = 8765
############################ LinkedIn Integration #############################
INSTALLED_APPS += ('linkedin',)
LINKEDIN_API = {
'COMPANY_NAME': 'edX',
'COMPANY_ID': '0000000',
'EMAIL_FROM': 'The Team <team@test.foo>',
}
################### Make tests faster ################### Make tests faster
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment